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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu16.04配置本地镜像源_修改ubuntu镜像源

    ubuntu16.04配置本地镜像源_修改ubuntu镜像源一、Ubuntu版本和代号:Ubuntu可谓是Linux世界中的黑马,其第一个正式版本于2004年10月正式推出。需要详细解释的是Ubuntu版本编号的定义,其编号以“年份的最后一位.发布月份”的格式命名,因此Ubuntu的第一个版本就称为4.10(2004.10)。除了代号之外,每个Ubuntu版本在开发之初还有一个开发代号。Ubuntu开发代号比较有意思,格式为“形容词+动物”,且形容词和动物名称的第一个字母要一致,如Ubuntu16.04的开发代号是XenialXerus,译为“好客的非洲地松鼠

    2022年10月14日
    3
  • 进程分析工具 process_grep查看进程

    进程分析工具 process_grep查看进程当进程卡住不动或者死锁时,pstack可以把当前进程的代码栈打出来,方便我们排查。用法非常简单,后面直接加进程号即可。如果是多线程的,则会打印每个线程的堆栈信息。manpstack可查看帮助[root@localhost~]#pstack7383Thread8(Thread0x7fcc0429c700(LWP7384)):#00x00007fcc0d322a82inpthread_cond_timedwait@@GLIBC_2.3.2()from/lib64/.

    2022年9月14日
    0
  • html5视频常用API接口「建议收藏」

    html5视频常用API接口「建议收藏」一、虽然有的属性是boolean类型,但仍旧建议按照XHTML书写(属性名=”属性值”)格式,避免出现错误(下面加粗的属性为常用属性)属性值功能描述controlscontrols是否显

    2022年7月3日
    84
  • 关于交叉线和直通线的区别和用途

    关于交叉线和直通线的区别和用途一般来说,网线传输数据的时候,是两个线发送,另外两根用来接收。比如,我们按照线序1,2,3,4,5,6,7,8(白橙,橙,白绿,蓝,白蓝,绿,白棕,棕)排序。1,2用来发送数据;3,6用来接收数据。具体就是1发3收,2发6收。我们知道,计算机上的网线接口里面也有八条线对应着网线的八条线,而且每台计算机的网线接口里面的线序都是一样的,这样才能实现统一化,不可能为不同的计算机设计不同的线序,也没有必要这样做。当相同设备传输信号时,若用直通线,那么发送数据的计算机的1号线对应接收数据的计算机的1号线,而我们知道

    2022年6月19日
    36
  • 从硬盘上安装Fedora12

    从硬盘上安装Fedora12一、引言Fedora12的liveCD:Fedora-12-i686-Live.iso,至今未硬盘安装成功。在引导过程中,报此类错误:[drm:drm_mode_rmfb]triedtoremoveafbthatwedidntown无奈之下,只好下载Fedora12的DVD版:Fedora12-i386-DVD.iso文件比较大,2G多一些。

    2022年9月20日
    2
  • windows操作系统定时关机和取消定时关机命令

    windows操作系统定时关机和取消定时关机命令windows操作系统定时关机和取消定时关机命令1、定时关机shutdown-s-t60(60表示定时60秒)2、取消定时关机shutdown-a(取消定时关机)…

    2022年5月15日
    45

发表回复

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

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