原帖及讨论:http://bbs.bccn.net/thread-227563-1-1.html 用win32汇编实现hmac_md5算法偶用win32汇编写了个hmac_md5算法的实现函数 因为验证的数据少 不知道对不对 请各位高手多多指点 多拍板砖
把主要代码帖一下吧
;***************************************************************************************************************** ;函数功能:实现 hmac_md5 算法 ;参数:_lpszText、_lpszKey 指向以0结尾的字符串,_dwTextLen、_dwKeyLen 给出长度,_lpDigest 指向一个16字节的缓冲区 ;注意:若_dwTextLen、_dwKeyLen 给出长度,则只算给出的长度,若为0,则计算全部长度(不包括结尾的0) ;返回值:成功返回0 不成功返回 -1 ;作者:zklhp Email:zklhp@sina.com ;时间: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
代码+程序+参考资料  
|