用win32汇编实现hmac_md5算法
*/ --------------------------------------------------------------------------------------*/ 出自: 编程中国 https://www.bccn.net
*/ 作者: zklhp E-mail:zklhp@ QQ:493165744
*/ 时间: 2008-8-6 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------
在实现md5的程序上稍加改动 完成了这个程序
望各位高手多提意见 多拍扳砖 呵呵
帖一下实现的代码吧 其实很简单的
;*****************************************************************************************************************
;函数功能:实现 hmac_md5 算法
;参数:_lpszText、_lpszKey 指向以0结尾的字符串,_dwTextLen、_dwKeyLen 给出长度,_lpDigest 指向一个16字节的缓冲区
;注意:若_dwTextLen、_dwKeyLen 给出长度,则只算给出的长度,若为0,则计算全部长度(不包括结尾的0)
;返回值:成功返回0 不成功返回 -1
;作者:zklhp Email:zklhp@
;时间:2008.7.27
;版权所有 转载请保持完整
;*****************************************************************************************************************
include md5.asm
_hmac_md5 proc uses ebx esi edi ,_lpszText:DWORD,_dwTextLen:DWORD,_lpszKey:DWORD,_dwKeyLen:DWORD,_lpDigest:DWORD
local @hBuf:DWORD ;申请的内存的句柄
local @lpBuf:DWORD ;指向申请的内存
local @szk_ipad[65]:BYTE ;key XORd with ipad
local @szk_opad[65]:BYTE ;key XORd with opad
;错误处理
;其实光自己用也无所谓,调用是小心就是了,但别人用就不好说了,呵呵
;只要出错就返回 -1,如果想正式一点可以定义错误码,偶偷懒就不搞了,呵呵
.if (_lpszText==NULL)||(_lpszKey==NULL)||(_lpDigest==NULL)
xor eax,eax
dec eax
ret ;为空指针时返回 -1
.endif
invoke lstrlen,_lpszText
.if _dwTextLen == 0
mov _dwTextLen,eax
.elseif _dwTextLen > eax
xor eax,eax
dec eax
ret ;越界,返回 -1
.endif
invoke lstrlen,_lpszKey
.if _dwKeyLen == 0
mov _dwKeyLen,eax
.elseif _dwKeyLen > eax
xor eax,eax
dec eax
ret ;越界,返回 -1
.endif
;栈内存置零
invoke RtlZeroMemory,addr @szk_ipad,sizeof @szk_ipad
invoke RtlZeroMemory,addr @szk_opad,sizeof @szk_opad
.if _dwKeyLen > 64
invoke _MD5hash,_lpszKey,_dwKeyLen,addr @szk_ipad
invoke RtlMoveMemory,addr @szk_opad,addr @szk_ipad,16
.else
invoke RtlMoveMemory,addr @szk_ipad,_lpszKey,_dwKeyLen
invoke RtlMoveMemory,addr @szk_opad,_lpszKey,_dwKeyLen
.endif
xor eax,eax
.while eax < 64
xor [@szk_ipad+eax],36h
xor [@szk_opad+eax],5ch
inc eax
.endw
;申请一块内存,长度为(64+_dwTextLen+64+1) 保证够用!
mov ecx,_dwTextLen
add ecx,129d
invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,ecx
.if eax
mov @hBuf,eax
.else
dec eax
ret ;内存分配错误返回 -1
.endif
invoke GlobalLock,@hBuf
.if eax
mov @lpBuf,eax
.else
dec eax
ret ;错误返回 -1
.endif
invoke RtlMoveMemory,@lpBuf,addr @szk_ipad,64d
mov esi,@lpBuf
add esi,64d
invoke RtlMoveMemory,esi,_lpszText,_dwTextLen
mov ecx,_dwTextLen
add ecx,64
invoke _MD5hash,@lpBuf,ecx,_lpDigest ;先借用一下输出的缓冲区
mov esi,@lpBuf
invoke RtlMoveMemory,esi,addr @szk_opad,64d
add esi,64
invoke RtlMoveMemory,esi,_lpDigest,16d
invoke _MD5hash,@lpBuf,80d,_lpDigest
invoke GlobalFree,@hBuf
xor eax,eax
ret
_hmac_md5 endp
还写了几句验证的的代码 就是测试的数据太少了 不知道对错 望各位高手多多指点
程序+代码+RFC 2104 已打包上传
hmac_md5.rar
(24.52 KB)