24小时热门版块排行榜    

查看: 433  |  回复: 0
当前主题已经存档。

sdlj8051

金虫 (著名写手)

[交流] MD5算法汇编代码[着重优化]

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("%08x%08x%08x%08x",@a,@b1,@c,@d
  lea    eax,stMd5Hex
  ret
_Md5 endp
;*************************************************

[ Last edited by 幻影无痕 on 2006-10-17 at 10:19 ]
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 sdlj8051 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见