ChaCha20 加密
带可选认证的现代流密码
客户端安全
所有加密解密操作都在您的浏览器本地执行,不会向任何服务器发送数据。
初始块计数器值(加密通常为 0,解密使用相同值)
关于 ChaCha20
ChaCha20 是 Daniel J. Bernstein 于 2008 年设计的现代流密码,源自 Salsa20 密码。它使用 256 位密钥,在 512 位块上运行,生成与明文异或进行加密的密钥流。
该密码以其速度、安全性和抗时序攻击能力著称,是软件实现的绝佳选择。
算法对比
| 算法 | 类型 | 密钥长度 | Nonce 长度 | 最佳用途 |
|---|---|---|---|---|
| ChaCha20 | 流密码 | 256 bits | 96 bits (12 bytes) | 原始加密、自定义协议 |
| ChaCha20-Poly1305 | AEAD | 256 bits | 96 bits (12 bytes) | TLS 1.3、QUIC、安全消息 |
| XChaCha20 | 流密码 | 256 bits | 192 bits (24 bytes) | 随机 nonce 场景 |
| XChaCha20-Poly1305 | AEAD | 256 bits | 192 bits (24 bytes) | 大多数应用(推荐) |
ChaCha20 工作原理
ChaCha20 执行 20 轮运算,对 4×4 的 32 位字矩阵应用四分之一轮函数。初始状态由常量、256 位密钥、32 位计数器和 96 位 nonce 组成。
每轮使用加法、异或和旋转(ARX)置换状态,在保持软件高速运行的同时提供出色的扩散性。
AEAD:认证加密
ChaCha20-Poly1305 是 RFC 8439 标准化的带关联数据的认证加密(AEAD)构造。它结合了 ChaCha20 加密和 Poly1305 MAC 认证。
这确保了机密性和完整性 - 对密文或 AAD 的任何篡改都会在解密时被检测到。128 位认证标签通过密文和 AAD 计算得出。
主要特性
- 高性能:针对软件实现优化,在没有硬件加速的平台上比 AES 快 3 倍
- 常量时间:抵抗缓存时序攻击,不像基于表的 AES 实现
- 设计简洁:仅使用 ARX 运算(加法、旋转、异或),易于正确实现
- 广泛采用:用于 TLS 1.3、OpenSSH、WireGuard、Signal 协议等
- 扩展 Nonce:XChaCha20 变体允许安全的随机 nonce 生成,无碰撞风险
安全注意事项
- 绝不要在相同密钥下重用 nonce - 这会完全破坏安全性
- 大多数应用应使用 AEAD 变体(Poly1305)来检测篡改
- 对于随机 nonce,使用 XChaCha20(192 位)以最小化碰撞概率
- 使用正确的 KDF(HKDF、Argon2)从密码派生密钥
实际应用
- TLS 1.3:默认密码套件(TLS_CHACHA20_POLY1305_SHA256)
- WireGuard VPN:主要加密协议
- Signal 协议:端到端加密消息
- Cloudflare:移动客户端优先于 AES-GCM
- Linux 内核:CSPRNG(/dev/urandom)
参考资料
- RFC 7539 - IETF 协议的 ChaCha20 和 Poly1305
- RFC 8439 - IETF 协议的 ChaCha20 和 Poly1305(更新版)
- 维基百科 - ChaCha20-Poly1305
- D.J. Bernstein - ChaCha, Salsa20 的变体
常见问题
ChaCha20 和 AES 有什么区别?
两者都是安全的对称密码。ChaCha20 在没有硬件加速的情况下软件实现速度快 3 倍,且抵抗时序攻击。AES 在有硬件支持(AES-NI)时更快。ChaCha20 更适合移动和嵌入式设备。
为什么使用 XChaCha20 而不是 ChaCha20?
XChaCha20 的 192 位 nonce 允许安全的随机 nonce 生成。使用 96 位 nonce 时,需要仔细的 nonce 管理以避免碰撞。当无法保证唯一顺序 nonce 时,推荐使用 XChaCha20。
计数器参数有什么用?
计数器允许通过为每个块递增来加密超过 64 字节的消息。对于 AEAD 模式,它从 1 开始(块 0 生成 Poly1305 密钥)。通常可以保持默认值(0)。
我可以用这个工具加密文件吗?
这个工具完全在浏览器中运行,适合加密文本和小数据。对于大文件,建议使用 openssl 或基于 libsodium 的本地工具。
这个工具可以用于生产环境吗?
这个工具用于教育和开发目的。虽然实现遵循标准规范,但生产系统应使用经过审计的加密库,如 libsodium、OpenSSL 或平台提供的 API。