Оптимизация кода для md5

Тема в разделе "WASM.ASSEMBLER", создана пользователем YuraseK, 17 июл 2007.

  1. YuraseK

    YuraseK New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2004
    Сообщения:
    13
    Адрес:
    Republic of Belarus
    Оптимизировал код получения md5-хэша для строки длиной 8 байт. Производительность кода составляет 5,5 млн хэшей/c на Athlon 64 3000+ (2,6 ГГц). Функция создана для использования в Delphi. Перед вызовом функции компилятор Delphi в eax помещает указатель на начало входной строки, а в edx - указатель на 16-тибайтный выходной массив md5-хэша.
    Код (Text):
    1. type
    2.   PByteArray = ^TByteArray;
    3.   TByteArray = array[0..0] of Byte;
    4.   TMD5Digest = record
    5.     case Integer of
    6.       0: (A, B, C, D: LongInt);
    7.       1: (v: array[0..15] of Byte);
    8.     end;
    9.  
    10. function MD5Buffer8(const Input: PByteArray): TMD5Digest;
    11. asm
    12.   pushad
    13.   push edx
    14.   add esp, -4      
    15.  
    16.   mov ebp, [eax]    //x0
    17.   mov eax, [eax + 4]
    18.   mov [esp], eax    //x1
    19.  
    20.   mov eax, $67452301
    21.   mov ebx, $EFCDAB89
    22.   mov ecx, $98BADCFE
    23.   mov edx, $10325476
    24. //FF1_1
    25.   mov esi, ebx
    26.   not esi
    27.   and esi, edx
    28.   mov edi, ebx
    29.   and edi, ecx
    30.   or edi, esi
    31.   add eax, edi
    32.   add eax, $D76AA478
    33.   add eax, ebp      //x0
    34.   rol eax, 7
    35.   add eax, ebx
    36. //FF1_2
    37.   mov esi, eax
    38.   not esi
    39.   and esi, ecx
    40.   mov edi, eax
    41.   and edi, ebx
    42.   or edi, esi
    43.   add edx, edi
    44.   add edx, $E8C7B756
    45.   add edx, [esp]    //x1
    46.   rol edx, 12
    47.   add edx, eax
    48. //FF1_3
    49.   mov esi, edx
    50.   not esi
    51.   and esi, ebx
    52.   mov edi, edx
    53.   and edi, eax
    54.   or edi, esi
    55.   add ecx, edi
    56.   add ecx, $2420715B
    57.   rol ecx, 17
    58.   add ecx, edx
    59. //FF1_4
    60.   mov esi, ecx
    61.   not esi
    62.   and esi, eax
    63.   mov edi, ecx
    64.   and edi, edx
    65.   or edi, esi
    66.   add ebx, edi
    67.   add ebx, $C1BDCEEE
    68.   rol ebx, 22
    69.   add ebx, ecx
    70. //FF2_1
    71.   mov esi, ebx
    72.   not esi
    73.   and esi, edx
    74.   mov edi, ebx
    75.   and edi, ecx
    76.   or edi, esi
    77.   add eax, edi
    78.   add eax, $F57C0FAF
    79.   rol eax, 7
    80.   add eax, ebx
    81. //FF2_2
    82.   mov esi, eax
    83.   not esi
    84.   and esi, ecx
    85.   mov edi, eax
    86.   and edi, ebx
    87.   or edi, esi
    88.   add edx, edi
    89.   add edx, $4787C62A
    90.   rol edx, 12
    91.   add edx, eax
    92. //FF2_3
    93.   mov esi, edx
    94.   not esi
    95.   and esi, ebx
    96.   mov edi, edx
    97.   and edi, eax
    98.   or edi, esi
    99.   add ecx, edi
    100.   add ecx, $A8304613
    101.   rol ecx, 17
    102.   add ecx, edx
    103. //FF2_4
    104.   mov esi, ecx
    105.   not esi
    106.   and esi, eax
    107.   mov edi, ecx
    108.   and edi, edx
    109.   or edi, esi
    110.   add ebx, edi
    111.   add ebx, $FD469501
    112.   rol ebx, 22
    113.   add ebx, ecx
    114. //FF3_1
    115.   mov esi, ebx
    116.   not esi
    117.   and esi, edx
    118.   mov edi, ebx
    119.   and edi, ecx
    120.   or edi, esi
    121.   add eax, edi
    122.   add eax, $698098D8
    123.   rol eax, 7
    124.   add eax, ebx
    125. //FF3_2
    126.   mov esi, eax
    127.   not esi
    128.   and esi, ecx
    129.   mov edi, eax
    130.   and edi, ebx
    131.   or edi, esi
    132.   add edx, edi
    133.   add edx, $8B44F7AF
    134.   rol edx, 12
    135.   add edx, eax
    136. //FF3_3
    137.   mov esi, edx
    138.   not esi
    139.   and esi, ebx
    140.   mov edi, edx
    141.   and edi, eax
    142.   or edi, esi
    143.   add ecx, edi
    144.   add ecx, $FFFF5BB1
    145.   rol ecx, 17
    146.   add ecx, edx
    147. //FF3_4
    148.   mov esi, ecx
    149.   not esi
    150.   and esi, eax
    151.   mov edi, ecx
    152.   and edi, edx
    153.   or edi, esi
    154.   add ebx, edi
    155.   add ebx, $895CD7BE
    156.   rol ebx, 22
    157.   add ebx, ecx
    158. //FF4_1
    159.   mov esi, ebx
    160.   not esi
    161.   and esi, edx
    162.   mov edi, ebx
    163.   and edi, ecx
    164.   or edi, esi
    165.   add eax, edi
    166.   add eax, $6B901122
    167.   rol eax, 7
    168.   add eax, ebx
    169. //FF4_2
    170.   mov esi, eax
    171.   not esi
    172.   and esi, ecx
    173.   mov edi, eax
    174.   and edi, ebx
    175.   or edi, esi
    176.   add edx, edi
    177.   add edx, $FD987193
    178.   rol edx, 12
    179.   add edx, eax
    180. //FF4_3
    181.   mov esi, edx
    182.   not esi
    183.   and esi, ebx
    184.   mov edi, edx
    185.   and edi, eax
    186.   or edi, esi
    187.   add ecx, edi
    188.   add ecx, $A67943CE
    189.   rol ecx, 17
    190.   add ecx, edx
    191. //FF4_4
    192.   mov esi, ecx
    193.   not esi
    194.   and esi, eax
    195.   mov edi, ecx
    196.   and edi, edx
    197.   or edi, esi
    198.   add ebx, edi
    199.   add ebx, $49B40821
    200.   rol ebx, 22
    201.   add ebx, ecx
    202. //GG1_1
    203.   mov esi, edx
    204.   not esi
    205.   and esi, ecx
    206.   mov edi, ebx
    207.   and edi, edx
    208.   or edi, esi
    209.   add eax, edi
    210.   add eax, $F61E2562
    211.   add eax, [esp]      //x1
    212.   rol eax, 5
    213.   add eax, ebx
    214. //GG1_2
    215.   mov esi, ecx
    216.   not esi
    217.   and esi, ebx
    218.   mov edi, eax
    219.   and edi, ecx
    220.   or edi, esi
    221.   add edx, edi
    222.   add edx, $C040B340
    223.   rol edx, 9
    224.   add edx, eax
    225. //GG1_3
    226.   mov esi, ebx
    227.   not esi
    228.   and esi, eax
    229.   mov edi, edx
    230.   and edi, ebx
    231.   or edi, esi
    232.   add ecx, edi
    233.   add ecx, $265E5A51
    234.   rol ecx, 14
    235.   add ecx, edx
    236. //GG1_4
    237.   mov esi, eax
    238.   not esi
    239.   and esi, edx
    240.   mov edi, ecx
    241.   and edi, eax
    242.   or edi, esi
    243.   add ebx, edi
    244.   add ebx, $E9B6C7AA
    245.   add ebx, ebp        //x0
    246.   rol ebx, 20
    247.   add ebx, ecx
    248. //GG2_1
    249.   mov esi, edx
    250.   not esi
    251.   and esi, ecx
    252.   mov edi, ebx
    253.   and edi, edx
    254.   or edi, esi
    255.   add eax, edi
    256.   add eax, $D62F105D
    257.   rol eax, 5
    258.   add eax, ebx
    259. //GG2_2
    260.   mov esi, ecx
    261.   not esi
    262.   and esi, ebx
    263.   mov edi, eax
    264.   and edi, ecx
    265.   or edi, esi
    266.   add edx, edi
    267.   add edx, $02441453
    268.   rol edx, 9
    269.   add edx, eax
    270. //GG2_3
    271.   mov esi, ebx
    272.   not esi
    273.   and esi, eax
    274.   mov edi, edx
    275.   and edi, ebx
    276.   or edi, esi
    277.   add ecx, edi
    278.   add ecx, $D8A1E681
    279.   rol ecx, 14
    280.   add ecx, edx
    281. //GG2_4
    282.   mov esi, eax
    283.   not esi
    284.   and esi, edx
    285.   mov edi, ecx
    286.   and edi, eax
    287.   or edi, esi
    288.   add ebx, edi
    289.   add ebx, $E7D3FBC8
    290.   rol ebx, 20
    291.   add ebx, ecx
    292. //GG3_1
    293.   mov esi, edx
    294.   not esi
    295.   and esi, ecx
    296.   mov edi, ebx
    297.   and edi, edx
    298.   or edi, esi
    299.   add eax, edi
    300.   add eax, $21E1CDE6
    301.   rol eax, 5
    302.   add eax, ebx
    303. //GG3_2
    304.   mov esi, ecx
    305.   not esi
    306.   and esi, ebx
    307.   mov edi, eax
    308.   and edi, ecx
    309.   or edi, esi
    310.   add edx, edi
    311.   add edx, $C3370816
    312.   rol edx, 9
    313.   add edx, eax
    314. //GG3_3
    315.   mov esi, ebx
    316.   not esi
    317.   and esi, eax
    318.   mov edi, edx
    319.   and edi, ebx
    320.   or edi, esi
    321.   add ecx, edi
    322.   add ecx, $F4D50D87
    323.   rol ecx, 14
    324.   add ecx, edx
    325. //GG3_4
    326.   mov esi, eax
    327.   not esi
    328.   and esi, edx
    329.   mov edi, ecx
    330.   and edi, eax
    331.   or edi, esi
    332.   add ebx, edi
    333.   add ebx, $455A14ED
    334.   rol ebx, 20
    335.   add ebx, ecx
    336. //GG4_1
    337.   mov esi, edx
    338.   not esi
    339.   and esi, ecx
    340.   mov edi, ebx
    341.   and edi, edx
    342.   or edi, esi
    343.   add eax, edi
    344.   add eax, $A9E3E905
    345.   rol eax, 5
    346.   add eax, ebx
    347. //GG4_2
    348.   mov esi, ecx
    349.   not esi
    350.   and esi, ebx
    351.   mov edi, eax
    352.   and edi, ecx
    353.   or edi, esi
    354.   add edx, edi
    355.   add edx, $FCEFA478
    356.   rol edx, 9
    357.   add edx, eax
    358. //GG4_3
    359.   mov esi, ebx
    360.   not esi
    361.   and esi, eax
    362.   mov edi, edx
    363.   and edi, ebx
    364.   or edi, esi
    365.   add ecx, edi
    366.   add ecx, $676F02D9
    367.   rol ecx, 14
    368.   add ecx, edx
    369. //GG4_4
    370.   mov esi, eax
    371.   not esi
    372.   and esi, edx
    373.   mov edi, ecx
    374.   and edi, eax
    375.   or edi, esi
    376.   add ebx, edi
    377.   add ebx, $8D2A4C8A
    378.   rol ebx, 20
    379.   add ebx, ecx
    380. //HH1_1
    381.   mov edi, ebx
    382.   xor edi, ecx
    383.   xor edi, edx
    384.   add eax, edi
    385.   add eax, $FFFA3942
    386.   rol eax, 4
    387.   add eax, ebx
    388. //HH1_2
    389.   mov edi, eax
    390.   xor edi, ebx
    391.   xor edi, ecx
    392.   add edx, edi
    393.   add edx, $8771F681
    394.   rol edx, 11
    395.   add edx, eax
    396. //HH1_3
    397.   mov edi, edx
    398.   xor edi, eax
    399.   xor edi, ebx
    400.   add ecx, edi
    401.   add ecx, $6D9D6122
    402.   rol ecx, 16
    403.   add ecx, edx
    404. //HH1_4
    405.   mov edi, ecx
    406.   xor edi, edx
    407.   xor edi, eax
    408.   add ebx, edi
    409.   add ebx, $FDE5384C
    410.   rol ebx, 23
    411.   add ebx, ecx
    412. //HH2_1
    413.   mov edi, ebx
    414.   xor edi, ecx
    415.   xor edi, edx
    416.   add eax, edi
    417.   add eax, $A4BEEA44
    418.   add eax, [esp]      //x1
    419.   rol eax, 4
    420.   add eax, ebx
    421. //HH2_2
    422.   mov edi, eax
    423.   xor edi, ebx
    424.   xor edi, ecx
    425.   add edx, edi
    426.   add edx, $4BDECFA9
    427.   rol edx, 11
    428.   add edx, eax
    429. //HH2_3
    430.   mov edi, edx
    431.   xor edi, eax
    432.   xor edi, ebx
    433.   add ecx, edi
    434.   add ecx, $F6BB4B60
    435.   rol ecx, 16
    436.   add ecx, edx
    437. //HH2_4
    438.   mov edi, ecx
    439.   xor edi, edx
    440.   xor edi, eax
    441.   add ebx, edi
    442.   add ebx, $BEBFBC70
    443.   rol ebx, 23
    444.   add ebx, ecx
    445. //HH3_1
    446.   mov edi, ebx
    447.   xor edi, ecx
    448.   xor edi, edx
    449.   add eax, edi
    450.   add eax, $289B7EC6
    451.   rol eax, 4
    452.   add eax, ebx
    453. //HH3_2
    454.   mov edi, eax
    455.   xor edi, ebx
    456.   xor edi, ecx
    457.   add edx, edi
    458.   add edx, $EAA127FA
    459.   add edx, ebp        //x0
    460.   rol edx, 11
    461.   add edx, eax
    462. //HH3_3
    463.   mov edi, edx
    464.   xor edi, eax
    465.   xor edi, ebx
    466.   add ecx, edi
    467.   add ecx, $D4EF3085
    468.   rol ecx, 16
    469.   add ecx, edx
    470. //HH3_4
    471.   mov edi, ecx
    472.   xor edi, edx
    473.   xor edi, eax
    474.   add ebx, edi
    475.   add ebx, $04881D05
    476.   rol ebx, 23
    477.   add ebx, ecx
    478. //HH4_1
    479.   mov edi, ebx
    480.   xor edi, ecx
    481.   xor edi, edx
    482.   add eax, edi
    483.   add eax, $D9D4D039
    484.   rol eax, 4
    485.   add eax, ebx
    486. //HH4_2
    487.   mov edi, eax
    488.   xor edi, ebx
    489.   xor edi, ecx
    490.   add edx, edi
    491.   add edx, $E6DB99E5
    492.   rol edx, 11
    493.   add edx, eax
    494. //HH4_3
    495.   mov edi, edx
    496.   xor edi, eax
    497.   xor edi, ebx
    498.   add ecx, edi
    499.   add ecx, $1FA27CF8
    500.   rol ecx, 16
    501.   add ecx, edx
    502. //HH4_4
    503.   mov edi, ecx
    504.   xor edi, edx
    505.   xor edi, eax
    506.   add ebx, edi
    507.   add ebx, $C4AC56E5
    508.   rol ebx, 23
    509.   add ebx, ecx
    510. //II1_1
    511.   mov edi, edx
    512.   not edi
    513.   or edi, ebx
    514.   xor edi, ecx
    515.   add eax, edi
    516.   add eax, $F4292244
    517.   add eax, ebp        //x0
    518.   rol eax, 6
    519.   add eax, ebx
    520. //II1_2
    521.   mov edi, ecx
    522.   not edi
    523.   or edi, eax
    524.   xor edi, ebx
    525.   add edx, edi
    526.   add edx, $432AFF97
    527.   rol edx, 10
    528.   add edx, eax
    529. //II1_3
    530.   mov edi, ebx
    531.   not edi
    532.   or edi, edx
    533.   xor edi, eax
    534.   add ecx, edi
    535.   add ecx, $AB9423E7
    536.   rol ecx, 15
    537.   add ecx, edx
    538. //II1_4
    539.   mov edi, eax
    540.   not edi
    541.   or edi, ecx
    542.   xor edi, edx
    543.   add ebx, edi
    544.   add ebx, $FC93A039
    545.   rol ebx, 21
    546.   add ebx, ecx
    547. //II2_1
    548.   mov edi, edx
    549.   not edi
    550.   or edi, ebx
    551.   xor edi, ecx
    552.   add eax, edi
    553.   add eax, $655B59C3
    554.   rol eax, 6
    555.   add eax, ebx
    556. //II2_2
    557.   mov edi, ecx
    558.   not edi
    559.   or edi, eax
    560.   xor edi, ebx
    561.   add edx, edi
    562.   add edx, $8F0CCC92
    563.   rol edx, 10
    564.   add edx, eax
    565. //II2_3
    566.   mov edi, ebx
    567.   not edi
    568.   or edi, edx
    569.   xor edi, eax
    570.   add ecx, edi
    571.   add ecx, $FFEFF47D
    572.   rol ecx, 15
    573.   add ecx, edx
    574. //II2_4
    575.   mov edi, eax
    576.   not edi
    577.   or edi, ecx
    578.   xor edi, edx
    579.   add ebx, edi
    580.   add ebx, $85845DD1
    581.   add ebx, [esp]      //x1
    582.   rol ebx, 21
    583.   add ebx, ecx
    584. //II3_1
    585.   mov edi, edx
    586.   not edi
    587.   or edi, ebx
    588.   xor edi, ecx
    589.   add eax, edi
    590.   add eax, $6FA87E4F
    591.   rol eax, 6
    592.   add eax, ebx
    593. //II3_2
    594.   mov edi, ecx
    595.   not edi
    596.   or edi, eax
    597.   xor edi, ebx
    598.   add edx, edi
    599.   add edx, $FE2CE6E0
    600.   rol edx, 10
    601.   add edx, eax
    602. //II3_3
    603.   mov edi, ebx
    604.   not edi
    605.   or edi, edx
    606.   xor edi, eax
    607.   add ecx, edi
    608.   add ecx, $A3014314
    609.   rol ecx, 15
    610.   add ecx, edx
    611. //II3_4
    612.   mov edi, eax
    613.   not edi
    614.   or edi, ecx
    615.   xor edi, edx
    616.   add ebx, edi
    617.   add ebx, $4E0811A1
    618.   rol ebx, 21
    619.   add ebx, ecx
    620. //II4_1
    621.   mov edi, edx
    622.   not edi
    623.   or edi, ebx
    624.   xor edi, ecx
    625.   add eax, edi
    626.   add eax, $F7537E82
    627.   rol eax, 6
    628.   add eax, ebx
    629. //II4_2
    630.   mov edi, ecx
    631.   not edi
    632.   or edi, eax
    633.   xor edi, ebx
    634.   add edx, edi
    635.   add edx, $BD3AF235
    636.   rol edx, 10
    637.   add edx, eax
    638. //II4_3
    639.   mov edi, ebx
    640.   not edi
    641.   or edi, edx
    642.   xor edi, eax
    643.   add ecx, edi
    644.   add ecx, $2AD7D33B
    645.   rol ecx, 15
    646.   add ecx, edx
    647. //II4_4
    648.   mov edi, eax
    649.   not edi
    650.   or edi, ecx
    651.   xor edi, edx
    652.   add ebx, edi
    653.   add ebx, $EB86D391
    654.   rol ebx, 21
    655.   add ebx, ecx
    656.  
    657.   add eax, $67452301
    658.   add ebx, $EFCDAB89
    659.   add ecx, $98BADCFE
    660.   add edx, $10325476
    661.  
    662.   add esp, 4
    663.  
    664.   pop edi
    665.   mov [edi], eax
    666.   mov [edi + 4], ebx
    667.   mov [edi + 8], ecx
    668.   mov [edi + 12], edx
    669.  
    670.   popad
    671. end;
    Реально ли здесь ещё чего оптимизировать или это предел?
     
  2. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    А какой смысл в MD5 (128 bits secure hash) от 8 байт (64 бита) ?
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    пароли перебирать
    насчет оптимизации - выравнивание кода и данных, перестановка инструкций. читай маны по оптимизации от интела :)
     
  4. Manonegro

    Manonegro New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    1
    Есть такая программулина - PasswordsPro.
    Если порыться в коде - там еще лучше оптимизация.
    Проверял.