用win32汇编实现hmacmd5算法(改进版) -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

   

用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

最新文章