杂凑函数之SHA-256学习笔记
---
SHA-256是安全散列算法(Secure Hash Algorithm)的256位版本,属于SHA-2(SHA第二版)系列的一部分。它是一个加密散列函数,用于生成一个固定长度(256位,即32字节)的散列值,通常表示为一个64位的十六进制字符串。SHA-256被设计用来替代旧的SHA-1算法,因为它提供了更高的安全性。
算法详解
输入:0<L<264
输出:256bit的消息摘要
一.预处理
1.消息填充
填充消息也就是进行补位操作,第一位补1,其余位补足够的0,直到满足L mod 512=448。
这里有一个问题,那就是为什么要补这个数量的0呢?答案就是剩余的512−448=64位,要存储消息的长度。
一个消息填充的示例如下图:

2.填充消息解析
将填充后的消息分成 N 个512-bit的信息块,可以表示为M(1),M(2),...,M(N)。因为512bits的信息块可以表示为16个32-bitz字,所以第i个信息块可以表示为M0(i),M1(i),...,M15(i)。
3.设置初始哈希值
初始哈希值H(0)由以下8个32-bit字组成。
H0(0)=6a09e667
H1(0)=bb67ae85
H2(0)=3c6ef372
H3(0)=a54ff53a
H4(0)=510e527f
H5(0)=9b05688c
H6(0)=1f83d9ab
H7(0)=5be0cd19
二.计算
预处理完成后,每个消息块M(1),M(2),...,M(N)按照以下顺序进行处理。
1.准备消息表
准备消息表Wt
Wt={Mt(i),σ1{256}(Wt−2)+Wt−7+σ0{256}(Wt−15)+Wt−16,0≤t≤1516≤t≤63
其中ROTL为左移位运算。
2.初始化工作变量
初始化a,b,c,d,e,f,g,h八个工作变量
a=H0(i−1)
b=H1(i−1)
c=H2(i−1)
d=H3(i−1)
e=H4(i−1)
f=H5(i−1)
g=H6(i−1)
h=H7(i−1)
3.执行80轮运算
由准备消息表中可知,t的数值范围为0到63,则根据t的数值,进行64轮运算,每轮运算执行以下计算:
T1=h+Σ1{256}(e)+Ch(e,f,g)+Kt{256}+Wt
T2=Σ0{256}(a)+Maj(a,b,c)
h=g
g=f
f=e
e=d+T1
d=c
c=b
b=a
a=T1+T2
其中涉及的有关运算如下:
Ch(x,y,z) = (x∧y)⊕(x∧z)
Maj(x,y,z) = (x∧y)⊕(x∧z)⊕(y∧z)
Σ0{256}(x) = ROTR2(x)⊕ROTR13(x)⊕ROTR22(x)
Σ1{256}(x) = ROTR6(x)⊕ROTR11(x)⊕ROTR25(x)
S0{256}(x) = ROTR7(x)⊕ROTR18(x)⊕SHR3(x)
S1{256}(x) = ROTR17(x)⊕ROTR19(x)⊕SHR10(x)
K0{256},K1{256},...,K63{256}的值为:
428a2f9871374491b5c0fbcfe9b5dba53956c25b59f111f1923f82a4ab1c5ed5
d807aa9812835b01243185be550c7dc372be5d7480deb1fe9bdc06a7c19bf174
e49b69c1efbe47860fc19dc6240ca1cc2de92c6f4a7484aa5cb0a9dc76f988da
983e5152a831c66db00327c8bf597fc7c6e00bf3d5a7914706ca635114292967
27b70a852e1b21384d2c6dfc53380d13650a7354766a0abb81c2c92e92722c85
a2bfe8a1a81a664bc24b8b70c76c51a3d192e819d6990624f40e3585106aa070
19a4c1161e376c082748774c34b0bcb5391c0cb34ed8aa4a5b9cca4f682e6ff3
748f82ee78a5636f84c878148cc7020890befffaa4506cebbef9a3f7c67178f2
4.计算中间哈希值
计算中间哈希值H(i)
H0(i)=a+H0(i−1)
H1(i)=b+H1(i−1)
H2(i)=c+H2(i−1)
H3(i)=d+H3(i−1)
H4(i)=e+H4(i−1)
H5(i)=f+H5(i−1)
H6(i)=g+H6(i−1)
H7(i)=h+H7(i−1)
三.最终结果
在重复进行上述计算过程N次后,消息M的160-bit消息摘要为
H0(N)∥H1(N)∥H2(N)∥H3(N)∥H4(N)∥H5(N)∥H6(N)∥H7(N)
参考资料
参考文档:Secure Hash Standard