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

对每行元素执行: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 纳入后量子密码标准,用于数字签名和密钥交换。

相关推荐
GeekPMAlex几秒前
Conetext learning 3 KV-cache的提升
算法
找不到、了1 小时前
Java排序算法之<选择排序>
数据结构·算法·排序算法
是店小二呀1 小时前
【动态规划-斐波那契数列模型】理解动态规划:斐波那契数列的递推模型
算法·动态规划·代理模式
小徐不徐说2 小时前
动态规划:从入门到精通
数据结构·c++·算法·leetcode·动态规划·代理模式
guguhaohao2 小时前
排序算法,咕咕咕
数据结构·算法·排序算法
小新学习屋2 小时前
《剑指offer》-数据结构篇-树
数据结构·算法·leetcode
好心的小明2 小时前
【深度之眼机器学习笔记】04-01-决策树简介、熵,04-02-条件熵及计算举例,04-03-信息增益、ID3算法
笔记·算法·决策树
恣艺4 小时前
LeetCode 1074:元素和为目标值的子矩阵数量
算法·leetcode·矩阵
queenlll5 小时前
P1064 [NOIP 2006 提高组] 金明的预算方案 题解
算法
WildBlue5 小时前
前端算法秘籍:BFS 算法的 JS 魔法之旅🤩
前端·javascript·算法