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.使用密钥key和固定的数据(0x5C)进行异或操作生成一个64B的数据kx’;
4.使用kx’+第2步生成的out执行sha256算法得到32B的out,此结果就是HMACSHA256算法输出;
综述:HMAC加密算法是一种基于数据摘要算法和共享密钥的消息认证协议.它可以有效地防止数据在传输过程中被篡改,维护了数据的完整性、可靠性和安全性.
#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验证结果如下图:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/201351.html原文链接:https://javaforall.cn
相关文章
- JS算法探险之整数
- 归并排序算法详细图解_归并排序算法描述
- 【说站】python最短路径算法如何选择
- 算法的复杂性详解及原理
- 【视频】Copula算法原理和R语言股市收益率相依性可视化分析|附代码数据
- POSIT算法的原理–opencv 3D姿态估计[通俗易懂]
- PQ实战案例拆解 | 汇总多股票交易数据,计算最近60天的5日移动平均的操作与算法优化
- 初探粒子群优化算法(PSO)[通俗易懂]
- 7个步骤详解AdaBoost 算法原理和构建流程
- Go 数据结构和算法篇(十六):二叉树的遍历
- PID算法原理介绍
- 百事正用AI种土豆,连削皮算法都搞上了
- 初学LeetCode算法题电话号码的字母组合(虽然不难但是做出来还是很爽的)
- KMP算法笔记I ----- 先学会朴素算法
- java python双语言实现5种最短路径算法
- 【数据挖掘】基于密度的聚类方法 - DBSCAN 方法 ( DBSCAN 原理 | DBSCAN 流程 | 可变密度问题 | 链条现象 | OPTICS 算法引入 | 聚类层次 | 族序概念 )
- Sentinel滑动时间窗限流算法原理及源码解析(下)
- “算法交易”下,如何确保股票市场公平?
- 演示“距离矢量路由算法”工作原理
- Facebook田渊栋:德州扑克上战胜人类的AI究竟用的是什么算法? | 本周专栏精选
- MySQL解释器防幻读算法,用户并发修改数据时,请求统一锁释放防止幻读现象存在,保证数据库数据的一致性
- GooglePR查询接口checksum新算法