SHA-1(Secure Hash Algorithm 1)是一种广泛使用的密码散列函数,生成160位(20字节)的哈希值。尽管已被证实存在安全漏洞并逐步被SHA-2和SHA-3取代,但其算法设计仍具学习价值。

消息预处理

填充消息:确保消息长度为512bit的倍数减64bit(即长度L ≡ 448 mod 512)。

  • 第一位补 “1”,其余位补足够的0,直至满足长度 ≡ 448 mod 512
  • 附加64位的原始消息长度(以位为单位,大端表示)

分块处理

  • 将填充后的消息分割为多个 512位 的块。每个块进一步分为 16个32位字(记为 W[0] 到 W[15])。

扩展字生成

将16个32位字扩展为 80个字(W[0] 到 W[79]):

对 t ≥ 16, W[t]=ROTL1(W[t−3]⊕W[t−8]⊕W[t−14]⊕W[t−16])
其中,ROTLn 表示循环左移 n 位,⊕ 表示异或。

初始化哈希值

SHA-1使用5个32位初始常量:

H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0

主循环处理

对每个512位块执行以下操作:

  1. 初始化变量

a = H0, b = H1, c = H2, d = H3, e = H4

  1. 80轮迭代
    每轮更新变量 a, b, c, d, e:
  • 计算临时变量 temp:temp=ROTL5(a) + f(b,c,d) + e + W[t] + K(所有加法为 模 232
  • 逻辑函数 f 和常量 K 根据轮数选择:
轮次范围 逻辑函数 f(b, c, d) 常量 K
0-19 (b ∧ c) ∨ (¬b ∧ d)(选择函数) 0x5A827999
20-39 b ⊕ c ⊕ d(异或) 0x6ED9EBA1
40-59 (b ∧ c) ∨ (b ∧ d) ∨ (c ∧ d)(多数) 0x8F1BBCDC
60-79 b ⊕ c ⊕ d(异或) 0xCA62C1D6
  • 更新变量

e = d
d = c
c = ROTL30(b)
b = a
a = temp

  1. 更新哈希值
  • 处理完80轮后,累加结果到初始哈希值

H0 = H0 + a
H1 = H1 + b
H2 = H2 + c
H3 = H3 + d
H4 = H4 + e
(所有加法为 模 232

生成最终哈希值

将 H0 到 H4 按大端顺序拼接为 160位 的哈希值,转换为40个十六进制字符。

示例:空字符串的SHA-1

  • 输入:空字符串(0位)。
  • 填充后:1个512位块,包含 0x80、447个 0 和64位的长度 0。
  • 哈希结果:da39a3ee5e6b4b0d3255bfef95601890afd80709