⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 md5.asm

📁 高效率
💻 ASM
字号:
;Modify by binny at 2003.12.

_MD5Trans1 MACRO
	and ebx, eax	
	not eax		
	and eax, edx	
	or eax, ebx	
ENDM

_MD5Trans2 MACRO
	and eax, edx	; X & Z
	not edx		; ~Z
	and ebx, edx	; Y & Z
	or eax, ebx	; X | Y
ENDM

_MD5Trans3 MACRO
	xor eax, ebx	;X ^ Y
	xor eax, edx	;X ^ Z
ENDM

_MD5Trans4 MACRO
	not edx		; ~Z
	or eax, edx	; X | Z
	xor eax, ebx	; X ^ Y
ENDM

MD5Trans1 MACRO dwA, dwB, dwC, dwD, dwX, chS,  dwT
	mov eax, dwB
	mov ebx, dwC
	mov edx, dwD
	_MD5Trans1	; F ( B,C,D )
	mov ecx, dwX
	add eax, ecx	; + X[?]
	add eax, dwT	; + T
	add eax, dwA	; + A
	mov cl, chS	
	rol eax, cl	;rol
	add eax, dwB	; + B

	mov dwA, eax
ENDM

MD5Trans2 MACRO	dwA, dwB, dwC, dwD, dwX, chS, dwT
	mov eax, dwB
	mov ebx, dwC
	mov edx, dwD
	_MD5Trans2
	add eax, dwA
	mov ecx, dwX
	add eax, ecx
	add eax, dwT
	mov cl, chS
	rol eax, cl
	add eax, dwB
	
	mov dwA, eax
ENDM

MD5Trans3 MACRO	dwA, dwB, dwC, dwD, dwX, chS, dwT
	mov eax, dwB
	mov ebx, dwC
	mov edx, dwD
	_MD5Trans3
	add eax, dwA
	mov ecx, dwX
	add eax, ecx
	add eax, dwT
	mov cl, chS
	rol eax, cl
	add eax, dwB
	
	mov dwA, eax
ENDM

MD5Trans4 MACRO dwA, dwB, dwC, dwD, dwX, chS, dwT
	mov eax, dwB
	mov ebx, dwC
	mov edx, dwD
	_MD5Trans4
	add eax, dwA
	mov ecx, dwX
	add eax, ecx
	add eax, dwT
	mov cl, chS
	rol eax, cl
	add eax, dwB

	mov dwA, eax
ENDM

MD5Finalize proc uses ecx edi \
		  lpSum:DWORD
	mov edi, lpSum
	mov ecx, 16
Loop1:
	mov eax, dword ptr [edi]
	bswap eax
	mov dword ptr [edi], eax
	add edi, 4
	sub ecx, 4
	jnz Loop1
EndLoop:
	mov eax, ecx
	ret
MD5Finalize endp

_CopyMemory proc uses edi esi edx ecx ebx dest:DWORD, src:DWORD, len:DWORD
    mov edi, dest
    mov esi, src
    mov edx, len
    mov ecx, edx
    shr ecx, 2
    mov ebx, ecx
    shl ebx, 2
    sub edx, ebx 
    rep movsd
    mov ecx, edx
    rep movsb
    ret
_CopyMemory endp


MD5Pad proc	uses edi esi ecx ebx \
				lpData:DWORD, iLen:DWORD, iTLen:DWORD

	mov ebx, iTLen
	mov edi, ebx
	mov esi, lpData
	add esi, iLen	;esi = lpData+len
	and ebx, 3fh	;计算需要填充的比特数
	mov ecx, 56
	sub ecx, ebx
	jg	AboveZero ;如果大于0,则不用再补充
	add ecx, 40h	;ecx = 需要填充的长度
AboveZero:
	;计算总长度
	;下面代码保证ebx不超过2^29 bytes
	mov ebx, edi
	shr ebx, 29
	shl edi, 3
	mov dword ptr [qwLen], edi
	mov dword ptr [qwlen+4], ebx
	invoke _CopyMemory, esi, addr PADDING, ecx
	add esi, ecx
	invoke _CopyMemory, esi, addr qwLen, 8
	lea eax, [ecx+8]
	ret
MD5Pad endp

MD5Init proc uses esi MD5Ptr:DWORD
	assume esi:ptr MD5Sum
	mov esi, MD5Ptr
	mov eax, 067452301h
	mov [esi].dwSum1, eax
	mov eax, 0efcdab89h
	mov [esi].dwSum2, eax
	mov eax, 098badcfeh
	mov [esi].dwSum3, eax
	mov eax, 010325476h
	mov [esi].dwSum4, eax
	ret
