SHA-256哈希算法的压缩函数设计详解
字数 1189 2025-11-16 17:44:19
SHA-256哈希算法的压缩函数设计详解
我将为您讲解SHA-256哈希算法中核心的压缩函数设计。这个压缩函数是SHA-256安全性的关键所在,它负责处理每个消息块并更新哈希值。
1. 压缩函数的基本结构
SHA-256的压缩函数采用Merkle-Damgård结构,每个消息块经过64轮迭代处理。压缩函数接收两个输入:
- 当前哈希值H⁽ⁱ⁻¹⁾(256位,分为8个32位字:A,B,C,D,E,F,G,H)
- 当前消息块Wₜ(512位,扩展为64个32位字)
经过64轮处理后,输出新的哈希值H⁽ⁱ⁾。
2. 压缩函数的轮操作
每一轮操作都包含以下步骤:
步骤1:定义基本逻辑函数
- Ch(E,F,G) = (E AND F) ⊕ (¬E AND G)
- Maj(A,B,C) = (A AND B) ⊕ (A AND C) ⊕ (B AND C)
- Σ₀(A) = ROTR²(A) ⊕ ROTR¹³(A) ⊕ ROTR²²(A)
- Σ₁(E) = ROTR⁶(E) ⊕ ROTR¹¹(E) ⊕ ROTR²⁵(E)
其中ROTRⁿ表示循环右移n位。
步骤2:计算临时字T₁和T₂
- T₁ = H + Σ₁(E) + Ch(E,F,G) + Kₜ + Wₜ
- T₂ = Σ₀(A) + Maj(A,B,C)
其中Kₜ是第t轮的常量(前64个素数的立方根小数部分的前32位)。
步骤3:更新寄存器值
- H = G
- G = F
- F = E
- E = D + T₁
- D = C
- C = B
- B = A
- A = T₁ + T₂
3. 消息扩展过程
原始512位消息块被扩展为64个32位字Wₜ:
步骤1:前16个字
- W₀到W₁₅直接来自消息块(每个32位)
步骤2:后续48个字(t=16到63)
- σ₀(Wₜ₋₁₅) = ROTR⁷(Wₜ₋₁₅) ⊕ ROTR¹⁸(Wₜ₋₁₅) ⊕ SHR³(Wₜ₋₁₅)
- σ₁(Wₜ₋₂) = ROTR¹⁷(Wₜ₋₂) ⊕ ROTR¹⁹(Wₜ₋₂) ⊕ SHR¹⁰(Wₜ₋₂)
- Wₜ = σ₁(Wₜ₋₂) + Wₜ₋₇ + σ₀(Wₜ₋₁₅) + Wₜ₋₁₆
其中SHRⁿ表示逻辑右移n位。
4. 最终哈希值更新
完成64轮迭代后,新的哈希值计算为:
- H⁽ⁱ⁾ = H⁽ⁱ⁻¹⁾ + (A,B,C,D,E,F,G,H)
这里的加法是模2³²加法。
5. 安全设计要点
抗碰撞性保证:
- 非线性函数Ch和Maj提供充分的非线性
- 消息扩展确保雪崩效应
- 64轮迭代提供足够的扩散
常量设计:
- Kₜ来自数学常数,避免后门
- 不同轮使用不同常量,增强随机性
效率优化:
- 所有操作都是32位字操作
- 位运算在硬件上高效实现
- 流水线友好的设计结构
这个压缩函数设计通过复杂的非线性变换和充分的轮数,确保了SHA-256的抗碰撞性和原像攻击抵抗能力,是现代密码学哈希函数的经典设计。