SHA-3 (Keccak) 海绵结构中的 θ (Theta) 步骤详解
1. 题目描述
SHA-3哈希算法基于“海绵结构”,其核心是一个置换函数 Keccak-f。这个置换函数由多轮操作组成,每轮包含五个步骤,分别用希腊字母表示:θ (Theta)、ρ (Rho)、π (Pi)、χ (Chi)、ι (Iota)。本次我们详细讲解其中的第一步——θ 步骤。θ步骤是一个“扩散”步骤,它的主要作用是将状态阵列中每个比特的信息扩散到其所在行和列的其他多个比特上,从而增加算法的雪崩效应。你需要理解θ步骤的数学定义、具体计算过程及其在设计中的作用。
2. 前置知识:Keccak的状态表示
在深入θ之前,必须先了解SHA-3如何表示其内部状态。
- SHA-3的状态可以被看作一个三维比特数组,其维度为 5 × 5 × w,其中w是“字长”,可以是1, 2, 4, 8, 16, 32, 64。在SHA-3标准中(如SHA3-256, SHA3-512),使用的状态大小是1600比特,即 w=64 (5 * 5 * 64 = 1600)。
- 这个三维数组可以想象成一个有5行(y坐标,0~4)和5列(x坐标,0~4)的平面,每个位置(称为一个“道”)不是一个比特,而是一个长度为w比特的“道字”。深度方向(z坐标,0~63)对应道字中的比特位。
- 为了简化,我们可以把这个状态想象成64个并行的5x5比特平面(每个平面对应一个特定的z坐标)。θ步骤会独立地作用在这64个平面上(即按比特位并行处理),但计算时需要用到相邻平面的信息。
3. θ 步骤的计算过程
θ步骤可以看作一个两步计算:先计算“列奇偶”,再用它来修改状态。我们用 a[x][y][z] 表示状态,其中 x, y ∈ {0,1,2,3,4}, z ∈ {0,1,…,w-1}。计算按以下两式进行:
(1) 计算列奇偶 (Column Parity)
对于每一列(由x和z坐标确定),我们计算该列上5个比特(y从0到4)的“奇偶性”(即XOR和)。
\[ C[x, z] = a[x][0][z] \oplus a[x][1][z] \oplus a[x][2][z] \oplus a[x][3][z] \oplus a[x][4][z] \]
这里,C[x, z] 是一个比特,表示位于x列、z深度的那个垂直列的奇偶性。我们可以为每个(x, z)对(共5*w个)计算出一个C[x, z]。
(2) 计算列差异 (Column Diffuse)
接下来,我们计算两个相邻列的列奇偶的XOR,形成一个“列差异”向量。
\[ D[x, z] = C[x-1, z] \oplus C[x+1, z-1] \]
注意:
x-1和x+1是在模5的有限域内计算的。即,当x=0时,x-1=4;当x=4时,x+1=0。这反映了状态的循环结构。z-1是在模w的有限域内计算的。即,当z=0时,z-1=w-1。这使得信息也在“深度”或“z”方向上扩散。
(3) 更新状态
最后,用计算得到的D[x, z]去修改原始状态的每一个比特:
\[ a'[x][y][z] = a[x][y][z] \oplus D[x, z] \]
这里的a'[x][y][z]是θ步骤完成后的新状态比特。这个操作对所有的x, y, z(即状态的所有1600个比特)并行执行。
4. 分步计算示例(简化场景)
为了让你彻底明白,我们构造一个极简化的例子。假设w=1(即状态是5x5x1=25比特),这样就没有z维度了,计算就简化为平面。状态a[x][y]和中间量C[x]、D[x]都只有一个比特。
假设状态某一行(y固定)的切片如下(仅为示例,值随机):
y=0: [1, 0, 1, 0, 1]
y=1: [0, 1, 0, 1, 0]
y=2: [1, 0, 0, 1, 1]
y=3: [0, 1, 1, 0, 0]
y=4: [1, 0, 1, 0, 1]
我们用列索引 x=0,1,2,3,4。
步骤1: 计算列奇偶 C[x]
- C[0] = a[0][0]⊕a[0][1]⊕a[0][2]⊕a[0][3]⊕a[0][4] = 1⊕0⊕1⊕0⊕1 = 1
- C[1] = 0⊕1⊕0⊕1⊕0 = 0
- C[2] = 1⊕0⊕0⊕1⊕1 = 1
- C[3] = 0⊕1⊕1⊕0⊕0 = 0
- C[4] = 1⊕0⊕1⊕0⊕1 = 1
所以 C = [1, 0, 1, 0, 1]
步骤2: 计算列差异 D[x]
- D[0] = C[4] ⊕ C[1] = 1 ⊕ 0 = 1
- D[1] = C[0] ⊕ C[2] = 1 ⊕ 1 = 0
- D[2] = C[1] ⊕ C[3] = 0 ⊕ 0 = 0
- D[3] = C[2] ⊕ C[4] = 1 ⊕ 1 = 0
- D[4] = C[3] ⊕ C[0] = 0 ⊕ 1 = 1
所以 D = [1, 0, 0, 0, 1]
步骤3: 更新状态 a'[x][y] = a[x][y] ⊕ D[x]
对于每一列x,该列的所有5个比特(y=0..4)都要与同一个D[x]进行异或。
- 对于列 x=0, D[0]=1。该列原值 [1,0,1,0,1] 变成 [1⊕1, 0⊕1, 1⊕1, 0⊕1, 1⊕1] = [0,1,0,1,0]
- 对于列 x=1, D[1]=0。该列原值 [0,1,0,1,0] 保持不变 [0,1,0,1,0]
- 对于列 x=2, D[2]=0。该列原值 [1,0,0,1,1] 保持不变 [1,0,0,1,1]
- 对于列 x=3, D[3]=0。该列原值 [0,1,1,0,0] 保持不变 [0,1,1,0,0]
- 对于列 x=4, D[4]=1。该列原值 [1,0,1,0,1] 变成 [1⊕1, 0⊕1, 1⊕1, 0⊕1, 1⊕1] = [0,1,0,1,0]
θ步骤完成后,新的状态行(y=0..4)变为:
y=0: [0, 0, 1, 0, 0]
y=1: [1, 1, 0, 1, 1]
y=2: [0, 0, 0, 1, 0]
y=3: [1, 1, 1, 0, 1]
y=4: [0, 0, 1, 0, 0]
可以看到,即使D[x]只改变了x=0和x=4两列,但因为C[x]的计算依赖于整个列,实际上原状态中任何一个比特的改变,都可能通过C和D的计算,影响到多达11个其他比特(该比特所在列的5个比特,以及相邻列的5+1个比特),这就是θ步骤强大的扩散能力。
5. 作用与设计目标
- 长程扩散:θ步骤确保状态中任何一个单比特的变化,在经过一步后,能够影响到其所在列的所有比特(5个),以及其相邻列的多个比特(最多6个)。在完整的Keccak-f轮函数中(结合后续的ρ, π, χ),这种扩散效应会在多轮后传播到整个状态。
- 增加代数复杂度:它与后续的线性步骤(ρ, π)和非线性步骤(χ)紧密结合,共同构成了置换函数的高代数次数和抗密码分析能力。
- 对称性与效率:θ步骤的定义是高度对称和规则的,非常适合硬件并行实现(按z平面并行)和软件优化。
总结:SHA-3的θ步骤是一个精巧的线性扩散层。它通过计算列的全局奇偶性(C),再将其与相邻列的奇偶性组合成差异值(D),最后用这个差异值去扰动当前列的每一个比特。这个过程在二维平面(x-y)和深度方向(z)上同时建立了紧密的联系,是SHA-3算法具备强大混淆和扩散性质的基础第一步。