MD5Init endp

MD5Translate proc uses edi esi edx ecx ebx\
					lpData:DWORD, iLen:DWORD, MD5Ptr:DWORD
	assume esi:ptr MD5Sum

	LOCAL a:DWORD, b:DWORD
	LOCAL _c:DWORD, d:DWORD
	LOCAL x[16 * sizeof(DWORD)]:DWORD

	lea edi, table
	mov esi, MD5Ptr

MD5Again:
	lea eax, x
	invoke _CopyMemory, eax, lpData, 64
	add lpData, 64

	mov eax, [esi].dwSum1
	mov a, eax
	mov eax, [esi].dwSum2
	mov b, eax
	mov eax, [esi].dwSum3
	mov _c, eax
	mov eax, [esi].dwSum4
	mov d, eax

	MD5Trans1 a, b, _c, d, x[ZERO],	 	MD5S11, [edi] 
	MD5Trans1 d, a, b, _c, x[ONE], 		MD5S12, [edi + 4]
	MD5Trans1 _c, d, a, b, x[TWO], 		MD5S13, [edi + 8]
	MD5Trans1 b, _c, d, a, x[THREE], 	MD5S14, [edi + 12]
	MD5Trans1 a, b, _c, d, x[FOUR], 	MD5S11, [edi + 16]
	MD5Trans1 d, a, b, _c, x[FIVE], 	MD5S12, [edi + 20]
	MD5Trans1 _c, d, a, b, x[SIX], 		MD5S13, [edi + 24]
	MD5Trans1 b, _c, d, a, x[SEVEN], 	MD5S14, [edi + 28]
	MD5Trans1 a, b, _c, d, x[EIGHT], 	MD5S11, [edi + 32]
	MD5Trans1 d, a, b, _c, x[NINE], 	MD5S12, [edi + 36]
	MD5Trans1 _c, d, a, b, x[TEN], 		MD5S13, [edi + 40]
	MD5Trans1 b, _c, d, a, x[ELEVEN], 	MD5S14, [edi + 44]
	MD5Trans1 a, b, _c, d, x[TWELVE], 	MD5S11, [edi + 48]
	MD5Trans1 d, a, b, _c, x[THIRT], 	MD5S12, [edi + 52]
	MD5Trans1 _c, d, a, b, x[FOURT], 	MD5S13, [edi + 56]
	MD5Trans1 b, _c, d, a, x[FIFT], 	MD5S14, [edi + 60]

	MD5Trans2 a, b, _c, d, x[ONE], 		MD5S21, [edi + 64]
	MD5Trans2 d, a, b, _c, x[SIX], 		MD5S22, [edi + 68]
	MD5Trans2 _c, d, a, b, x[ELEVEN], 	MD5S23, [edi + 72]
	MD5Trans2 b, _c, d, a, x[ZERO], 	MD5S24, [edi + 76]
	MD5Trans2 a, b, _c, d, x[FIVE], 	MD5S21, [edi + 80]
	MD5Trans2 d, a, b, _c, x[TEN], 		MD5S22, [edi + 84]
	MD5Trans2 _c, d, a, b, x[FIFT], 	MD5S23, [edi + 88]
	MD5Trans2 b, _c, d, a, x[FOUR], 	MD5S24, [edi + 92]
	MD5Trans2 a, b, _c, d, x[NINE], 	MD5S21, [edi + 96]
	MD5Trans2 d, a, b, _c, x[FOURT], 	MD5S22, [edi + 100]
	MD5Trans2 _c, d, a, b, x[THREE], 	MD5S23, [edi + 104]
	MD5Trans2 b, _c, d, a, x[EIGHT], 	MD5S24, [edi + 108]
	MD5Trans2 a, b, _c, d, x[THIRT], 	MD5S21, [edi + 112]
	MD5Trans2 d, a, b, _c, x[TWO], 		MD5S22, [edi + 116]
	MD5Trans2 _c, d, a, b, x[SEVEN], 	MD5S23, [edi + 120]
	MD5Trans2 b, _c, d, a, x[TWELVE], 	MD5S24, [edi + 124]

	MD5Trans3 a, b, _c, d, x[FIVE], 	MD5S31, [edi + 128]
	MD5Trans3 d, a, b, _c, x[EIGHT], 	MD5S32, [edi + 132]
	MD5Trans3 _c, d, a, b, x[ELEVEN], 	MD5S33, [edi + 136]
	MD5Trans3 b, _c, d, a, x[FOURT], 	MD5S34, [edi + 140]
	MD5Trans3 a, b, _c, d, x[ONE], 		MD5S31, [edi + 144]
	MD5Trans3 d, a, b, _c, x[FOUR], 	MD5S32, [edi + 148]
	MD5Trans3 _c, d, a, b, x[SEVEN], 	MD5S33, [edi + 152]
	MD5Trans3 b, _c, d, a, x[TEN], 		MD5S34, [edi + 156]
	MD5Trans3 a, b, _c, d, x[THIRT], 	MD5S31, [edi + 160]
	MD5Trans3 d, a, b, _c, x[ZERO], 	MD5S32, [edi + 164]
	MD5Trans3 _c, d, a, b, x[THREE], 	MD5S33, [edi + 168]
	MD5Trans3 b, _c, d, a, x[SIX], 		MD5S34, [edi + 172]
	MD5Trans3 a, b, _c, d, x[NINE], 	MD5S31, [edi + 176]
	MD5Trans3 d, a, b, _c, x[TWELVE], 	MD5S32, [edi + 180]
	MD5Trans3 _c, d, a, b, x[FIFT], 	MD5S33, [edi + 184]
	MD5Trans3 b, _c, d, a, x[TWO], 		MD5S34, [edi + 188]

	MD5Trans4 a, b, _c, d, x[ZERO], 	MD5S41, [edi + 192]
	MD5Trans4 d, a, b, _c, x[SEVEN], 	MD5S42, [edi + 196]
	MD5Trans4 _c, d, a, b, x[FOURT], 	MD5S43, [edi + 200]
	MD5Trans4 b, _c, d, a, x[FIVE], 	MD5S44, [edi + 204]
	MD5Trans4 a, b, _c, d, x[TWELVE], 	MD5S41, [edi + 208]
	MD5Trans4 d, a, b, _c, x[THREE], 	MD5S42, [edi + 212]
	MD5Trans4 _c, d, a, b, x[TEN], 		MD5S43, [edi + 216]
	MD5Trans4 b, _c, d, a, x[ONE], 		MD5S44, [edi + 220]
	MD5Trans4 a, b, _c, d, x[EIGHT], 	MD5S41, [edi + 224]
	MD5Trans4 d, a, b, _c, x[FIFT], 	MD5S42, [edi + 228]
	MD5Trans4 _c, d, a, b, x[SIX], 		MD5S43, [edi + 232]
	MD5Trans4 b, _c, d, a, x[THIRT], 	MD5S44, [edi + 236]
	MD5Trans4 a, b, _c, d, x[FOUR], 	MD5S41, [edi + 240]
	MD5Trans4 d, a, b, _c, x[ELEVEN], 	MD5S42, [edi + 244]
	MD5Trans4 _c, d, a, b, x[TWO], 		MD5S43, [edi + 248]
	MD5Trans4 b, _c, d, a, x[NINE], 	MD5S44, [edi + 252]

	mov eax, a
	add [esi].dwSum1, eax
	mov eax, b
	add [esi].dwSum2, eax
	mov eax, _c
	add [esi].dwSum3, eax
	mov eax, d
	add [esi].dwSum4, eax

	sub iLen, 64
	jg MD5Again

	ret
