首页
论坛
专栏
课程

继 MD5算发汇编代码[着重优化] 之后的MD5 神奇优化(欢迎高手前来指点)

2006-3-31 14:57 8160

继 MD5算发汇编代码[着重优化] 之后的MD5 神奇优化(欢迎高手前来指点)

2006-3-31 14:57
8160
;继 MD5算发汇编代码[着重优化] 之后的MD5 神奇优化(欢迎高手前来指点)

;附件:RadASM 工程的所有文件
;需要注意的是 代码优化了只优化了体积 速度却不一定快

WordToHex MACRO _lValue
        mov                eax,_lValue
        xchg        al,ah
        rol                eax,16
        xchg        al,ah
        EXITM        <eax>
ENDM

ABCD        STRUCT
        dwA                DWORD        ?
        dwB                DWORD        ?
        dwC                DWORD        ?
        dwD                DWORD        ?
ABCD ends

.const
MD5_A                EQU                067452301H
MD5_B                EQU                0EFCDAB89H
MD5_C                EQU                098BADCFEH
MD5_D                EQU                010325476H
.data?
szMd5Hex        BYTE        33        DUP        (?)
.data
stData_FS        DWORD        07,12,17,22
stData_GS        DWORD        05,09,14,20
stData_HS        DWORD        04,11,16,23
stData_IS        DWORD        06,10,15,21

stData_FC        DWORD        00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15
stData_GC        DWORD        01,06,11,00,05,10,15,04,09,14,03,08,13,02,07,12
stData_HC        DWORD        05,08,11,14,01,04,07,10,13,00,03,06,09,12,15,02
stData_IC        DWORD        00,07,14,05,12,03,10,01,08,15,06,13,04,11,02,09

stData_FF        DWORD        0D76AA478H,0E8C7B756H,0242070DBH,0C1BDCEEEH
                        DWORD        0F57C0FAFH,04787C62AH,0A8304613H,0FD469501H
                        DWORD        0698098D8H,08B44F7AFH,0FFFF5BB1H,0895CD7BEH
                        DWORD        06B901122H,0FD987193H,0A679438EH,049B40821H
                       
stData_GG        DWORD        0F61E2562H,0C040B340H,0265E5A51H,0E9B6C7AAH
                        DWORD        0D62F105DH,002441453H,0D8A1E681H,0E7D3FBC8H
                        DWORD        021E1CDE6H,0C33707D6H,0F4D50D87H,0455A14EDH
                        DWORD        0A9E3E905H,0FCEFA3F8H,0676F02D9H,08D2A4C8AH
                       
stData_HH        DWORD        0FFFA3942H,08771F681H,06D9D6122H,0FDE5380CH
                        DWORD        0A4BEEA44H,04BDECFA9H,0F6BB4B60H,0BEBFBC70H
                        DWORD        0289B7EC6H,0EAA127FAH,0D4EF3085H,004881D05H
                        DWORD        0D9D4D039H,0E6DB99E5H,01FA27CF8H,0C4AC5665H
                       
stData_II        DWORD        0F4292244H,0432AFF97H,0AB9423A7H,0FC93A039H
                        DWORD        0655B59C3H,08F0CCC92H,0FFEFF47DH,085845DD1H
                        DWORD        06FA87E4FH,0FE2CE6E0H,0A3014314H,04E0811A1H
                        DWORD        0F7537E82H,0BD3AF235H,02AD7D2BBH,0EB86D391H
szFmt        BYTE        "%08x%08x%08x%08x",0
.code
_hmemcpy        Proc uses edi esi _Dst,_Src,_Count
        mov                eax,_Count
        mov                edi,_Dst
        mov                esi,_Src
        mov                ecx,eax
        shr                ecx,02
        cld
        rep        movsd
        mov                ecx,eax
        and                ecx,03
        rep        movsb
        ret
_hmemcpy        EndP
_ConvertToWordArray        Proc uses ebx edi esi _lpData,_dwLen
        LOCAL        @dwBytes
       
        mov                esi,_lpData
        mov                ebx,_dwLen
        mov                eax,ebx
        add                eax,8
        shr                eax,6
        inc                eax
        shl                eax,4
        dec                eax
        shl                eax,2
        mov                @dwBytes,eax
        invoke        GetProcessHeap
        invoke        HeapAlloc,eax,HEAP_ZERO_MEMORY,@dwBytes
        mov                edi,eax
        invoke        _hmemcpy,edi,esi,ebx
        mov                DWORD PTR [edi+ebx],128
       
        mov                ecx,@dwBytes
        shr                ecx,2
        mov                eax,ebx
        shr                eax,29
        mov                DWORD PTR [edi+ecx*4],eax
        dec                ecx
        mov                eax,_dwLen
        shl                eax,3
        mov                DWORD PTR [edi+ecx*4],eax
        mov                eax,edi
        ret
