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 | H0 = 0x6a09e667 |
处理每个512位块
每个块经过64轮循环操作,更新哈希值:
消息扩展
将16个初始字扩展为64个字(W[0]-W[63]):
1 | For t = 16 to 63: |
初始化变量
1 | a = H0 |
主循环(64轮运算)
逻辑函数
1 | Ch(e, f, g) = (e & f) ^ (~e & g) |
轮常数K[t]
由前64个素数的立方根小数部分前32位生成(例如 K[0] = 0x428a2f98
,K[63] = 0xc67178f2
)。
计算(对 t = 0
到 63
):
1 | T1 = h + Σ₁(e) + Ch(e, f, g) + K[t] + W[t] |
更新哈希值
1 | H0 = (H0 + a) & 0xFFFFFFFF |
生成最终哈希值
将所有块处理完毕后,将 H0
到 H7
按 大端序 拼接为256位(32字节)结果,转换为64位十六进制字符串。