SHA-256哈希算法的轮函数设计
我将详细讲解SHA-256哈希算法的轮函数设计。SHA-256是SHA-2家族中的重要成员,其轮函数是整个压缩函数的核心组成部分。
题目描述
SHA-256的轮函数是一个迭代64次的非线性函数,每轮处理512位消息块的一部分和当前哈希状态。轮函数的设计基于Davies-Meyer结构,包含位运算、模加运算和逻辑函数。
预备知识
在深入轮函数前,需要了解几个基本组件:
-
位运算符号:
- ⊕:按位异或
- ∧:按位与
- ∨:按位或
- ¬:按位取反
- ≫:循环右移
- ≫:逻辑右移
- ⋙:循环右移(带指定位数)
-
模加运算:
所有加法都是模2³²加法
轮函数详细设计
步骤1:逻辑函数定义
轮函数使用4个逻辑函数:
Ch(选择)函数:
Ch(x, y, z) = (x ∧ y) ⊕ (¬x ∧ z)
功能:根据x的值选择y或z。如果x的某位为1,选择y的对应位;如果为0,选择z的对应位。
Maj(多数)函数:
Maj(x, y, z) = (x ∧ y) ⊕ (x ∧ z) ⊕ (y ∧ z)
功能:输出三个输入中多数值的位。即某位上1的数量多于0时输出1,否则输出0。
Σ₀(大写Sigma0)函数:
Σ₀(x) = (x ⋙ 2) ⊕ (x ⋙ 13) ⊕ (x ⋙ 22)
功能:对输入进行循环右移和异或混合。
Σ₁(大写Sigma1)函数:
Σ₁(x) = (x ⋙ 6) ⊕ (x ⋙ 11) ⊕ (x ⋙ 25)
功能:另一种循环右移和异或混合。
步骤2:小写sigma函数
轮函数还使用两个消息调度函数:
σ₀(小写sigma0)函数:
σ₀(x) = (x ⋙ 7) ⊕ (x ⋙ 18) ⊕ (x ≫ 3)
注意:这里包含逻辑右移(≫)
σ₁(小写sigma1)函数:
σ₁(x) = (x ⋙ 17) ⊕ (x ⋙ 19) ⊕ (x ≫ 10)
步骤3:轮函数主体结构
每轮处理包含以下步骤:
设当前状态为8个32位变量:a, b, c, d, e, f, g, h
当前轮的消息字为Wₜ,轮常数为Kₜ
单轮计算过程:
-
计算T1:
T1 = h + Σ₁(e) + Ch(e, f, g) + Kₜ + Wₜ -
计算T2:
T2 = Σ₀(a) + Maj(a, b, c) -
更新状态变量:
h = g g = f f = e e = d + T1 d = c c = b b = a a = T1 + T2
步骤4:消息扩展
在轮函数执行前,需要将512位消息块扩展为64个32位消息字Wₜ:
对于t = 0到15:
Wₜ = 消息块的32位字
对于t = 16到63:
Wₜ = σ₁(Wₜ₋₂) + Wₜ₋₇ + σ₀(Wₜ₋₁₅) + Wₜ₋₁₆
步骤5:轮常数Kₜ
SHA-256使用64个32位轮常数Kₜ,这些常数取自前64个质数的立方根的小数部分的前32位。
完整轮函数示例
假设我们处理第t轮:
输入:
- 当前状态:a, b, c, d, e, f, g, h
- 消息字:Wₜ
- 轮常数:Kₜ
计算过程:
-
计算临时变量T1:
T1 = h + (e ⋙ 6 ⊕ e ⋙ 11 ⊕ e ⋙ 25) + ((e ∧ f) ⊕ (¬e ∧ g)) + Kₜ + Wₜ -
计算临时变量T2:
T2 = (a ⋙ 2 ⊕ a ⋙ 13 ⊕ a ⋙ 22) + ((a ∧ b) ⊕ (a ∧ c) ⊕ (b ∧ c)) -
更新状态:
h = g g = f f = e e = d + T1 d = c c = b b = a a = T1 + T2
安全性考虑
轮函数设计具有以下安全特性:
- 非线性性:Ch和Maj函数提供非线性
- 扩散性:Σ函数和消息扩展确保输入位的快速扩散
- 抗碰撞性:复杂的轮结构使得寻找碰撞计算困难
通过64轮这样的迭代,SHA-256能够对任意长度消息产生唯一的256位哈希值,具有很好的抗碰撞性和原像抵抗性。