24小时热门版块排行榜    

查看: 443  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 299求调剂 +5 某某某某位 2026-03-21 5/250 2026-03-23 23:36 by 热情沙漠
[考研] 一志愿国科过程所081700,274求调剂 +3 三水研0水立方 2026-03-23 3/150 2026-03-23 23:11 by MajorWen
[考研] 335分 | 材料与化工专硕 | GPA 4.07 | 有科研经历 +4 cccchenso 2026-03-23 4/200 2026-03-23 23:00 by 徐ckkk
[考研] 一志愿中南大学化学学硕0703总分337求调剂 +5 niko- 2026-03-22 5/250 2026-03-23 22:01 by fuyu_
[考研] 材料专硕英一数二306 +8 z1z2z3879 2026-03-18 8/400 2026-03-23 20:49 by baobaoye
[考研] 0703化学求调剂 +4 奶油草莓. 2026-03-22 5/250 2026-03-23 19:37 by pswait
[考研] 350求调剂 +6 weudhdk 2026-03-19 6/300 2026-03-23 15:47 by tangyuan0840221
[考研] 0854电子信息求调剂 324 +3 Promise-jyl 2026-03-23 3/150 2026-03-23 13:43 by wangkm
[考研] 263求调剂 +6 yqdszhdap- 2026-03-22 9/450 2026-03-23 12:57 by yqdszhdap-
[考研] 307求调剂 +3 余意卿 2026-03-21 3/150 2026-03-23 10:32 by Iveryant
[考研] 070300,一志愿北航320求调剂 +3 Jerry0216 2026-03-22 5/250 2026-03-23 09:16 by 。。堂堂
[考研] 276求调剂 +3 YNRYG 2026-03-21 4/200 2026-03-23 08:31 by 醉在风里
[考研] 求调剂院校信息 +6 CX 330 2026-03-21 6/300 2026-03-22 15:25 by 无懈可击111
[考研] 303求调剂 +5 安忆灵 2026-03-22 6/300 2026-03-22 12:46 by 素颜倾城1988
[考研] 0703化学调剂 +4 妮妮ninicgb 2026-03-21 4/200 2026-03-21 18:39 by 学员8dgXkO
[考研] 求调剂 +6 Mqqqqqq 2026-03-19 6/300 2026-03-21 08:04 by JourneyLucky
[考研] 材料工程(专)一志愿985 初试335求调剂 +3 hiloiy 2026-03-17 4/200 2026-03-21 03:04 by JourneyLucky
[考研] 329求调剂 +9 想上学吖吖 2026-03-19 9/450 2026-03-20 22:01 by luoyongfeng
[考博] 申博26年 +3 八6八68 2026-03-19 3/150 2026-03-19 19:43 by nxgogo
[考研] 0703化学调剂 +4 18889395102 2026-03-18 4/200 2026-03-19 16:13 by 30660438
信息提示
请填处理意见