找回密码
 注册
搜索
热搜: 回贴

MD5算法汇编代码[着重优化] ,MD5,加密算法

2010-1-22 18:38| 发布者: admin| 查看: 79| 评论: 0|原作者: 云天河


MD5算法汇编代码[着重优化] ,MD5,加密算法
2008年06月22日 星期日 下午 11:57
本人处于热情学习中 今日初次发贴 错误之处希望大哥哥们严正指出 ~~先谢谢了

MD5算发的汇编实现 并简单的优化 将原来的几个简单点的函数用几条命令代理了~~

将有些的重复代码 使用了循环



使程序看起来不是那么长了 :)

抛砖引玉 我总觉的M5D的算发可以用汇编很简单的实现

希望高手们不吝赐教



原因是

@b1-@a=0EFCDAB89H-67452301H=88888888H

@c -@d=098BADCFEH-10325476H=88888888H



;*************************************************

MAND Macro M1,M2

mov eax,M1

and eax,M2

EXITM

ENDM

MXOR Macro M1,M2

mov eax,M1

xor eax,M2

EXITM

endm

MADD Macro M1,M2

mov eax,M1

add eax,M2

EXITM

ENDM

SWAP Macro M1,M2

push M1

push M2

pop M1

pop M2

endm

Mcopy MACRO lpSource,lpDest,len

mov esi, lpSource

mov edi, lpDest

mov ecx, len

rep movsb

ENDM

WordToHex MACRO _lValue

mov eax,_lValue

xchg al,ah

rol eax,16

xchg al,ah

EXITM

ENDM

.const

.data?

stMd5Hex DB 33 DUP (?)

.data

szData_SS DWORD 7,12,17,22

DWORD 5,9,14,20

DWORD 4,11,16,23

DWORD 6,10,15,21



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

.code





_md5_FF Proc uses ecx _a, _b, _c, _d, _x, _s, _ac

mov eax,_b

and eax,_c

mov ecx,_b

not ecx

and ecx,_d

or eax,ecx



add eax,_a

add eax,_x

add eax,_ac

mov ecx,_s

rol eax,cl

add eax,_b

ret

_md5_FF endp

_md5_GG Proc uses ecx _a,_b,_c,_d,_x,_s,_ac

mov eax,_b

and eax,_d

mov ecx,_d

not ecx

and ecx,_c

or eax,ecx



add eax,_a

add eax,_x

add eax,_ac

mov ecx,_s

rol eax,cl

add eax,_b

ret

_md5_GG EndP

_md5_HH Proc uses ecx _a,_b,_c,_d,_x,_s,_ac

mov eax,_b

xor eax,_c

xor eax,_d



add eax,_a

add eax,_x

add eax,_ac

mov ecx,_s

rol eax,cl

add eax,_b

ret

_md5_HH EndP



_md5_II Proc uses ecx _a,_b,_c,_d,_x,_s,_ac

mov eax,_d

not eax

or eax,_b

xor eax,_c



add eax,_a

add eax,_x

add eax,_ac

mov ecx,_s

rol eax,cl

add eax,_b

ret

_md5_II EndP

_ConvertToWordArray Proc uses edi esi ecx _lpData,_dwLen

LOCAL @lWordArray,@lNumberOfWords



mov eax,_dwLen

add eax,8

shr eax,6

inc eax

shl eax,4

dec eax

shl eax,2

mov @lNumberOfWords,eax

invoke VirtualAlloc,NULL,@lNumberOfWords,MEM_COMMIT,PAGE_READWRITE

mov @lWordArray,eax

mov edi,eax

invoke RtlZeroMemory,@lWordArray,@lNumberOfWords

mov esi,_lpData

Mcopy _lpData,@lWordArray,_dwLen

mov eax,128

stosd

mov edi,@lWordArray

mov ecx,@lNumberOfWords

shr ecx,2

mov eax,_dwLen

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,@lWordArray

ret

_ConvertToWordArray endp

;###############################################

; 主程序

; _lpData 需要加密的数据指针

; _dwLen 需要加密的数据长度

; 返回值 MD5文本指针

;###############################################

_Md5 Proc uses edi ebx ecx edx _lpData,_dwLen

LOCAL @a,@b1,@c,@d

LOCAL @AA,@BB,@CC,@DD

LOCAL @lNumber



invoke _ConvertToWordArray,_lpData,_dwLen

mov edi,eax



mov @a,67452301H

mov @b1,0EFCDAB89H

mov @c,98BADCFEH

mov @d,10325476H



mov eax,_dwLen

add eax,8

shr eax,6

inc eax

shl eax,4

dec eax

mov @lNumber,eax



xor ebx,ebx

.While ebx<=@lNumber

push @a

pop @AA

push @b1

pop @BB

push @c

pop @CC

push @d

pop @DD



push ebx

push edi

lea ebx,[ebx*4]

add edi,ebx

xor ebx,ebx

.While ebx<16

mov ecx,ebx

shl ecx,30

shr ecx,30

mov eax,[edi ebx*4]

invoke _md5_FF,@a,@b1,@c,@d,eax,szData_SS[ecx*4],stData_FF[ebx*4]

mov @a,eax

SWAP @a,@d

SWAP @b1,@d

SWAP @c,@d

inc ebx

.endw

xor ebx,ebx

mov edx,ebx

inc dl

.While ebx<16

mov ecx,ebx

shl ecx,30

shr ecx,30



mov eax,[edi edx*4]

invoke _md5_GG,@a,@b1,@c,@d,eax,szData_SS[ecx*4 16],stData_GG[ebx*4]

mov @a,eax

SWAP @a,@d

SWAP @b1,@d

SWAP @c,@d

add dl,5

shl dl,4

shr dl,4

inc ebx

.endw

xor ebx,ebx

mov edx,5

.While ebx<16

mov ecx,ebx

shl ecx,30

shr ecx,30



mov eax,[edi edx*4]

invoke _md5_HH,@a,@b1,@c,@d,eax,szData_SS[ecx*4 32],stData_HH[ebx*4]

mov @a,eax

SWAP @a,@d

SWAP @b1,@d

SWAP @c,@d

add edx,3

shl dl,4

shr dl,4

inc ebx

.endw

xor ebx,ebx

mov edx,ebx

.While ebx<16

mov ecx,ebx

shl ecx,30

shr ecx,30



mov eax,[edi edx*4]

invoke _md5_II,@a,@b1,@c,@d,eax,szData_SS[ecx*4 48],stData_II[ebx*4]

mov @a,eax

SWAP @a,@d

SWAP @b1,@d

SWAP @c,@d

add edx,7

shl dl,4

shr dl,4

inc ebx

.endw

pop edi

pop ebx



mov @a,MADD(@a,@AA)

mov @b1,MADD(@b1,@BB)

mov @c,MADD(@c,@CC)

mov @d,MADD(@d,@DD)

add ebx,16

.EndW



mov @a,WordToHex(@a)

mov @b1,WordToHex(@b1)

mov @c,WordToHex(@c)

mov @d,WordToHex(@d)



invoke wsprintf,addr stMd5Hex,SADD(" x x x x"),@a,@b1,@c,@d

lea eax,stMd5Hex

ret

_Md5 endp

;*************************************************


最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 03:23 , Processed in 0.205744 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部