Keccak 算法详解

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):非线性变换(位级异或与取反)。

对每行元素执行:sxy = sxy ^ ((~sx+1y) & sx+2y)。

ι(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 χ 步骤(非线性变换)

对每行元素进行位级运算:

sxy = sxy ^ ((~sx+1y) & sx+2y)

(其中 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 纳入后量子密码标准,用于数字签名和密钥交换。

相关推荐
YHHLAI8 分钟前
LeetCode 1.两数之和 | 从暴力枚举到线性优化
算法·leetcode·职场和发展
Urbano10 分钟前
工装标准缝纫流程及自动化升级提质增产方案
大数据·人工智能·算法
KaMeidebaby37 分钟前
卡梅德生物技术快报|biotin 生物素标记抗体全流程
前端·人工智能·算法·数据挖掘·数据分析
阳明山水42 分钟前
自下而上 vs 自上而下 vs 最优组合预测策略解析
大数据·人工智能·深度学习·算法·机器学习
keykey6.44 分钟前
从逻辑回归到 SVM:不仅仅是“分开“
算法·机器学习·支持向量机
QN1幻化引擎1 小时前
RingBuffer:用"循环缓冲区"干掉KV Cache的O(n)显存膨胀
算法·github
papership1 小时前
【入门级-算法-8、图论算法:泛洪算法 (Flood Fill)】
算法·图论
MartinYeung51 小时前
[论文学习]LLM 情境学习资料的快速精确遗忘技术:基于 In-Context Learning 与量化 K-Means 的 ERASE 方法
学习·算法·kmeans
林森lsjs1 小时前
【日耕一题】5. 青春常数(17届蓝桥杯C++B组第一题)
算法·蓝桥杯
Tisfy1 小时前
LeetCode 3838.带权单词映射:求和、取模、拼接(附python一行版)
python·算法·leetcode·字符串·题解·模拟·取模