24小时热门版块排行榜    

查看: 444  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 材料调剂 +5 匹克i 2026-03-23 5/250 2026-03-24 08:50 by dick_runner
[考研] 一志愿国科过程所081700,274求调剂 +3 三水研0水立方 2026-03-23 3/150 2026-03-23 23:11 by MajorWen
[考研] 一志愿重庆大学085700资源与环境,总分308求调剂 +7 墨墨漠 2026-03-23 8/400 2026-03-23 20:36 by Creta
[考研] 336化工调剂 +4 王大坦1 2026-03-23 5/250 2026-03-23 18:32 by allen-yin
[考研] 求调剂一志愿武汉理工大学材料工程(085601) +3 WW.' 2026-03-23 5/250 2026-03-23 17:18 by 枫翼ljj
[考研] 招08考数学 +6 laoshidan 2026-03-20 14/700 2026-03-23 14:37 by 15614359529
[考研] 280分求调剂 一志愿085802 +4 PUMPT 2026-03-22 7/350 2026-03-22 22:13 by 星空星月
[考研] 一志愿华中农业071010,总分320求调剂 +5 困困困困坤坤 2026-03-20 6/300 2026-03-22 17:41 by hxsm
[考研] 寻找调剂 +4 倔强芒? 2026-03-21 4/200 2026-03-22 16:14 by 木托莫露露
[考研] 285求调剂 +6 ytter 2026-03-22 6/300 2026-03-22 12:09 by 星空星月
[考研] 354求调剂 +7 Tyoumou 2026-03-18 10/500 2026-03-22 11:11 by 人来盛
[考研] 材料学硕301分求调剂 +7 Liyouyumairs 2026-03-21 7/350 2026-03-21 22:31 by peike
[考研] 296求调剂 +4 www_q 2026-03-20 4/200 2026-03-21 17:26 by 学员8dgXkO
[考研] 279求调剂 +5 红衣隐官 2026-03-21 5/250 2026-03-21 14:59 by lature00
[考研] 求调剂 +3 白QF 2026-03-21 3/150 2026-03-21 13:12 by zhukairuo
[考研] 一志愿苏州大学材料求调剂,总分315(英一) +5 sbdksD 2026-03-19 5/250 2026-03-20 22:10 by luoyongfeng
[考研] 295材料求调剂,一志愿武汉理工085601专硕 +5 Charlieyq 2026-03-19 5/250 2026-03-20 20:35 by JourneyLucky
[考研] 一志愿西安交通大学 学硕 354求调剂211或者双一流 +3 我想要读研究生 2026-03-20 3/150 2026-03-20 20:13 by JourneyLucky
[论文投稿] 申请回稿延期一个月,编辑同意了。但系统上的时间没变,给编辑又写邮件了,没回复 10+3 wangf9518 2026-03-17 4/200 2026-03-19 23:55 by babero
[考研] 一志愿中国海洋大学,生物学,301分,求调剂 +5 1孙悟空 2026-03-17 6/300 2026-03-19 23:46 by zcl123
信息提示
请填处理意见