| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2475 人关注过本帖
标题:用win32汇编实现hmac_md5算法
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏
 问题点数:0 回复次数:1 
用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)
搜索更多相关主题的帖子: hmac 
2008-08-06 14:48
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
千呼万唤始出来

拖了这么久 也不给俺加个分什么的
2008-08-10 18:56
快速回复:用win32汇编实现hmac_md5算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016927 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved