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

相关推荐
进击的横打1 天前
【车载开发系列】安全算法与安全访问
算法·安全·车载系统
努力学算法的蒟蒻1 天前
day59(1.18)——leetcode面试经典150
算法·leetcode·职场和发展
666HZ6661 天前
数据结构3.0 栈、队列和数组
开发语言·数据结构·算法
知乎的哥廷根数学学派1 天前
基于物理引导和不确定性量化的轻量化神经网络机械退化预测算法(Python)
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
程序员-King.1 天前
day146—递归—验证二叉搜索树(LeetCode-98)
算法·leetcode·二叉树·递归
永远都不秃头的程序员(互关)1 天前
【K-Means深度探索(五)】不止欧氏距离:K-Means中距离度量那些事儿
算法·机器学习·kmeans
tobias.b1 天前
408真题解析-2009-41-数据结构-最短路径
数据结构·算法·计算机考研·408考研·408真题解析
王老师青少年编程1 天前
2024年9月GESP真题及题解(C++七级): 矩阵移动
c++·算法·题解·真题·gesp·七级·矩阵移动
棒棒的皮皮1 天前
【深度学习】YOLO 进阶提升之算法改进(新型骨干网络 / 特征融合方法 / 损失函数设计)
深度学习·算法·yolo·计算机视觉
pas1361 天前
33-mini-vue 更新element的children-双端对比diff算法
javascript·vue.js·算法