ChaCha20-Poly1305

ChaCha20
ChaCha20-Poly1305 AEAD
设计者
Daniel J. Bernstein
首次发布
2008 (ChaCha)
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-Poly1305AES-128-GCM
类型流密码 + MAC分组密码 + GMAC
密钥256 bit128/192/256 bit
认证标签128 bit128 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 等使用
参考文献
  1. Bernstein, D.J. (2008). "ChaCha, a variant of Salsa20". IACR ePrint 2008.
  2. Nir, Y., Langley, A. (2015). "ChaCha20 and Poly1305 for IETF Protocols". RFC 7539 (obsoleted by RFC 8439).
  3. Nir, Y. (2019). "ChaCha20 and Poly1305 for IETF Protocols". RFC 8439.