SHA-1哈希算法的压缩函数设计
题目描述
SHA-1(Secure Hash Algorithm 1)是一种广泛使用的密码杂凑算法,其核心是压缩函数。该函数将512位的消息分组和160位的中间哈希值作为输入,通过80轮迭代运算,输出新的160位哈希值。本题要求详细分析SHA-1压缩函数的结构、轮函数设计、非线性逻辑函数及常量生成规则,并逐步演示其计算过程。
1. 压缩函数的输入与初始化
- 输入:
- 160位(5个32位字)的中间状态:\(H_0, H_1, H_2, H_3, H_4\)(初始值为固定常量,后续迭代依赖前一轮输出)。
- 512位的消息分组 \(M\),通过填充和分块后得到。
- 消息扩展:
将512位消息划分为16个32位字 \(W[0]\) 到 \(W[15]\),并通过线性递归扩展为80个字:
\[ W[t] = (W[t-3] \oplus W[t-8] \oplus W[t-14] \oplus W[t-16]) \lll 1, \quad t=16 \dots 79 \]
其中 \(\lll\) 表示循环左移。
2. 轮函数结构(80轮迭代)
每轮操作更新5个32位变量 \(A, B, C, D, E\)(初始值为 \(H_0\) 到 \(H_4\)):
-
非线性函数 \(f_t\):每20轮切换一次逻辑函数(共4种):
- \(0 \le t \le 19\):\(f_t = (B \land C) \oplus (\lnot B \land D)\)(IF函数)
- \(20 \le t \le 39\):\(f_t = B \oplus C \oplus D\)(XOR函数)
- \(40 \le t \le 59\):\(f_t = (B \land C) \oplus (B \land D) \oplus (C \land D)\)(MAJ函数)
- \(60 \le t \le 79\):\(f_t = B \oplus C \oplus D\)(同XOR函数)
-
常量 \(K_t\):每20轮使用一个固定十六进制常量:
- \(t=0-19\):\(K_t = \text{0x5A827999}\)
- \(t=20-39\):\(K_t = \text{0x6ED9EBA1}\)
- \(t=40-59\):\(K_t = \text{0x8F1BBCDC}\)
- \(t=60-79\):\(K_t = \text{0xCA62C1D6}\)
-
单轮运算步骤:
\[ \begin{aligned} \text{Temp} &= (A \lll 5) + f_t(B,C,D) + E + K_t + W[t], \\ E &= D, \\ D &= C, \\ C &= B \lll 30, \\ B &= A, \\ A &= \text{Temp}. \end{aligned} \]
所有加法均为模 \(2^{32}\) 加法。
3. 最终输出
完成80轮后,将 \(A, B, C, D, E\) 与初始的 \(H_0\) 到 \(H_4\) 按字模加:
\[H_i^{\text{new}} = H_i + A_i \quad (i=0,\dots,4) \]
结果作为下一分组的输入或最终哈希值。
4. 安全性简析
SHA-1的压缩函数因以下缺陷已被淘汰:
- 80轮迭代的线性消息扩展易受差分攻击(如2017年实际碰撞攻击)。
- 160位输出长度抗碰撞强度不足(生日攻击复杂度约 \(2^{80}\),但实际攻击已远低于此)。
通过此设计,可理解经典哈希函数如何通过非线性函数、循环移位和模加实现扩散和混淆。