SHA256 的C语言实现
程序员文章站
2022-05-12 22:23:26
...
前几天总结了SHA256的算法原理一文
SHA2系列的原理并不复杂,但是需要注意细节还是挺多的。不少中文博客贴出的代码都有错,这两天也踩了几个坑。
代码在这里!!!SHA256的C Code
代码实现主要依照的这个git仓库crypto-algorithms,向大家推荐,里面实现了各种加密算法。
代码正确性的测试
如何测试加密算法是否正确,上一文也提到过
我使用的是一个在线SHA256加密验证工具
测试了三种不同类型的数据的Hash结果
- 纯英文
- 中英文夹杂
- 长消息
逻辑运算
SHA256中使用的所有逻辑运算,使用宏定义的方式实现如下:
#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))
算法回顾
这里对SHA256原理进行简单回顾,方便大家对照源代码
首先需要将原始消息拆解成512-bit大小的块
最后单独甩出的不完整的块需要被补全,对应代码中的sha256_final
函数
整体的操作是依次对块进行Hash映射,第i块映射的结果是第i+1块的输入。这个过程在函数sha256_update
中完成
第一个块的输入是预设好的hash初值,初始化过程对应代码中的sha256_init
函数
最后一个块的输出便是最终的数字摘要
而其中最关键的操作是这个映射函数Map
其内部也相当于是一个循环加密的过错,不断将原始信息进行打乱:
代码中函数sha256_transform
实现了该过程
上一篇: 整数反转