18、SHA-256算法

参考推荐;

SHA256算法原理介绍以及实现_柠0萌的博客-CSDN博客

SHA-256算法及示例_mutourend的博客-CSDN博客


SHA-256算法

SHA256是一个Merkle-Damgard结构的迭代哈希函数,其计算过程分为两个阶段,消息的预处理和主循环:

1、在消息的预处理阶段,主要完成消息的填充和扩展填充,将所输入的原始消息转化为n个512比特的消息块;

2、对每个消息块利用SHA-256压缩函数进行处理:这个计算流程是一个迭代计算的过程,当最后1个消息块(第n块)处理完毕以后,最终的输出值就是所输入的原始消息的SHA-256杂凑值。

SHA-256算法流程

SHA-256算法主要包含常量的初始化、信息预处理、逻辑运算等步骤,通过迭代运算获得消息摘要。

1 、常量初始化

SHA256算法中用到了8个哈希初值以及64个哈希常量。

其中,SHA256算法的8个哈希初值如下:

h0 := 0x6a09e667;h1 := 0xbb67ae85;h2 := 0x3c6ef372;h3 := 0xa54ff53a;

h4 := 0x510e527f;h5 := 0x9b05688c;h6 := 0x1f83d9ab;h7 := 0x5be0cd19;

于是,8个哈希初值是前8个质数2,3,5,7,11,13,17,19取平方根的小数部分,例如质数2的平方根的小数部分取前32bit就对应出了0x6a09e667;

在SHA256算法中,用到的64个常量如下:

428a2f98 71374491 b5c0fbcf e9b5dba5

3956c25b 59f111f1 923f82a4 ab1c5ed5

d807aa98 12835b01 243185be 550c7dc3

72be5d74 80deb1fe 9bdc06a7 c19bf174

e49b69c1 efbe4786 0fc19dc6 240ca1cc

2de92c6f 4a7484aa 5cb0a9dc 76f988da

983e5152 a831c66d b00327c8 bf597fc7

c6e00bf3 d5a79147 06ca6351 14292967

27b70a85 2e1b2138 4d2c6dfc 53380d13

650a7354 766a0abb 81c2c92e 92722c85

a2bfe8a1 a81a664b c24b8b70 c76c51a3

d192e819 d6990624 f40e3585 106aa070

19a4c116 1e376c08 2748774c 34b0bcb5

391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3

748f82ee 78a5636f 84c87814 8cc70208

90befffa a4506ceb bef9a3f7 c67178f2

和8个哈希初值类似,这些常量是对自然数中前64个质数(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小数部分取前32bit而来。

2、信息预处理(pre-processing)

SHA256算法中的预处理就是在想要Hash的消息后面补充需要的信息,使整个消息满足指定的结构。信息的预处理分为两个步骤:附加填充比特和附加长度

1)附加填充比特:

在报文末尾进行填充,使报文长度在对512取模以后的余数是448;填充方式:先补第一个比特为1,然后都补0,直到长度满足对512取模后余数是448。需要注意的是,信息必须进行填充,也就是说,即使长度已经满足对512取模后余数是448,补位也必须要进行,这时要填充512个比特。因此,填充是至少补一位,最多补512位。

为什么是448?因为在第一步的预处理后,第二步会再附加上一个64bit的数据,用来表示原始报文的长度信息。而448+64=512,正好拼成了一个完整的结构。

2)附加长度值:

附加长度值就是将原始数据(第一步填充前的消息)的长度信息补到已经进行了填充操作的消息后面。SHA256用一个64位的数据来表示原始消息的长度。因此,通过SHA256计算的消息长度必须要小于2^64 ,当然绝大多数情况这足够大了。

回到刚刚的例子,消息“abc”,3个字符,占用24个bit;因此,在进行了补长度的操作以后,整个消息就变成16进制格式;

61626380 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000018

3、 计算消息摘要

SHA-256算法将消息M分解成n个512-bit大小的块;

图中256-bit的Hi被描述为8个小块,这是因为SHA-256算法中的最小运算单元称为“字”(Word),一个字是32位。此外,第一次迭代中,映射的初值设置为前面介绍的8个哈希初值。一个256-bit的摘要的初始值H0,经过第一个数据块进行运算,得到H1,即完成了第一次迭代。H1经过第二个数据块得到H2,……,依次处理,最后得到Hn,Hn即为最终的256-bit消息摘要。

步骤分解如下:

1)构造64个字:

对于每一块,将512位消息块分解为16个32-bit的big-endian的字,记为M0, …, M15;也就是说,前16个字直接由消息的第i个块分解得到;其余的字由如下迭代公式得到:

2)压缩函数:

压缩函数是SHA-256的核心,令A,B,C,D,E,F,G,H为字寄存器,T1, T2为中间变量。压缩函数为:

压缩函数CF的压缩处理方式是内层迭代:

对于t从0到63,有:

具体描述为:

散列函数中涉及的操作全部是逻辑的位运算;包括如下的逻辑函数:

其中:

逻辑运算

含义

按位“与”

¬

按位“补”

按位“异或”

Sn

循环右移n个bit

Rn

循环右移n个bit

映射包含了64次加密循环,即进行64次加密循环即可完成一次迭代;每次加密循环可以由下图描述:

图中,A,B,C,D,E,F,G,H这8个字(word)在按照一定的规则进行更新,其中:

  • 绿色方块是事先定义好的非线性逻辑函数,即将两个数字加在一起,如果结果大于2^32 ,你必须除以 2^32并找到余数。
  • Kt是第t个密钥,对应我们上文提到的64个常量
  • Wt是消息块产生第t个字(word)。通过重复运行循环n次对ABCDEFGH这八个字循环加密。
  • 最后一次循环所产生的八个字合起来即是第i个块对应到的散列字符串Hi

SHA-256算法应用

目前SHA256算法的应用较为广泛,主要应用于CA和数字证书中,另外在目前互联网中流行的BT软件中,也是使用SHA-256来进行文件校验的。同时,SHA256算法还可以应用在消息鉴别,数字签名等方面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三九笔墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值