KangarooTwelve 密码学哈希算法:Keccak 的现代加速变体

算法原理 · 2026-09-12

概述

KangarooTwelve 是基于 Keccak 置换函数的可扩展输出函数(XOF)家族,包含 KT128 和 KT256 两个实例,分别提供 128 位和 256 位安全强度。该算法于 2025 年 10 月以 RFC 9861 正式发布,属于 IRTF(Internet Research Task Force)信息类文档。

KangarooTwelve 的核心创新在于树状哈希(Tree Hashing)架构:将输入消息分块并行处理,最后合并结果。这种设计使其在高并发和 SIMD 指令集的现代 CPU 上能显著超越传统 sponge 哈希(如 SHA-3)的吞吐量。

设计原理

Keccak-p[1600,12] 置换函数

KangarooTwelve 基于 Keccak-p[1600,12] 置换函数——这是 SHA-3 标准(FIPS 202)中 Keccak-p[1600,24] 的缩减轮数版本(24 轮 → 12 轮)。

CODE
Keccak-p[1600,12] 参数:
- 容量 c = 512 位
- 吸收速率 r = 1088 位(b - c,其中 b=1600)
- 总宽度 = 1600 位
- 轮数 = 12(SHA-3 标准为 24 轮)

相比 SHA-3 的 24 轮,12 轮置换将计算量近乎减半,同时仍保留足够的安全性(基于对 Keccak 结构的广泛密码分析)。

TurboSHAKE:加速的 Sponge 基础

KangarooTwelve 并非直接使用 Keccak-f,而是构建在 TurboSHAKE128/256 之上。TurboSHAKE 是对标准 SHAKE 的优化版本,减少了 Keccak 置换轮数以提升速度:

  • TurboSHAKE128:使用 Keccak-p[1600,12],128 位安全强度
  • TurboSHAKE256:使用 Keccak-p[1600,12],256 位安全强度

树状哈希架构

KangarooTwelve 采用 Sakura 兼容的树状哈希模式(RFC 9861 Section 3):

CODE
输入消息 M(可含可选定制字符串 C):

1. 合并 M 和 C:S = M || C || length_encode(|C|)
2. 将 S 分割为 n 个数据块(每块最多 8192 字节)
   S = S_0 || S_1 || ... || S_(n-1)
3. 并行计算各中间块的哈希:
   CV_i = TurboSHAKE( S_i, 0x0B, 32 )  // 128位安全用32字节
4. 构建最终节点:
   FinalNode = S_0 || 0x03 || CV_1 || ... || CV_(n-1) || ...
5. 输出:KT(M, C, L) = TurboSHAKE(FinalNode, 0x06/0x07, L)

关键特性:

  • 并行化:步骤 3 中各 CV_i 可完全并行计算
  • 可变输出:输出长度 L 任意(1~256 字节)
  • 定制字符串:可选的 C 参数支持域分离(domain separation)

性能特征

与 SHA-3 的对比

KangarooTwelve 在长消息场景下优势显著,源于其树状哈希的并行特性:

消息长度SHA-3-256KangarooTwelve-256性能提升
64 字节~50 ns~25 ns~2×
1 KB~120 ns~40 ns~3×
1 MB~3 ms~0.5 ms~6×
注:以上数据为参考量级,实际性能取决于具体实现和硬件平台。
短消息(< 8192 字节)的加速相对有限,因为只需单次 TurboSHAKE 调用;长消息的并行优势才充分体现。

与 BLAKE3 的对比

特性BLAKE3KangarooTwelve
标准化IETF RFC(草案阶段)RFC 9861(2025-10)
安全强度128/256 位128/256 位(KT128/KT256)
并行化内置(Mermaid 树结构)树状哈希
定制字符串支持支持(域分离)
嵌入式友好中等优秀(简单实现)
两者都针对并行计算优化,但 KangarooTwelve 的实现更轻量,适合资源受限环境。

工程实践

Python 实现示例

KangarooTwelve 目前尚未被主流 Python 密码库(如 cryptography、pycryptodome)原生支持。以下为实现思路:

当前状态:截至 2026 年,KangarooTwelve 的 Python 绑定仍在开发中。建议使用 Rust 或 Go 语言实现(参考实现位于 keccak.team)。

在 IPFS 等分布式系统中的应用

KangarooTwelve 的可定制字符串特性使其非常适合内容寻址存储:

RUST
// Rust 伪代码:IPFS 对象标识
use kangaroo_twelve::kangaroo_twelve;

fn compute_cid(data: &[u8]) -> Vec<u8> {
    // 使用 "ipfs-pb" 作为定制字符串进行域分离
    kangaroo_twelve(data, 32, b"ipfs-pb")
}

域分离(customization string)确保不同协议或场景下的哈希值不会冲突。

安全性分析

抗碰撞性

KangarooTwelve 的安全强度与输出长度直接相关:

实例安全强度适用场景
KT128128 位通用场景(推荐)
KT256256 位高安全需求场景
安全性基于 Keccak-p[1600,12] 置换的抗差分和抗线性特性。截至 2025 年,针对 Keccak 12 轮置换未发现有效攻击。

后量子安全性

KangarooTwelve 对所有已知量子攻击具有抗性:

  • Grover 算法:将预图像攻击复杂度从 $2^n$ 降至 $2^{n/2}$,因此 KT256 提供 128 位后量子安全
  • BHT 算法:改进的量子碰撞查找算法,但 Sponge 结构的设计已充分考虑此类攻击

已知限制

  • 标准化状态:RFC 9861 为 Informational 类文档,非 IETF 正式标准,但已被 IRTF CFRG 认可
  • 库支持有限:OpenSSL、BoringSSL 等主流库尚未原生支持
  • 侧信道风险:非恒定时间实现可能泄露密钥信息(如用于 MAC 场景)

应用场景

推荐的适用场景

  • 分布式存储:IPFS 等系统的内容寻址(定制字符串支持域分离)
  • 高性能哈希:需要并行计算的服务器端应用
  • 轻量级设备:嵌入式系统的快速认证

不推荐的使用场景

  • 证书签名:应继续使用 SHA-3 或 SM3 等已有长期安全分析的标准算法
  • 密钥派生:HKDF 等标准化方案更成熟可靠
  • 合规场景:国密合规需使用 SM3

参考