MD5Translate endp

MD5 proc uses ebx ecx \
                      lpEWH:DWORD, iLen:DWORD, MD5Ptr:DWORD
	mov ebx, iLen
	invoke MD5Init, MD5Ptr
	invoke MD5Pad, lpEWH, ebx, ebx
	invoke MD5Translate, lpEWH, ebx, MD5Ptr
	invoke MD5Finalize, MD5Ptr
	ret
MD5 endp

;Create by Binny at 2005.1
QQMD5 proc uses ebx esi ecx \
                            lpEWH:DWORD, iLen:DWORD, iAST:DWORD, MD5Ptr:DWORD
	assume esi:ptr MD5Sum
	mov ebx, iLen
QQMD5Again:
	invoke MD5Init, MD5Ptr
	invoke MD5Pad, lpEWH, ebx, ebx
	invoke MD5Translate, lpEWH, ebx, MD5Ptr
	invoke _CopyMemory, lpEWH, MD5Ptr, 16
	mov ebx,10h
	sub iAST,1
	jg QQMD5Again
	invoke MD5Finalize, MD5Ptr
	mov esi, MD5Ptr
	mov ecx, 0EFEFEFEFh
	xor [esi].dwSum1, ecx
	xor [esi].dwSum2, ecx
	xor [esi].dwSum3, ecx
	xor [esi].dwSum4, ecx
	ret
QQMD5 endp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -