SHA1简介
SHA-1(Secure Hash Algorithm 1)是一种广泛使用的密码散列函数,它属于SHA家族算法的一员,主要用于生成数据的固定长度(160位即20字节)哈希值,用于验证数据完整性、数字签名等场景。
数据填充
把输入数据填充到64字节(512位)的倍数(最少填充9个字节,最多填充64+8个字节)。
填充方式:
- 在原始数据的后面填充0x80
- 填充N个0
- 使用大端序在最后8个字节填充输入数据的bit长度
分块处理
将填充后的数据分割为多个512位(64字节)的块,每个块包含16个32位字子块。
初始化哈希值
初始哈希值由5个32位常数组成
1 | H0 = 0x67452301 |
对每个512位块处理
每个块要经过80轮循环操作来更新哈希值:
消息扩展
将16个初始字扩展到80个字(W[0]到W[79]):
1 | W[t] = (W[t-3] XOR W[t-8] XOR W[t-14] XOR W[t-16]) <<< 1 |
初始化变量
将A, B, C, D, E
分别设置为当前的H0, H1, H2, H3, H4
循环运算
不同的轮次使用不同的逻辑函数和常数:
- 阶段0-19:
f = (B AND C) OR (NOT B AND D)
,常数K=0x5A827999
- 阶段20-39:
f = B XOR C XOR D
,常数K=0x6ED9EBA1
- 阶段40-59:
f = (B AND C) OR (B AND D) OR (C AND D)
,常数K=0x8F1BBCDC
- 阶段60-79:
f = B XOR C XOR D
,常数K=0xCA62C1D6
更新哈希值
每轮通过以下公式更新临时变量:
1 | temp = (A <<< 5) + f + E + K + W[t] |
生成最终哈希值
最终将5个哈希变量(A, B, C, D, E)拼接成160位(20字节)的结果,通常表示为40个十六进制字符。
SHA-1最后的输出是通过大端序来拼接的。