Skip to content
Vol. 1 · Ed. 2026
CyberGlossary
Entry № 181

ChaCha20

审核人Cybersecurity entrepreneur & security researcher

ChaCha20 是什么?

ChaCha20由 Daniel J. Bernstein 设计的现代流密码,使用 256 位密钥和 96 位 nonce,常与 Poly1305 组合为 AEAD 算法 ChaCha20-Poly1305 广泛部署。


ChaCha20 是 Daniel J. Bernstein 于 2008 年设计的 20 轮流密码,是其 Salsa20 设计的改进版本。它使用 256 位密钥、96 位 nonce 和 32 位分组计数器,仅通过对 32 位字的加-循环移位-异或(ARX)运算生成密钥流——每次以一个"四分之一轮"混合四个状态字。由于它不需要查找表,因此速度快,并在没有 AES 硬件的 CPU 上天然具备恒定时间特性,这也是 Google 于 2014 年率先部署它以保护 Android 与 Chrome 流量的原因。与 Poly1305 消息认证码结合后,AEAD 方案 ChaCha20-Poly1305 由 RFC 8439(取代了 RFC 7539)标准化,并与 AES-GCM 一同成为 TLS 1.3 中两套必选密码套件之一。它还是 QUIC、WireGuard、OpenSSH、Signal 协议以及 Linux 内核随机数生成器的底层基础。

最关键的运维陷阱是 nonce 重用:用相同的密钥和 nonce 加密两条消息会暴露它们明文的异或值,并泄露一次性的 Poly1305 密钥,从而同时破坏机密性与真实性。96 位的 nonce 对于每连接一个计数器的场景绰绰有余,但在大规模随机生成时存在风险,因此 XChaCha20(draft-irtf-cfrg-xchacha)通过 HChaCha20 子密钥派生将 nonce 扩展到 192 位,使随机 nonce 变得安全。经过十余年的密码分析,尚无任何攻击能够攻破完整的 20 轮密码。

flowchart LR
  K[256 位密钥] --> S[初始化状态: 常量, 密钥, 计数器, nonce]
  N[96 位 nonce] --> S
  CTR[分组计数器] --> S
  S --> R[20 轮 ARX 四分之一轮]
  R --> KS[密钥流分组]
  PT[明文] --> X((异或))
  KS --> X
  X --> CT[密文]
  CT --> P[Poly1305 消息认证码]
  P --> TAG[认证标签]

示例

  1. 01

    TLS 1.3 与 QUIC 在移动设备上使用 TLS_CHACHA20_POLY1305_SHA256。

  2. 02

    WireGuard 使用 ChaCha20-Poly1305 加密所有数据包。

常见问题

ChaCha20 是什么?

由 Daniel J. Bernstein 设计的现代流密码,使用 256 位密钥和 96 位 nonce,常与 Poly1305 组合为 AEAD 算法 ChaCha20-Poly1305 广泛部署。 它属于网络安全的 密码学 分类。

ChaCha20 是什么意思?

由 Daniel J. Bernstein 设计的现代流密码,使用 256 位密钥和 96 位 nonce,常与 Poly1305 组合为 AEAD 算法 ChaCha20-Poly1305 广泛部署。

如何防御 ChaCha20?

针对 ChaCha20 的防御通常结合技术控制与运营实践,详见上方完整定义。

相关术语

另见