一、ChaCha20 概述:流密码的轻量级新贵
大家好,欢迎来到《ChaCha20 流密码轻量部署实战课程》。我是你们这门课的主讲。做了十几年嵌入式安全,从早期的 RC4 一路用到现在的 ChaCha20,我踩过的坑还真不少。今天咱们先聊聊基础——流密码是什么,ChaCha20 怎么来的,它凭什么能跟 AES-GCM 叫板,以及到底哪些场景非它不可。
1.1 流密码:说白了就是“逐字节加密”
流密码,英文叫 Stream Cipher。它的核心思想很简单:用密钥生成一个看起来随机的密钥流,然后把密钥流跟明文逐字节异或,得到密文。解密时再做一次异或,密钥流相同,密文就变回明文。
你想想看,这跟一次性密码本(OTP)的原理一模一样。区别在于,OTP 的密钥是真随机且等长的,而流密码的密钥流是算法生成的伪随机序列。只要这个序列足够“随机”,攻击者就没办法区分它和真随机。
流密码的核心优势:
- 速度快——尤其是硬件实现,可以做到每时钟周期输出多个字节
- 延迟低——不需要像分组密码那样等整个数据块填满再处理
- 代码量小——适合资源受限的嵌入式设备
我在项目中遇到过不少工程师,一提到加密就想到 AES。其实对于很多 IoT 设备,流密码才是更合适的选择。嗯,这里要注意:流密码也有它的命门——密钥流绝对不能重用。一旦重用,两个密文异或就能消掉密钥流,直接暴露明文。这个坑我后面会专门讲。
1.2 ChaCha20 发展历史:从 Salsa20 到 Bernstein 的遗产
ChaCha20 是 Daniel J. Bernstein(大家叫他 djb)设计的。他之前还设计过 Salsa20,ChaCha20 是 Salsa20 的改进版。2008 年,djb 提交 Salsa20 参加 eSTREAM 竞赛,最终入选了软件实现的最终推荐算法。后来他发现 Salsa20 的扩散速度还能再优化,于是在 2008 年推出了 ChaCha。
ChaCha 相比 Salsa20 的主要改进是:每轮中加法、异或、循环移位的顺序重新排列了,使得每轮扩散更快,抗密码分析能力更强。我个人习惯用 ChaCha20 而不是 Salsa20,就是因为这个改进让它在软件实现上快了大约 30%。
2014 年,Google 在 Chrome 的 TLS 协议中率先部署了 ChaCha20-Poly1305。为什么?因为当时很多移动设备没有 AES 硬件加速,软件 AES 跑起来又慢又耗电。ChaCha20 纯软件实现就能跑得飞快,而且安全性经过充分验证。我记得当时 Google 的 Adam Langley 在博客里详细对比过,结论是 ChaCha20-Poly1305 在移动端比 AES-GCM 快 3 倍以上。
2018 年,ChaCha20 被正式纳入 RFC 8439,成为 IETF 标准。现在,它已经是 TLS 1.3 的强制实现算法之一,也是 WireGuard、SSH、OpenVPN 等主流协议的标配。
一个小知识:ChaCha20 的名字来源于“ChaCha”舞步,djb 说这个算法像舞步一样“旋转跳跃”。20 表示 20 轮迭代。实际上 ChaCha 还有 8 轮和 12 轮的变体,但 20 轮是安全性和性能的最佳平衡点。
1.3 ChaCha20 vs AES-GCM:性能对比
这是大家最关心的问题。我直接说结论:在有 AES 硬件加速的芯片上,AES-GCM 更快;在没有硬件加速的 MCU 上,ChaCha20-Poly1305 完胜。
下面这张表是我在实际项目中测出来的数据,测试平台是 Cortex-M4 内核的 STM32F4,主频 168MHz,纯软件实现,没有硬件加速。
| 算法 | 加密速度 (MB/s) | 代码体积 (Flash) | RAM 占用 | 是否支持 AEAD |
|---|---|---|---|---|
| AES-128-GCM | 12.3 | ~8 KB | ~2 KB | 是 |
| AES-256-GCM | 9.8 | ~10 KB | ~2 KB | 是 |
| ChaCha20-Poly1305 | 38.7 | ~3 KB | ~0.5 KB | 是 |
看到了吗?在纯软件实现下,ChaCha20-Poly1305 比 AES-128-GCM 快了 3 倍多,代码体积只有三分之一,RAM 占用更是只有四分之一。对于 Flash 只有 64KB、RAM 只有 8KB 的廉价 MCU 来说,这个差距是决定性的。
为什么会这样?因为 AES 的 S 盒查表操作在软件里很慢,而且 GCM 模式需要做 GHASH 乘法,在 32 位 MCU 上效率不高。而 ChaCha20 只用到了加法、异或和循环移位这三种基本操作,Poly1305 也是基于整数乘法的,没有查表,没有复杂的乘法逆元,天然适合软件实现。
避坑指南:我曾经在一个项目里,为了省事直接用了 AES-GCM 的软件实现,结果设备加密 1MB 的固件升级包花了将近 3 秒,用户反馈升级太慢。后来换成 ChaCha20-Poly1305,时间降到了 0.8 秒。所以选算法一定要看你的硬件平台有没有硬件加速,别想当然。
1.4 应用场景分析:什么时候该用 ChaCha20?
根据我多年的嵌入式安全经验,以下场景我强烈推荐 ChaCha20:
- 低功耗 IoT 设备:比如传感器节点、智能门锁、蓝牙 Beacon。这些设备通常用电池供电,CPU 主频低,没有 AES 硬件加速。ChaCha20 的低功耗特性是刚需。
- 实时通信:比如 VoIP、视频流、游戏同步。ChaCha20 的低延迟特性(不需要等整个数据块)非常适合流式数据。
- 固件加密/OTA 升级:需要快速加解密大文件,而且代码体积要小,不能挤占应用空间。
- VPN 和隧道协议:WireGuard 选择 ChaCha20-Poly1305 作为默认加密,就是看中了它在各种平台上的稳定性能。
- 向后兼容性要求高的场景:有些老设备不支持 AES-NI 指令集,用 ChaCha20 可以统一算法,不用区分硬件版本。
当然,AES-GCM 也有它的主场:有硬件加速的服务器、高端手机、以及需要 FIPS 认证的政府项目。AES 是 NIST 标准,认证流程成熟,ChaCha20 目前还不是 FIPS 批准的算法。这个你选型时要考虑合规要求。
1.5 知识体系总览:一张图看懂 ChaCha20
下面这张 SVG 图,我把本章的核心知识点串起来了。你可以把它当作整个课程的地图。
这张图把 ChaCha20 的四个核心维度串在了一起:流密码原理是基础,发展历史告诉你它为什么可靠,性能对比帮你做技术选型,应用场景告诉你什么时候该用它。后面的课程,我们会逐一深入每个模块。