ChaCha20-Poly1305
ChaCha20
ChaCha20-Poly1305 AEAD
ChaCha20-Poly1305 AEAD
设计者
Daniel J. Bernstein
首次发布
2008 (ChaCha)
2014 (RFC 7539)
2014 (RFC 7539)
类别
流密码 / AEAD
密钥长度
256 bit
Nonce
96 bit
结构
ARX (Add-Rotate-Xor)
轮数
20
速度
~4 GB/s (软件)
标准
RFC 8439, RFC 7905
安全状态
安全
ChaCha20 是 Daniel J. Bernstein 设计的流密码,是 Salsa20 的改进版本。ChaCha20 使用 256 位密钥,配合 Poly1305 消息认证码构成 ChaCha20-Poly1305 AEAD,同时提供加密和认证。在没有 AES 硬件加速的平台上,ChaCha20 比 AES 更快。
算法原理
ChaCha20 的核心是一个 512 位状态的 ARX(加法-旋转-异或)运算:
ChaCha20 Quarter Round (a, b, c, d):
a += b; d ^= a; d <<<= 16
c += d; b ^= c; b <<<= 12
a += b; d ^= a; d <<<= 8
c += d; b ^= c; b <<<= 7
初始状态 (512 bit = 16 个 32 位字):
const: 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574
key: k[0..7] (256 bit 密钥)
counter: 计数器
nonce: n[0..2] (96 bit nonce)
20 轮运算 (10 轮列运算 + 10 轮对角线运算)
输出 64 字节密钥流,与明文异或产生密文
Poly1305 认证
Poly1305 是 Bernstein 设计的一次性 MAC,使用 128 位密钥 r 和 128 位密钥 s:
- 将消息分块,每块作为一个 128 位整数
- 在有限域 GF(2130 - 5) 上进行多项式求值
- 最终加上密钥 s 得到 128 位标签
ChaCha20 的第一个密钥流块用于生成 Poly1305 的 r 和 s,之后密钥流从计数器 1 开始用于加密。
与 AES-GCM 对比
| 特性 | ChaCha20-Poly1305 | AES-128-GCM |
|---|---|---|
| 类型 | 流密码 + MAC | 分组密码 + GMAC |
| 密钥 | 256 bit | 128/192/256 bit |
| 认证标签 | 128 bit | 128 bit |
| 软件速度 | ~4 GB/s | ~1.5 GB/s (无AES-NI) |
| 硬件速度 | ~4 GB/s | ~6 GB/s (AES-NI) |
| Nonce 重用 | 灾难性 | 灾难性 |
| 常数时间 | 是 | 查表实现可能不是 |
| 移动端 | 更快 | 可能无AES-NI |
应用
- TLS 1.3:必选密码套件之一
- WireGuard VPN:唯一使用的加密算法
- SSH:OpenSSH 6.5+ 默认优先选择
- Android:磁盘加密默认使用
- HTTP/2/3:TLS 层广泛使用
- Apple:HomeKit、iCloud 等使用
参考文献
- Bernstein, D.J. (2008). "ChaCha, a variant of Salsa20". IACR ePrint 2008.
- Nir, Y., Langley, A. (2015). "ChaCha20 and Poly1305 for IETF Protocols". RFC 7539 (obsoleted by RFC 8439).
- Nir, Y. (2019). "ChaCha20 and Poly1305 for IETF Protocols". RFC 8439.