SHA-3(Keccak)海绵结构中的填充规则(Pad10*1)详解
题目描述
SHA-3哈希算法采用海绵结构(Sponge Construction)处理任意长度的输入消息。在海绵结构中,消息需要经过填充(Padding)使其长度达到块长度(bitrate)的整数倍,以便分块吸收。Keccak使用的填充规则为“Pad101”,其核心是在消息末尾添加一个固定的比特序列,确保填充后消息长度满足要求。本题将详细解释Pad101规则的定义、作用、具体填充步骤及其在海绵结构中的必要性。
1. 海绵结构回顾
- 海绵结构包含两个阶段:吸收阶段(Absorbing Phase)和挤压阶段(Squeezing Phase)。
- 状态(State)由比特率(bitrate,记为 \(r\))和容量(capacity,记为 \(c\))组成,总宽度 \(b = r + c\)(例如SHA-3-256中 \(b=1600\) 比特,\(r=1088\),\(c=512\))。
- 吸收阶段:将填充后的消息分成长度为 \(r\) 的块,逐块与状态进行异或操作,并通过置换函数 \(f\)(Keccak-f)更新状态。
- 填充的目的是使消息长度恰好为 \(r\) 的整数倍,否则无法分块处理。
2. Pad10*1规则的定义
Pad10*1的填充模式可表示为:
\[\text{Pad10*1}(x, m) = 1 \| 0^m \| 1 \]
其中:
- \(x\) 是原始消息的最后一个比特(实际填充时无需显式使用)。
- \(m\) 是填充的“0”的个数,由规则动态计算。
- 填充序列总是以“1”开始,以“1”结束,中间包含 \(m\) 个“0”。
关键性质:
- 填充序列的长度为 \(m+2\) 比特(至少2比特,即“11”)。
- \(m\) 的值需满足:填充后的总消息长度是 \(r\) 的整数倍。
3. 填充步骤详解
假设原始消息长度为 \(l\) 比特,块长度(比特率)为 \(r\)。
步骤1:计算目标长度
目标是将消息填充到长度 \(l + \text{len(pad)}\) 满足:
\[(l + \text{len(pad)}) \mod r = 0 \]
即填充后长度是 \(r\) 的整数倍。
步骤2:确定填充序列
Pad10*1的填充序列为:
- 首先添加一个比特“1”。
- 然后添加 \(m\) 个比特“0”,其中 \(m\) 是满足以下条件的最小非负整数:
\[ (l + 1 + m + 1) \mod r = 0 \]
即 \(l + m + 2 \equiv 0 \ (\text{mod} \ r)\)。
3. 最后添加一个比特“1”。
步骤3:动态计算 \(m\)
由方程解出:
\[m = (-l - 2) \mod r \]
注意:\((-l - 2) \mod r\) 等价于 \(r - (l + 2) \mod r\)(若余数非零)。
- 例如,若 \(r=8\),\(l=10\):
\((-10-2) \mod 8 = (-12) \mod 8 = 4\)(因为 \(-12 + 16 = 4\))。
则填充序列为:1 ‖ 0000 ‖ 1(共6比特),填充后总长度 \(10+6=16\),是8的倍数。
4. 为什么需要Pad10*1?
- 唯一性编码:Pad10*1确保不同长度的消息填充后结果不同。例如,消息“01”和“010”填充后不会相同,因为末尾的“1”标记了消息结束边界。
- 避免长度扩展攻击:海绵结构本身对长度扩展攻击有抵抗力,但明确的边界标记(开头和结尾的“1”)增强了安全性。
- 兼容海绵结构:填充后的消息可被均匀分块,且最后一块的异或操作能通过“10*1”模式与状态充分混合。
5. 实例演示(简化参数)
假设 \(r=8\),消息为二进制串 \(M = 0110\ 1101\)(长度 \(l=8\))。
- 计算 \(m\):
\(m = (-8-2) \mod 8 = (-10) \mod 8 = 6\)(因为 \(-10 + 16 = 6\))。 - 填充序列 = 1 ‖ 000000 ‖ 1(共8比特)。
- 填充后消息:\(0110\ 1101 \| 1\ 000000\ 1 = 0110\ 1101\ 1000\ 0001\)。
- 总长度 \(8+8=16\),是8的倍数,可分块为 \([0110\ 1101]\) 和 \([1000\ 0001]\)。
6. 与SHA-3标准的关系
在FIPS 202标准中,SHA-3的填充规则实际为:
\[\text{Pad10*1} = 1 \| 0^m \| 1 \]
但注意:在Keccak原始算法中,填充末尾的“1”会被吸收阶段的最后一块处理,确保状态与消息完全绑定。此设计避免了固定后缀导致的哈希冲突。
总结
Pad101是SHA-3海绵结构中的关键步骤,通过动态计算填充0的个数,使消息适应分块处理。其“1-0-1”模式保证了消息边界唯一性,是算法安全性的基础之一。