从RFC6234中理解SHA2-256算法
目录
警告
本文最后更新于 2023-05-09,文中内容可能已过时。
一、前置知识点
SHA2-256算法是SHA第二代的算法,256指的是它的算法结果会产生256位数据,也就是32字节、64位长度的16进制字符。
二、算法流程
算法流程就不多做介绍,同其他哈希算法流程类似,都需要经历补位、填充长度以及分组,不同的是每轮循环所做的操作
1 补位
基本一样,不做额外说明
2 记录信息长度
同上
3 初始化变量
依旧是从常量的初始化开始,根据结果256位来看,需要8个常量组成,常量的计算方式是取自自然数中前面8个素数(2,3,5,7,11,13,17,19)的平方根的小数部分的前32位,举例看
|
|
于是, 质数2的平方根的小数部分取前32位就对应0x6a09e667,据此类推,初始化常量的值就是
|
|
4 处理分组数据
还是同样的套路,输入的数据被分成每512位一组,而512位的数据又被拆分成每32位一小组,一共是16个小组,SHA256的循环轮次和MD5是相同的,但是SHA256和SHA1一样,除了初始的16组是原始的以外,剩余的组都通过额外的公式来计算得来
根据文档
|
|
c++实现
|
|
针对64轮次每轮同样有常量,而SHA256的常量计算方式如下(取自自然数中前面64个素数的立方根的小数部分的前32位)
|
|
看下主处理流程
|
|
出现T1、T2两个中间变量,涉及到了4个函数
|
|
c++来实现
|
|
最终只需要将得到的8个变量重新赋值再作为初始变量传递给下一分组计算即可
5 输出结果
在经过分组计算后能够得到A、B、C、D、E、F、G、H,从低位字节A开始,高位字节E结束
总结
在了解了MD5、SHA1算法之后再来看SHA2-256算法的话,很明显能发现SHA2-256结合了前两个算法,包括MD5的每轮次的不同常量以及SHA1的数据分组方式以及每轮次计算方式,并且来降低了计算的轮次,引入更多的空间来替换计算时间效率的提升