白乐天

道阻且长,行则将至。

详解SHA1

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
2
3
4
5
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0

对每个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-19f = (B AND C) OR (NOT B AND D),常数K=0x5A827999
  • 阶段20-39f = B XOR C XOR D,常数K=0x6ED9EBA1
  • 阶段40-59f = (B AND C) OR (B AND D) OR (C AND D),常数K=0x8F1BBCDC
  • 阶段60-79f = B XOR C XOR D,常数K=0xCA62C1D6

更新哈希值

每轮通过以下公式更新临时变量:

1
2
3
4
5
6
temp = (A <<< 5) + f + E + K + W[t]
E = D
D = C
C = B <<< 30
B = A
A = temp

生成最终哈希值

最终将5个哈希变量(A, B, C, D, E)拼接成160位(20字节)的结果,通常表示为40个十六进制字符。

SHA-1最后的输出是通过大端序来拼接的。