白乐天

道阻且长,行则将至。

详解SHA2-256

SHA256简介

SHA-256(Secure Hash Algorithm 256)是SHA-2家族中的一种密码散列函数,它生成256位(32字节)的哈希值,广泛应用于数据完整性验证、数字签名、区块链(如比特币)等场景,相较于SHA-1,SHA-256具有更高的安全性和抗碰撞能力。

消息预处理

数据填充

把输入数据填充到64字节(512位)的倍数(最少填充9个字节,最多填充64+8个字节)。

填充方式:

  • 在原始数据的后面填充0x80
  • 填充N个0
  • 使用大端序在最后8个字节填充输入数据的bit长度

分块

将填充后的数据分割为多个512位(64字节)的块,每个块包含16个32位字子块。

初始化哈希值

SHA-256的初始哈希值(H₀-H₇)由前8个素数的平方根的小数部分前32位构成:

1
2
3
4
5
6
7
8
H0 = 0x6a09e667
H1 = 0xbb67ae85
H2 = 0x3c6ef372
H3 = 0xa54ff53a
H4 = 0x510e527f
H5 = 0x9b05688c
H6 = 0x1f83d9ab
H7 = 0x5be0cd19

处理每个512位块

每个块经过64轮循环操作,更新哈希值:

消息扩展

将16个初始字扩展为64个字(W[0]-W[63]):

1
2
3
4
5
For t = 16 to 63:
W[t] = σ₁(W[t-2]) + W[t-7] + σ₀(W[t-15]) + W[t-16]

σ₀(x) = (x >> 7) ^ (x >> 18) ^ (x >> 3)
σ₁(x) = (x >> 17) ^ (x >> 19) ^ (x >> 10)

初始化变量

1
2
3
4
5
6
7
8
a = H0
b = H1
c = H2
d = H3
e = H4
f = H5
g = H6
h = H7

主循环(64轮运算)

逻辑函数

1
2
3
4
Ch(e, f, g) = (e & f) ^ (~e & g)
Maj(a, b, c) = (a & b) ^ (a & c) ^ (b & c)
Σ₀(x) = (x >> 2) ^ (x >> 13) ^ (x >> 22)
Σ₁(x) = (x >> 6) ^ (x >> 11) ^ (x >> 25)

轮常数K[t]

由前64个素数的立方根小数部分前32位生成(例如 K[0] = 0x428a2f98K[63] = 0xc67178f2)。

计算(对 t = 063):

1
2
3
4
5
6
7
8
9
10
T1 = h + Σ₁(e) + Ch(e, f, g) + K[t] + W[t]
T2 = Σ₀(a) + Maj(a, b, c)
h = g
g = f
f = e
e = d + T1
d = c
c = b
b = a
a = T1 + T2

更新哈希值

1
2
3
4
5
6
7
8
H0 = (H0 + a) & 0xFFFFFFFF
H1 = (H1 + b) & 0xFFFFFFFF
H2 = (H2 + c) & 0xFFFFFFFF
H3 = (H3 + d) & 0xFFFFFFFF
H4 = (H4 + e) & 0xFFFFFFFF
H5 = (H5 + f) & 0xFFFFFFFF
H6 = (H6 + g) & 0xFFFFFFFF
H7 = (H7 + h) & 0xFFFFFFFF

生成最终哈希值

将所有块处理完毕后,将 H0H7 按 大端序 拼接为256位(32字节)结果,转换为64位十六进制字符串。