_ConvertToWordArray endp
_MD5        Proc uses ebx edi esi _lpData,_dwLen
        LOCAL        @Count
        LOCAL        @abcd:ABCD
        LOCAL        @ABCD:ABCD
        LOCAL        @S

        invoke        _ConvertToWordArray,_lpData,_dwLen
        mov                esi,eax
        lea                edi,@abcd
        assume        edi:PTR ABCD
       
        mov                [edi].dwA,MD5_A
        mov                [edi].dwB,MD5_B
        mov                [edi].dwC,MD5_C
        mov                [edi].dwD,MD5_D
       
        mov                eax,_dwLen
        add                eax,8
        shr                eax,6
        inc                eax
        shl                eax,4
        mov                @Count,eax
    xor                edx,edx
        .While        edx<@Count
                mov                eax,[edi].dwA
                mov                @ABCD.dwA,eax
                mov                eax,[edi].dwB
                mov                @ABCD.dwB,eax
                mov                eax,[edi].dwC
                mov                @ABCD.dwC,eax
                mov                eax,[edi].dwD
                mov                @ABCD.dwD,eax
               
                xor                ebx,ebx
                .While        ebx<64
                        mov                ecx,ebx
                        and                ecx,48
                        mov                eax,ebx
                        and                eax,3
                        mov                eax,[offset stData_FS+eax*4+ecx]
                        mov                @S,eax
                       
                        mov                eax,ebx
                        shr                eax,4
                        .if                eax==0                                ;_md5_F
                                mov                eax,[edi].dwB
                                not                eax
                                and                eax,[edi].dwD
                                mov                ecx,[edi].dwB
                                and                ecx,[edi].dwC
                                or                eax,ecx
                        .elseif        eax==1                                ;_md5_G
                                mov                eax,[edi].dwD
                                not                eax
                                and                eax,[edi].dwC
                                mov                ecx,[edi].dwB
                                and                ecx,[edi].dwD
                                or                eax,ecx
                        .elseif        eax==2                                ;_md5_H
                                mov                eax,[edi].dwB
                                xor                eax,[edi].dwC
                                xor                eax,[edi].dwD
                        .elseif        eax==3                                ;_md5_I
                                mov                eax,[edi].dwD
                                not                eax
                                or                eax,[edi].dwB
                                xor                eax,[edi].dwC
                        .endif
                        mov                ecx,[offset stData_FC+ebx*4]
                        add                ecx,edx
                        add                eax,[esi+ecx*4]                                        ;x
                        add                eax,[offset stData_FF+ebx*4]        ;ac
                        add                eax,[edi].dwA                                        ;a
                        mov                ecx,@S                                                        ;s
                        rol                eax,cl
                        add                eax,[edi].dwB                                        ;b
                       
                        xchg        eax,[edi].dwB
                        xchg        eax,[edi].dwC
                        xchg        eax,[edi].dwD
                        xchg        eax,[edi].dwA
                       
                        inc                ebx
                .endw
                mov                eax,@ABCD.dwA
                add                [edi].dwA,eax
                mov                eax,@ABCD.dwB
                add                [edi].dwB,eax
                mov                eax,@ABCD.dwC
                add                [edi].dwC,eax
                mov                eax,@ABCD.dwD
                add                [edi].dwD,eax
               
                add                edx,16
        .endw
        mov                [edi].dwA,WordToHex([edi].dwA)
        mov                [edi].dwB,WordToHex([edi].dwB)
        mov                [edi].dwC,WordToHex([edi].dwC)
        mov                [edi].dwD,WordToHex([edi].dwD)
        invoke  wsprintf,offset szMd5Hex,offset szFmt,[edi].dwA,[edi].dwB,[edi].dwC,[edi].dwD
        assume        edi:Nothing
        invoke        GetProcessHeap
        invoke        HeapFree,eax,NULL,esi
        lea                eax,szMd5Hex
        ret
_MD5 endp

2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

上传的附件:
最新回复 (6)
winndy 17 2006-3-31 16:38
2
0
短小精悍
lyy159237 2006-4-3 14:59
3
0
短小精悍,好东东
moon 5 2006-5-9 20:07
4
0
这个优化好,比你上次那个在速度上应有很提高。
zigzag 2006-5-15 17:14
5
0
初学,下来学习。谢谢!
inraining 2 2006-5-16 14:25
6
0
支持~下个先
wqze 2006-5-16 17:24
7
0
顶下.......................
游客
登录 | 注册 方可回帖
返回