SHA-3 (Keccak) 海绵结构中的 \(\\iota\) (Iota) 步骤详解
题目描述:
在 SHA-3(Keccak)哈希算法的海绵结构中,每轮置换函数 Keccak-f 包含 5 个步骤:\(\\theta\) (Theta)、\(\\rho\) (Rho)、\(\\pi\) (Pi)、\(\\chi\) (Chi) 和 \(\\iota\) (Iota)。本题要求详细解释 \(\\iota\) 步骤的设计目标、具体计算过程、在轮函数中的作用,以及其如何为算法提供非线性性和轮常量差异。请结合状态数组的表示(三维数组 \(a[5][5][w]\),其中 \(w\) 为位宽,SHA-3 中 \(w=64\))逐步说明。
解题过程:
-
理解 Keccak-f 的整体结构
SHA-3 采用海绵结构,其核心是置换函数 Keccak-f[b],其中 \(b\) 是状态大小(例如 SHA3-256 使用 \(b=1600\) 位,对应 \(w=64\) 位/车道)。状态可视为 \(5×5×w\) 的三维位数组,逻辑上分为 25 条长度为 \(w\) 的“车道”(lane)。Keccak-f 包含 24 轮(对 \(b=1600\)),每轮进行上述 5 个步骤。\(\\iota\) 是最后一歩,其目的是向部分状态添加轮常量,破坏对称性并提供轮间差异。 -
\(\\iota\) 步骤的角色
- 前 4 个步骤(\(\\theta, \\rho, \\pi, \\chi\))是置换操作,对所有轮相同,具有对称性。若没有 \(\\iota\),不同轮的输出会呈现规律性,降低算法抗碰撞和原像攻击的能力。
- \(\\iota\) 通过将轮相关的常量加到状态的一个固定位置上,为每轮引入唯一“扰动”,打破对称性,增强算法的扩散性和非线性。
- 它只修改单个车道(\(a[0][0]\))的 \(w\) 位,计算极高效。
-
状态数组表示
将状态视为 \(a[x][y][z]\),其中 \(x, y \in \{0,1,2,3,4\}\) 表示平面坐标,\(z \in \{0,1,...,w-1\}\) 表示深度位索引。\(a[0][0]\) 是位于原点 \((x=0, y=0)\) 的车道,即一个 \(w\) 位的寄存器。 -
\(\\iota\) 的计算公式
对于第 \(i_r\) 轮(\(i_r\) 从 0 到 23),\(\\iota\) 执行:
\[ a[0][0] \leftarrow a[0][0] \oplus RC[i_r] \]
其中 \(RC[i_r]\) 是 \(w\) 位的轮常量,通过特定算法生成。注意:
- 仅 \(a[0][0]\) 车道被修改,其他 24 个车道不变。
- 运算是按位异或(\(\\oplus\)),作用于整个 \(w\) 位车道。
-
轮常量 \(RC[i_r]\) 的生成
\(RC[i_r]\) 由线性反馈移位寄存器(LFSR)生成,但最终以 64 位常量形式预计算。核心规则:- 对 \(t\) 从 0 到 \(\\ell\)(其中 \(\\ell = \\log_2 w\),SHA-3 中 \(w=64, \\ell=6\)),若满足条件 \(RC[t + 7i_r] = 1\),则设置 \(RC[i_r]\) 的第 \(2^t - 1\) 位为 1。
- 实际中,\(RC[i_r]\) 是 64 位值,其非零位位置由 \(t\) 决定。常用预计算值如下(十六进制,最低位为 \(z=0\)):
轮次 \(i_r\) \(RC[i_r]\) (64 位) 0 0x0000000000000001 1 0x0000000000008082 2 0x800000000000808A 3 0x8000000080008000 ... ... 23 0x800000000000808B - 这些常量设计为低汉明重量(少数位为 1),但仍保证每轮不同,且经多轮扩散影响整个状态。
-
步骤执行示例
假设第 2 轮 (\(i_r=2\)),\(RC[2] = 0x800000000000808A\)(64 位)。- 当前状态中车道 \(a[0][0]\) 的值为 64 位 \(V\)(例如 0x1234...)。
- 计算:\(a[0][0]_{\text{new}} = V \\oplus 0x800000000000808A\)。
- 结果中,\(V\) 的第 0、1、3、7、63 位(对应 0x808A 和最高位 0x8000...)翻转,其余位不变。
- 其他车道 \(a[x][y]\) (\((x,y) \neq (0,0)\)) 保持不变。
-
\(\\iota\) 的安全作用
- 破坏对称性:若不添加 \(RC\),Keccak-f 的轮函数完全对称,易受固定点攻击和简化轮次分析。
- 提供轮间差异:每轮不同常量使状态演化路径唯一,增强混淆。
- 非线性贡献:虽然 \(\\iota\) 本身是线性操作,但它与强非线性的 \(\\chi\) 步骤(前一歩)结合,通过后续轮的 \(\\theta, \\rho, \\pi, \\chi\) 将修改扩散到全状态。
- 轻量性:仅修改一个车道,计算代价极低,符合 SHA-3 的硬件高效设计。
-
整体轮函数的交互
一轮 Keccak-f 顺序为:\(\\theta \\rightarrow \\rho \\rightarrow \\pi \\rightarrow \\chi \\rightarrow \\iota\)。\(\\iota\) 在最后执行,确保其扰动输入到下一轮的 \(\\theta\) 步骤(\(\\theta\) 需对每列求和),从而快速扩散。经过 24 轮,\(a[0][0]\) 的微小变化会影响整个状态。
总结:
\(\\iota\) 是 Keccak-f 中实现轮间差异的关键步骤,通过向固定车道 \(a[0][0]\) 异或轮常量 \(RC[i_r]\),以极小开销打破对称性,增强算法安全性。其常量经精心设计,确保每轮扰动不同,并通过后续轮扩散至整个状态。