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 ;************************************************* |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏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.