SHA-256哈希算法的压缩函数设计
题目描述
SHA-256的压缩函数是其核心组件,负责将512比特的消息分组和256比特的中间哈希值混合,生成新的256比特哈希值。要求详细解释压缩函数的结构、运算步骤及每步的设计原理。
解题过程
1. 压缩函数输入与初始化
- 输入参数:
- 512比特的消息分组(划分为16个32比特字,记为 \(W_0 \sim W_{15}\))。
- 256比特的中间哈希值(划分为8个32比特寄存器,记为 \(a, b, c, d, e, f, g, h\))。
- 初始化:将中间哈希值加载到寄存器中,作为本轮压缩的初始状态。
2. 消息扩展(Message Expansion)
- 目的:将16个32比特字 \(W_0 \sim W_{15}\) 扩展为64个32比特字 \(W_0 \sim W_{63}\),以增加算法的非线性性和扩散性。
- 扩展公式:
\[ W_t = \begin{cases} W_t & 0 \leq t \leq 15 \\ \sigma_1(W_{t-2}) + W_{t-7} + \sigma_0(W_{t-15}) + W_{t-16} & 16 \leq t \leq 63 \end{cases} \]
- 其中:
\[ \sigma_0(x) = (x \ggg 7) \oplus (x \ggg 18) \oplus (x \gg 3) \]
\[ \sigma_1(x) = (x \ggg 17) \oplus (x \ggg 19) \oplus (x \gg 10) \]
- 符号说明:
- \(\ggg\) 表示循环右移(rotate right),\(\gg\) 表示逻辑右移(shift right)。
- 加法操作在模 \(2^{32}\) 下进行。
- 设计原理:通过位移和异或操作,使消息比特充分混合,避免局部相关性。
3. 压缩循环(64轮迭代)
每轮迭代更新寄存器 \(a \sim h\) 的值,步骤如下:
步骤1:计算临时变量 \(T_1\) 和 \(T_2\)
\[T_1 = h + \Sigma_1(e) + \text{Ch}(e, f, g) + K_t + W_t \]
\[T_2 = \Sigma_0(a) + \text{Maj}(a, b, c) \]
- 分量说明:
- 选择函数(Ch):
\[ \text{Ch}(e, f, g) = (e \land f) \oplus (\neg e \land g) \]
根据 $ e $ 的比特值选择 $ f $ 或 $ g $ 的比特,增加非线性。
- 多数函数(Maj):
\[ \text{Maj}(a, b, c) = (a \land b) \oplus (a \land c) \oplus (b \land c) \]
输出三个输入比特的多数值,增强扩散性。
- 求和函数(Σ):
\[ \Sigma_0(x) = (x \ggg 2) \oplus (x \ggg 13) \oplus (x \ggg 22) \]
\[ \Sigma_1(x) = (x \ggg 6) \oplus (x \ggg 11) \oplus (x \ggg 25) \]
通过循环位移实现比特扩散。
- 轮常数 \(K_t\):预定义的64个32比特常量,源自素数立方根的小数部分,消除对称性。
步骤2:更新寄存器
- 寄存器值向右移动(\(h \leftarrow g, g \leftarrow f, \dots, b \leftarrow a\)),并更新 \(a\) 和 \(e\):
\[ a = T_1 + T_2, \quad e = d + T_1 \]
- 其他寄存器直接继承前一轮的值(例如 \(d \leftarrow c\))。
- 设计原理:通过循环移位和模加操作,确保每比特影响多个寄存器,实现雪崩效应。
4. 最终输出
- 迭代完成后,将新的寄存器值与初始中间哈希值按模 \(2^{32}\) 相加,得到本轮压缩结果:
\[H_{\text{new}} = (a + a_0, b + b_0, \dots, h + h_0) \]
- 设计原理:通过反馈机制(Davies-Meyer结构)将消息分组与当前状态绑定,增强抗碰撞性。
关键设计要点
- 非线性性:由 Ch 和 Maj 函数提供,避免线性漏洞。
- 扩散性:通过 Σ 函数和消息扩展实现比特的广泛混合。
- 安全性:压缩函数需满足抗碰撞、抗原像攻击等性质,依赖充分的轮次(64轮)和复杂的位操作。
通过以上步骤,SHA-256的压缩函数实现了高强度哈希计算,确保对输入微小变化产生显著输出差异。