SHA-3(Keccak)海绵结构的吸收与挤压过程
题目描述
SHA-3(Keccak)是美国国家标准与技术研究院(NIST)于2015年发布的标准哈希算法,其核心结构称为海绵结构(Sponge Construction)。该结构通过多轮置换操作对输入消息进行吸收(Absorbing)和挤压(Squeezing),生成任意长度的哈希值。本题要求详细解释海绵结构的工作流程,包括状态矩阵的初始化、吸收阶段的消息处理、挤压阶段的输出生成,以及Keccak-f置换函数的作用。
解题过程
1. 海绵结构的基本原理
海绵结构由以下部分组成:
- 状态内存:一个固定大小的二进制状态(记为\(b\)比特),分为速率(Rate, \(r\))和容量(Capacity, \(c\))两部分,满足\(b = r + c\)。SHA-3标准中\(b = 1600\)比特(对应5×5×64的三维矩阵)。
- 吸收阶段:将消息分块与状态速率部分进行异或,并通过置换函数混合数据。
- 挤压阶段:从状态速率部分提取输出块,若需更长输出则继续置换并提取。
设计目标:容量\(c\)决定安全性(抗碰撞能力),速率\(r\)影响处理效率。
2. 状态初始化与消息填充
- 状态初始化:所有比特初始化为0。
- 消息填充:
- 将输入消息转换为二进制并添加填充位,确保填充后总长度是\(r\)的整数倍。
- SHA-3填充规则:添加比特“1”,随后补“0”直至长度满足\((消息长度 + 2) \mod r = 0\),最后追加一个比特“1”。
示例:若消息长度为5比特,\(r = 8\),则填充后为消息 + 1 + 00...0 + 1,总长度=8的倍数。
3. 吸收阶段(Absorbing)
按以下步骤循环处理每个消息块(每个块长\(r\)比特):
- 异或操作:将当前消息块与状态的前\(r\)比特(速率部分)按位异或。
- 置换操作:对完整状态(\(b\)比特)执行Keccak-f置换函数(见第5步),混合速率与容量部分。
- 重复直至所有消息块处理完毕。
关键点:每次置换后,消息比特与容量部分充分混淆,确保输出不可逆。
4. 挤压阶段(Squeezing)
- 从当前状态的前\(r\)比特直接提取作为第一组输出。
- 若需更多输出(如SHA-3-256需256比特):
- 对状态执行Keccak-f置换。
- 继续提取下\(r\)比特作为输出,直至满足长度要求。
- 最终截取指定长度(如256比特)作为哈希值。
5. Keccak-f置换函数详解
Keccak-f是海绵结构的核心,对1600比特状态进行24轮(对于\(b=1600\))操作。每轮包含5个步骤(记状态为5×5×64的三维数组\(A[x][y][z]\),其中\(0 \leq x, y \leq 4, 0 \leq z \leq 63\)):
-
θ(Theta):基于列奇偶性添加扩散。
- 计算\(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]\)。
- 计算\(D[x][z] = C[x-1][z] \oplus C[x+1][z-1]\)。
- 更新\(A[x][y][z] = A[x][y][z] \oplus D[x][z]\)。
-
ρ(Rho):对每个lane(固定\(x, y\)的64比特)进行循环移位,移位偏移量由预定义表确定。
-
π(Pi):重新排列lane的位置,\(A'[x][y] = A[(x+3y) \mod 5][x]\)。
-
χ(Chi):按位非线性变换,\(A'[x][y][z] = A[x][y][z] \oplus (( \neg A[x+1][y][z]) \land A[x+2][y][z])\)。
-
ι(Iota):向第一lane(\(A[0][0]\))添加轮常数,打破对称性。
6. 实例说明(简化版)
假设\(r=8, c=2\)(状态共10比特),消息为1101(填充后为1101 + 1 + 000 + 1 = 11011001,长度8比特):
- 初始状态:
0000000000。 - 吸收:
- 消息块
11011001与状态前8比特异或 → 状态=11011001 00。 - 执行Keccak-f置换(简化模拟)混合数据。
- 消息块
- 挤压:直接输出前8比特(若需更短哈希则截断)。
总结
SHA-3的海绵结构通过吸收-挤压流程和Keccak-f置换,实现了可变长度输出与高安全性。其灵活性支持哈希、认证加密等应用,且无长度扩展攻击问题。