SHA-1哈希算法的压缩函数设计详解
题目描述
SHA-1(Secure Hash Algorithm 1)是一种曾广泛使用的密码哈希函数,其核心是压缩函数。本题目将详细解析SHA-1压缩函数的结构、运算步骤及设计原理。SHA-1压缩函数的作用是:在每个处理步骤中,将512位的消息分组与160位的中间哈希值(链变量)混合,输出新的160位哈希值。最终,经过多轮压缩后得到160位的消息摘要。我们将循序渐进地拆解其设计细节,确保你完全理解每一步。
解题过程
SHA-1压缩函数基于Merkle-Damgård结构构建。其设计包含以下关键部分:链变量的初始化、消息扩展生成80个32位字、80轮迭代运算(每轮使用不同的逻辑函数和常数),以及最后的链变量更新。我们按步骤展开:
步骤1:输入与链变量准备
压缩函数的输入有两个:
- 当前链变量(H⁽ⁱ⁾):160位,分为5个32位字,记作A, B, C, D, E。初始时(第一个分组),H⁽⁰⁾为固定的初始向量IV;处理后续分组时,H⁽ⁱ⁾为上一分组的输出。
- 当前消息分组(M⁽ⁱ⁾):512位,分为16个32位字,记作W₀到W₁₅。
压缩前,先将链变量H⁽ⁱ⁾的5个字赋给5个工作变量a, b, c, d, e:
a = A, b = B, c = C, d = D, e = E。
这5个工作变量将在80轮迭代中不断更新。
步骤2:消息扩展(生成80个32位字Wₜ)
SHA-1将16个输入字W₀…W₁₅扩展为80个字W₀…W₇₉,供80轮迭代使用。扩展规则为:
- 对于t = 0到15:Wₜ直接取自M⁽ⁱ⁾的16个字。
- 对于t = 16到79:Wₜ = (Wₜ₋₃ ⊕ Wₜ₋₈ ⊕ Wₜ₋₁₄ ⊕ Wₜ₋₁₆) <<< 1。
这里⊕表示32位异或,<<< 1表示循环左移1位。此扩展增加了消息的扩散性,使每个输入位影响更多轮。
步骤3:80轮迭代运算(核心压缩)
迭代进行t = 0到79,每轮更新工作变量a, b, c, d, e。每轮使用:
-
轮函数fₜ(b, c, d):根据轮数t选择不同的逻辑函数(均对32位字操作):
- 0 ≤ t ≤ 19:fₜ = (b ∧ c) ∨ (¬b ∧ d) (IF函数:若b为真则c,否则d)。
- 20 ≤ t ≤ 39:fₜ = b ⊕ c ⊕ d (XOR函数)。
- 40 ≤ t ≤ 59:fₜ = (b ∧ c) ∨ (b ∧ d) ∨ (c ∧ d) (多数函数)。
- 60 ≤ t ≤ 79:fₜ = b ⊕ c ⊕ d (同XOR函数)。
-
加法常数Kₜ:每20轮使用一个不同的32位常量(十六进制):
- 0 ≤ t ≤ 19:Kₜ = 0x5A827999。
- 20 ≤ t ≤ 39:Kₜ = 0x6ED9EBA1。
- 40 ≤ t ≤ 59:Kₜ = 0x8F1BBCDC。
- 60 ≤ t ≤ 79:Kₜ = 0xCA62C1D6。
这些常数源自2的平方根的小数部分,用于消除对称性。
-
单轮更新计算:
对当前t,计算:
temp = (a <<< 5) + fₜ(b, c, d) + e + Kₜ + Wₜ。
其中+是模2³²加法,<<< 5是循环左移5位。
然后更新工作变量:
e = d
d = c
c = b <<< 30 // 循环左移30位
b = a
a = temp
注意:b在赋给c前先移30位,这是SHA-1的独特设计,增加非线性。如此重复80轮,a, b, c, d, e被逐步混合。
步骤4:更新链变量
80轮后,将迭代结果与初始链变量相加(模2³²):
A' = A + a
B' = B + b
C' = C + c
D' = D + d
E' = E + e
得到的A', B', C', D', E'即为新链变量H⁽ⁱ⁺¹⁾(160位输出),将作为下一分组的输入或最终哈希值。
设计要点总结
- 压缩函数确保雪崩效应:消息或链变量的微小变化会扩散到所有输出位。
- 80轮设计平衡安全与效率,但后来发现其抗碰撞能力不足(2017年被实际攻破),已不推荐使用。
- 扩展和轮函数设计增强非线性,但轮数较少和结构简单导致漏洞。
通过以上步骤,你应能理解SHA-1压缩函数如何将512位消息与160位状态压缩为新的160位哈希。其设计体现了经典哈希函数的思路,但也在密码学演进中暴露了局限性。