hmacsha256算法原理_一次解析

hmacsha256算法原理_一次解析需要支持HMACSHA256算法,GitHub找到源码具体地址https://github.com/aperezdc/hmac-sha256/blob/master/hmac-sha256.c移植到目标平台,稍作处理测试ok了,原理:1.输入密钥key和固定的数据(0x36)进行异或操作生成一个64B的数据kx;2.使用kx+输入数据执行sha256算法得到32B的out;3.使用…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

需要支持HMACSHA256算法,GitHub找到源码具体地址https://github.com/aperezdc/hmac-sha256/blob/master/hmac-sha256.c

移植到目标平台,稍作处理测试ok了,原理:

1.输入密钥key和固定的数据(0x36)进行异或操作生成一个64B的数据kx;

2.使用kx+输入数据执行sha256算法得到32B的out;

3.使用密钥key和固定的数据(0x5C)进行异或操作生成一个64B的数据kx’;

4.使用kx’+第2步生成的out执行sha256算法得到32B的out,此结果就是HMACSHA256算法输出;

综述:HMAC加密算法是一种基于数据摘要算法和共享密钥的消息认证协议.它可以有效地防止数据在传输过程中被篡改,维护了数据的完整性、可靠性和安全性.

Jetbrains全家桶1年46,售后保障稳定

#ifndef HMAC_SHA256_H
#define HMAC_SHA256_H    
#define B 64    
#define I_PAD 0x36
#define O_PAD 0x5C        
#define HMAC_SHA256_DIGEST_SIZE 32  /* Same as SHA-256’s output size. */
#define SHA256_DIGEST_SIZE 32    
    
#endif /* !HMAC_SHA256_H */
void hmac_sha256 (const u8 *key, u32 key_len,const u8 *data, u32 data_len,u8 *out)

    u16 i;
    u8 kh[SHA256_DIGEST_SIZE];
    u8 tmpdata[1024];
 
    if (key_len > B) {//如果key长度大于64B,那么需要先对key进行sha256运算,换成32B数据,否则不处理       
        sha256( key, key_len, kh);
        key_len = SHA256_DIGEST_SIZE;
        key = kh;
    }

    /*
     * (1) append zeros to the end of K to create a B byte string
     *     (e.g., if K is of length 20 bytes and B=64, then K will be
     *     appended with 44 zero bytes 0x00)
     * (2) XOR (bitwise exclusive-OR) the B byte string computed in step
     *     (1) with ipad
     */
    u8 kx[B];
    for ( i = 0; i < key_len; i++) kx[i] = I_PAD ^ key[i];//key异或0x36,填充前部分kx
    for ( i = key_len; i < B; i++) kx[i] = I_PAD ^ 0;//剩余部分填充0x36,生成kx数据

    /*
     * (3) append the stream of data ‘text’ to the B byte string resulting
     *     from step (2)
     * (4) apply H to the stream generated in step (3)
     */  
    memcpy(tmpdata,kx,B);
    memcpy(&tmpdata[B],data,data_len);
    sha256(tmpdata, data_len+B, out);//把kx和输入数据拼接起来算一次sha256

    /*
     * (5) XOR (bitwise exclusive-OR) the B byte string computed in
     *     step (1) with opad
     * NOTE: The “kx” variable is reused.
     */
    for ( i = 0; i < key_len; i++) kx[i] = O_PAD ^ key[i];//key异或0x5C,填充前部分kx
    for ( i = key_len; i < B; i++) kx[i] = O_PAD ^ 0;//剩余部分填充0x5C,生成kx数据

    /*
     * (6) append the H result from step (4) to the B byte string
     *     resulting from step (5)
     * (7) apply H to the stream generated in step (6) and output
     *     the result
     */

    memcpy(tmpdata,kx,B);
    memcpy(&tmpdata[B],out,SHA256_DIGEST_SIZE);
    sha256(tmpdata, SHA256_DIGEST_SIZE+B, out);//把kx和上一步生成的32B数据拼接起来再算一次sha256,输出结果。
}

 

测试数据:
key1(32B hex):0102030405060708090a0b0c0d0e0f100102030405060708090a0b0c0d0e0f10
data1(40B ascll):1234567890123456789012345678901234567890
value1(32B hex):3B7F4D300E7930592F87718F8E7D284649AED889FDDE7D4B99FCA41F9EA1D35F

key3(16B hex):0102030405060708090a0b0c0d0e0f10
data3(40B ascll):1234567890123456789012345678901234567890
value3(32B hex):17E016631C53E274CA1B6403967AEA1A36E3D1C726588C1668CD1F93A7D9D8A7

在线工具https://1024tools.com/hmac验证结果如下图:

hmacsha256算法原理_一次解析

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201351.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js判断字符串数组是否包含某个字符串_怎么判断数组有几个元素

    js判断字符串数组是否包含某个字符串_怎么判断数组有几个元素方法一:indexOf(item,start)Item:要查找的值;start:可选的整数参数,缺省则从起始位子开始查找。indexOf()返回元素在数组中的位置,如果没有则返回-1,该方法只能查找字符串,数字等,不能查找类或者数组或者NaN,如果想查找类或者数组,可以使用下面介绍的其他方法;vararr=[‘a’,’b’,’c’,’d’];console.log(arr.indexOf(‘b’)); //1console.log(arr.indexOf(‘ab’))

    2022年10月18日
    5
  • 北京移动全网优惠_随着竞争的加剧

    北京移动全网优惠_随着竞争的加剧 【eNet硅谷动力消息】被叫全免计划终于推出了,这个计划可以说是大家翘首以盼,许多人大大节省了话费,对很多人来说是一个大大的福音,但也因此造成了中国通讯资费的改革提速,从而加剧了行业之间的竞争。  中移动北京公司市场部负责人介绍,5月23日公司正式推出了全球通标准资费“被叫全免计划”。自即日开始,北京地区的全球通客户切实实现被叫免费,接听时间没有限制,进一步呼应了社会的期盼。按照本次…

    2022年10月7日
    4
  • centos7怎么关机_centos7重启后网卡关闭

    centos7怎么关机_centos7重启后网卡关闭开启NetworkManagercat<<EOF>/etc/NetworkManager/nm-system-settings.conf[main]plugins=ifupdown,keyfile[ifupdown]managed=trueEOFreboot关闭NetworkManagersystemctlstopNetworkManagersystemctldisableNetworkManagerrm-rf/var/lib/N…

    2022年9月27日
    4
  • Nginx使用

    Nginx使用

    2021年7月10日
    74
  • Pytest(13)命令行参数–tb的使用「建议收藏」

    Pytest(13)命令行参数–tb的使用「建议收藏」前言pytest使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败。–tb=style参数可以设置报错的时候回溯打印内容,可以设置参

    2022年7月28日
    7
  • Java Calendar类详解

    Java Calendar类详解原文这里。究竟什么是一个Calendar呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历、阴(农)历之分。它们的区别在哪呢?比如有:月份的定义-阳`(公)历一年12个月,每个月的天数各不同;阴(农)历,每个月固定28天每周的第一天-阳(公)历星期日是第一天;阴(农)历,星期一是第一天实际上,在历史上有着许多种纪元的方法。它们的差异实在太大了,比如说一

    2022年6月10日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号