Keccak 是一种基于海绵结构(Sponge Construction)的密码哈希算法,由比利时密码学家团队设计,2012 年被美国 NIST 选为 SHA-3 标准的核心算法。其核心特点是通过灵活的参数配置和独特的置换函数,实现了高安全性、抗量子攻击能力和广泛的适用性。
1 核心设计原理:海绵结构
Keccak 的核心是海绵结构,其设计灵感来源于海绵吸水与挤水的过程,分为两个阶段:
1. 1 吸收阶段(Absorbing)
- 分块处理:将输入消息填充后按比特率(r)分块,依次与内部状态的前 r 位异或。
- 状态更新:每异或一个块后,应用Keccak-f 置换函数(24 轮复杂变换),将消息特征扩散到整个状态矩阵。
1. 2 挤压阶段(Squeezing)
- 生成输出:从状态矩阵的前 r 位提取输出,若需更多位,重复应用 Keccak-f 置换并继续提取。
- 任意长度支持:通过多次挤压,可生成任意长度的哈希值(如 SHAKE128/SHAKE256)。
1. 3 参数定义
- 状态大小(b):固定为 1600 位(5×5 的 64 位矩阵),但 Keccak 允许自定义 b 值。
- 比特率(r):决定每次吸收 / 挤压的块大小,与输出长度相关(如 SHA3-512 的 r=576 位)。
- 容量(c):安全冗余位(c = b - r),理论上 c 需为输出长度的 2 倍以确保抗碰撞性。
2 详细流程解析
2. 1 消息填充(Pad10*1 规则)
- 步骤 1:在消息末尾添加二进制串 "011"(0x06)。
- 步骤 2:补 0 直到总长度满足 (原始长度 + 3 + k) ≡ 0 mod r。
- 步骤 3:将最后一个字节的最高位置 1(即添加 "1")。
- 示例:若原始消息为 575 位(r=576),填充后变为 577 位(575+3+0+1),需拆分为两个块(576+1 位)。
2. 2 状态初始化
内部状态矩阵初始化为全 0 的 5×5×64 位立方体。
2. 3 吸收阶段
分块异或:将填充后的消息按 r 位分块,依次与状态矩阵的前 r 位异或。
Keccak-f 置换:每异或一个块后,执行 24 轮置换,包括以下步骤:
θ(Theta):列间异或与循环移位,实现线性扩散。
计算每列的异或和,与相邻列异或后循环右移 1 位。
ρ(Rho):对每个元素进行特定偏移量的循环右移。
如第 (x,y) 元素旋转 (x+1)(y+1) 位。
π(Pi):行内元素位置置换。
第 x 行的元素 y 移动到位置 (2x+3y) mod 5。
χ(Chi):非线性变换(位级异或与取反)。
对每行元素执行:s[x][y] = s[x][y] ^ ((~s[x+1][y]) & s[x+2][y])。
ι(Iota):添加轮常数,打破对称性。
与轮常数(RC [r])异或,RC [r] 由 LFSR 生成,每轮不同。
2. 4 挤压阶段
提取输出:从状态矩阵的前 r 位提取输出,若需更多位,重复以下操作:
- 应用 Keccak-f 置换。
- 继续提取 r 位,直至总长度达标。
3 Keccak-f 置换函数详解
Keccak-f 是海绵结构的核心变换,每轮包含五个步骤:
3. 1 θ 步骤(列扩散)
- 列异或:对每列 5 个元素求和,再与相邻列异或。
- 循环移位:将结果循环右移 1 位,再次异或回原列。
3.2 ρ 步骤(元素旋转)
每个元素按预设的偏移量(如第 (x,y) 元素旋转 (x+1)(y+1) 位)进行循环右移。
3. 3 π 步骤(行置换)
行内元素按固定置换表重新排列(如第 x 行的元素 y 移动到位置 (2x+3y) mod 5)。
3. 4 χ 步骤(非线性变换)
对每行元素进行位级运算:
s[x][y] = s[x][y] ^ ((~s[x+1][y]) & s[x+2][y])
(其中 x+1、x+2 取模 5)。
3. 5 ι 步骤(轮常数注入)
与轮常数(RC [r])异或,RC [r] 由 LFSR 生成,每轮不同34。
4 参数灵活性与标准化差异
4. 1 Keccak vs SHA-3
填充规则:
- Keccak 支持多种填充方式(如 Pad10*1、XOF 填充)。
- SHA-3 强制使用 Pad10*1 规则,并固定 b=1600 位610。
参数配置:
- Keccak 允许自定义 b、r、c(如 b=2000 位)。
- SHA-3 仅支持 b=1600 位,并预设四种输出长度(224、256、384、512 位)。
4. 2 应用差异
- 以太坊:使用 Keccak-256 生成账户地址和区块哈希,未采用标准化的 SHA-3 填充规则。
- SHAKE 函数:Keccak 的扩展模式(如 SHAKE128)支持任意长度输出,用于密钥派生和伪随机数生成。
5 安全性与抗攻击特性
抗碰撞性:
理论抗碰撞强度为 2^(c/2),例如 SHA3-512 的 c=1024 位,抗碰撞强度为 2512。
海绵结构通过容量 c 隔离消息块间的关联性,避免长度扩展攻击。
抗量子攻击:
对 Grover 算法(量子碰撞攻击)的抵抗力优于 MD 结构算法,因海绵结构的扩散性更强。
双射性质:
置换函数 Keccak-f 是双射(一一映射),确保每轮变换可逆,增强安全性。
6 应用场景
区块链技术:
以太坊、Filecoin 等采用 Keccak 生成账户地址和区块哈希。
抗量子特性为未来区块链安全提供保障。
数据完整性校验:
大型文件传输(如备份、分布式存储)中校验数据一致性。
密码学协议:
TLS 1.3 协议中用于密钥派生和消息认证。
零知识证明、数字签名等场景。
密码存储:
加盐哈希存储用户密码,防止彩虹表攻击。
7 与其他算法的对比
|------|------------------|-------------------|-------------------|
| 特性 | Keccak | SHA-2(SHA-512) | SHA-1 |
| 结构 | 海绵结构 | Merkle-Damgård 结构 | Merkle-Damgård 结构 |
| 抗碰撞 | 2^512(SHA3-512) | 2^256 | 2^61(实际) |
| 并行能力 | 高(硬件加速友好) | 中 | 低 |
| 输出长度 | 任意(通过挤压) | 固定(512 位) | 固定(160 位) |
| 抗量子 | 强 | 中 | 弱 |
8 未来挑战与发展
量子计算威胁:
Grover 算法可将 SHA3-512 的碰撞攻击复杂度降低至 2256,但仍高于现有安全需求。
Keccak 的海绵结构设计使其比 MD 结构算法更具抗量子潜力。
标准化演进:
NIST 计划将 Keccak 纳入后量子密码标准,用于数字签名和密钥交换。