SHA256 的C语言实现

前几天总结了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实现了该过程

猜你喜欢

转载自blog.csdn.net/u011583927/article/details/80953491