# ChaCha20-Poly1305是什么？定义、例子与常见误区

> ChaCha20-Poly1305 是把 ChaCha20 流密码与 Poly1305 认证算法组合而成的 AEAD 算法，专为纯软件实现时的高速和恒定时间而设计。

Source: https://ssl.sh/zh/glossary/chacha20-poly1305/
Last updated: 2026-11-10

ChaCha20-Poly1305 是一种 [AEAD](https://ssl.sh/zh/glossary/aead/) 算法，由 Daniel J. Bernstein 设计的两个组件构成：ChaCha20 流密码负责加密，Poly1305 一次性认证算法负责生成认证标签。IETF 版本见 [RFC 8439](https://www.rfc-editor.org/rfc/rfc8439)，使用 256 位密钥、96 位 nonce 和 128 位标签。RFC 7905 定义了 ECDHE-RSA-CHACHA20-POLY1305 等 TLS 1.2 套件，[TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/) 中对应的套件是 TLS_CHACHA20_POLY1305_SHA256。

## 为什么重要
ChaCha20 只用加法、循环移位和异或运算，在没有 AES 指令的处理器上（老款或低端手机、小型 ARM 开发板等）也能跑得很快，而且不会出现依赖密钥的内存访问，天然抗时序攻击。在这类设备上它通常明显快于软件实现的 AES。它还为 TLS 提供了一个结构完全不同的备选 AEAD，生态不必只押宝 [AES-GCM](https://ssl.sh/zh/glossary/aes-gcm/)。服务器同时启用两者时，一般让客户端自行选择，各类设备都能用上最适合自己硬件的算法。国内用户机型跨度大，同时提供两者更稳妥。

## 例子
强制用 ChaCha20-Poly1305 建立 TLS 1.3 连接，确认服务器是否支持：

```bash
openssl s_client -connect example.com:443 -tls1_3 -ciphersuites TLS_CHACHA20_POLY1305_SHA256
```

TLS 1.2 方面，在 Nginx 的 ssl_ciphers 中加入 ECDHE-ECDSA-CHACHA20-POLY1305 和 ECDHE-RSA-CHACHA20-POLY1305 即可。

## 常见误区
- **流密码天生不如 AES 安全。** RC4 的问题是 RC4 自身的缺陷。ChaCha20 使用 256 位密钥，没有已知的实用攻击，并且是 IETF 标准。
- **它总是比 AES-GCM 快。** 在有 AES 硬件加速的 CPU 上，AES-GCM 通常持平甚至更快，ChaCha20 的优势在没有加速指令的硬件上。
- **启用它需要特定类型的证书。** 对称加密算法与证书是 RSA 还是 ECDSA 无关。

## 相关术语

- [AEAD](https://ssl.sh/zh/glossary/aead/): AEAD 是带关联数据的认证加密算法，一次运算同时完成数据加密和完整性认证，并能保护不加密的附加数据不被篡改。
- [AES-GCM](https://ssl.sh/zh/glossary/aes-gcm/): AES-GCM 是以伽罗瓦/计数器模式运行的 AES 分组密码，属于 AEAD 算法，用计数器模式加密、用 GHASH 认证标签保证完整性。
- [密码套件](https://ssl.sh/zh/glossary/cipher-suite/): 密码套件是 TLS 客户端和服务器协商使用的一组命名的加密算法组合，例如 TLS_AES_128_GCM_SHA256，决定连接用什么算法保护数据。
- [TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/): TLS 1.3 是当前最新的传输层安全协议版本（2018 年的 RFC 8446，现行规范为 RFC 9846），完整握手只需一个往返，且只保留 AEAD 加密算法。
- [TLS 1.2](https://ssl.sh/zh/glossary/tls-1-2/): TLS 1.2 是 2008 年由 RFC 5246 定义的 TLS 版本，引入了基于 SHA-256 的密钥派生和 AES-GCM 等 AEAD 加密算法，至今仍被广泛使用。
- [RC4](https://ssl.sh/zh/glossary/rc4/): RC4 是 Ron Rivest 在 1987 年设计的流密码，曾在 SSL/TLS 中广泛使用，因密钥流存在统计偏差，2015 年被 RFC 7465 禁止用于 TLS。
