建议
- 大家可以先学习SHA1再来看本文,个人感觉这样理解会比较好
SHA256算法流程
- 常量定义—建议大家直接看官方手册
- SHA256算法中用到了8个哈希初值以及64个哈希常量
-
SHA256算法的8个哈希初值如下:
-
64个哈希常量
-
- SHA256算法中用到了8个哈希初值以及64个哈希常量
- 信息预处理
SHA256算法中的预处理就是在想要Hash的消息后面补充需要的信息,使整个消息满足指定的结构。- 信息的预处理分为两个步骤:附加填充比特和附加长度
- 附加填充比特
- 在报文末尾进行填充,使报文长度在对512取模以后(本质上就是将报文长度以512切块,并在最后一块进行补充长度信息)的余数是448。填充是这样进行的:先补第一个比特为1,然后都补0,直到长度满足对512取模后余数是448。
- 需要注意的是,信息必须进行填充,也就是说,即使长度已经满足对512取模后余数是448,补位也必须要进行,这时要填充512个比特。因此,填充是至少补一位,最多补512位。
- 附加长度
- 附加长度值就是将原始数据(第一步填充前的消息)的长度信息补到已经进行了填充操作的消息后面。
SHA256用一个64位的数据来表示原始消息的长度。 - 因此,通过SHA256计算的消息长度必须要小于2^64 ,当然绝大多数情况这足够大了。
- 长度信息的编码方式为64-bit big-endian integer
- 附加长度值就是将原始数据(第一步填充前的消息)的长度信息补到已经进行了填充操作的消息后面。
- 信息摘要的计算
-
首先,将消息分解成N个512bit大小的块。其实就是类似SHA1将消息分解。
-
对于分解后的512bit再次拆分为16*32bit大小,这也是我们生成计算式中W_t的依据。
-
我们对于摘要的计算,本质上就是每轮(512bit中)进行64次计算。计算的概念如下图所示。
-
- 逻辑计算分析
- 针对上图中的逻辑计算进一步分析
- 类似于SHA1,我们首先定义W_t和K_t的获取方式
- W_t的定义如下
- K_t的定义是第t个密钥,对应我们上文提到的64个常量。
- ABCDEFGH一开始的初始值分别为H_{i-1}(0),H_{i-1}(1),…,H_{i-1}(7) 。
- 一些逻辑计算的符号规定
- W_t的定义如下
- 64轮逻辑计算伪代码(建议参考官方文档)
- SHA256计算图总结