欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 的C语言实现
最后单独甩出的不完整的块需要被补全,对应代码中的sha256_final函数

整体的操作是依次对块进行Hash映射,第i块映射的结果是第i+1块的输入。这个过程在函数sha256_update中完成

第一个块的输入是预设好的hash初值,初始化过程对应代码中的sha256_init函数

最后一个块的输出便是最终的数字摘要
SHA256 的C语言实现

而其中最关键的操作是这个映射函数Map

其内部也相当于是一个循环加密的过错,不断将原始信息进行打乱:

SHA256 的C语言实现
代码中函数sha256_transform实现了该过程

相关标签: SHA256