一、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 流密码知识体系 ChaCha20 流密码 流密码原理 密钥流生成 + 异或加密 密钥/Nonce/计数器 发展历史 Salsa20 → ChaCha20 RFC 8439 / TLS 1.3 性能对比 纯软件: ChaCha20 快 3x 硬件加速: AES-GCM 胜 应用场景:IoT / 实时通信 / VPN / 固件加密 核心结论 ChaCha20 是软件实现最优的流密码,特别适合无硬件加速的嵌入式设备

这张图把 ChaCha20 的四个核心维度串在了一起:流密码原理是基础,发展历史告诉你它为什么可靠,性能对比帮你做技术选型,应用场景告诉你什么时候该用它。后面的课程,我们会逐一深入每个模块。