经身份验证的加密:AES-GCM 与 ChaCha20-Poly1305
了解 AEAD 密码如何同时提供机密性和完整性,以及在 AES-GCM 中误用随机数为何会导致灾难性的密钥恢复。
经身份验证的加密:AES-GCM 与 ChaCha20-Poly1305 是 CoddyKit 上的免费 Security+ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Security+ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Security+ Academy 课程共包含 4 节课。
什么是认证加密
认证加密(AE)解决了一个根本问题:传统加密只能提供机密性——确保数据保密——但无法验证密文是否遭到篡改。攻击者可以翻转密文中的位,接收方解密后得到错误数据,却不知道数据已被修改。带有关联数据的认证加密(AEAD)同时提供完整性和真实性保证,生成加密密文以及能够检测任何修改的认证标签。
AES-GCM:计数器模式加 GMAC
AES-GCM(Galois/Counter Mode)结合了两个组件:用于加密的AES-CTR(计数器模式)和用于完整性保护的 GMAC(Galois 消息认证码)。AES-CTR 通过加密计数器值来生成密钥流,并将其与明文进行 XOR 运算——与 CBC 模式不同,这使得加密过程可以并行化。GMAC 会根据密文和任何关联数据计算认证标签。生成的标签长度为 128 位,并与密文一同传输;哪怕只有一位发生变化,也会使标签失效。
# AES-256-GCM encryption with openssl
openssl enc -aes-256-gcm -in plaintext.txt -out encrypted.bin \
-K $(openssl rand -hex 32) \
-iv $(openssl rand -hex 12)一次性数值:关键但脆弱
AES-GCM 要求使用一次性数值(nonce,即仅使用一次的数值),通常为 96 位(12 字节)。对于使用同一密钥的每一次加密操作,一次性数值都必须完全唯一——它不需要保密,但绝不能重复。在 AES-GCM 中重复使用一次性数值会造成灾难性后果:如果两条消息使用相同的密钥和一次性数值进行加密,攻击者就可以对两个密文执行 XOR,从而抵消密钥流,并可能恢复出两条明文。这种漏洞有时称为“一次性数值误用”,并且已经导致过现实中的密钥恢复攻击。
一次性数值误用攻击解析
当 AES-GCM 重复使用一次性数值时,攻击者可以计算出 C1 XOR C2 = P1 XOR P2(两条明文的 XOR 结果),因为两条消息使用了相同的密钥流。此外,重复使用一次性数值还会使攻击者能够恢复认证密钥 H,这意味着攻击者可以为任意消息伪造有效的认证标签,从而彻底破坏机密性和完整性。Sony PS3 等系统就遭受过这种攻击。防御方法是使用随机生成的一次性数值(通过 CSPRNG 生成),或使用永不重置的确定性计数器。
ChaCha20-Poly1305:流密码替代方案
ChaCha20-Poly1305 是 TLS 1.3 规定的另一种 AEAD 密码。ChaCha20 是 Daniel Bernstein 设计的流密码,通过加法、循环移位和 XOR(ARX)运算生成密钥流——不使用查找表,完全采用恒定时间运算,并且在没有 AES 硬件加速的 CPU 上运行极快。Poly1305 是一种一次性 MAC(消息认证码),用于根据密文计算认证标签。二者结合后能够提供与 AES-GCM 等效的安全性,但在移动设备和物联网设备上明显更快。
为什么移动设备适合使用 ChaCha20-Poly1305
现代 x86 和 ARM64 桌面及服务器处理器都包含 AES-NI 硬件指令,因此 AES-GCM 的运行速度非常快。然而,许多移动设备和物联网处理器缺少 AES-NI,使得软件实现的 AES-GCM 相对较慢。ChaCha20-Poly1305 专为通过简单算术运算实现高速软件运行而设计,因此无需硬件加速也能让移动设备获得相近的性能。Google 正是出于这一原因,将 ChaCha20-Poly1305 作为替代方案加入 TLS,以适配 Android 设备;如今它已经成为 TLS 1.3 中的一等密码套件。
关联数据:保护标头
AEAD 中的“AD”代表关联数据(Associated Data),即经过认证但未加密的明文元数据。这样,您就可以认证那些必须保持可读的数据(例如数据包标头或记录类型字段),同时仍能防止其被篡改。在 TLS 1.3 中,记录标头字节会作为关联数据参与 AEAD 计算。如果攻击者修改标头(例如更改记录长度),认证标签验证就会失败,连接也会被终止。
AEAD 与先加密后认证
在 AEAD 成为标准之前,密码学家推荐使用先加密后认证(Encrypt-then-MAC,EtM):先加密明文,再根据密文计算 MAC。这种方式是安全的,但需要使用两个不同的密钥执行两次独立操作。像 AES-GCM 这样的 AEAD 方案将这两种操作结合起来,只需一个密钥即可完成,从而降低实现复杂度,并消除困扰先认证后加密(MAC-then-Encrypt,MtE)的一整类填充预言机攻击——旧版 TLS 使用的正是这种顺序(CBC + HMAC)。TLS 1.3 使用 AEAD 后,完全避开了这些问题。
AES-128-GCM 与 AES-256-GCM
AES-128-GCM 和 AES-256-GCM 都得到 NIST 批准,并被认为能够抵御经典计算机的攻击。AES-128 提供 128 位安全性,性能略快;AES-256 提供 256 位安全性,能够针对未来的密码分析和量子威胁提供更大的安全余量。对于如今的大多数应用,AES-128-GCM 已经足够,但政府机密系统(NSA Suite B)要求使用 AES-256。TLS 1.3 同时提供这两种方案,服务器可以根据自身的安全策略确定优先级。
认证标签验证过程
解密 AEAD 密文时,接收方必须先验证认证标签,再进行解密。具体过程如下:根据收到的密文、密钥和一次性数值重新计算预期标签;使用恒定时间比较函数将其与收到的标签进行比较;只有两者匹配时,才继续解密。恒定时间比较至关重要——如果比较过程在遇到第一个不匹配的字节时提前结束,攻击者就可以利用计时旁信道攻击,逐字节伪造有效标签。任何使用提前退出比较的 AEAD 库都存在漏洞。
AEAD 的现实应用
AEAD 算法在现代安全系统中无处不在:TLS 1.3 使用 AES-GCM 和 ChaCha20-Poly1305 加密所有记录;WireGuard VPN 专门使用 ChaCha20-Poly1305;Signal Protocol 使用它加密消息;QUIC protocol(HTTP/3 的基础)使用 AES-GCM。当您看到类似 TLS_AES_256_GCM_SHA384 的密码套件时,其中的 SHA384 指的是用于密钥派生的 HKDF 哈希函数,而不是完整性机制——完整性由 GCM 标签负责。
快速检查
请测试您对本课 CompTIA Security+(SY0-701)相关概念的理解。
课程回顾
本课讲解了以下内容:AEAD 算法通过认证标签同时提供机密性和完整性,能够检测任何密文修改;AES-GCM 重复使用一次性数值会造成灾难性后果,因为这会导致密钥流恢复和认证密钥伪造,因此每次加密都必须使用唯一的一次性数值;此外,ChaCha20-Poly1305 是缺少 AES 硬件加速设备的高效替代方案。接下来,我们将学习用于保护密码的密钥派生函数。
用 AI 导师学习 Security+ Academy — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「经身份验证的加密:AES-GCM 与 ChaCha20-Poly1305」课时是免费的吗?
是的 — 「经身份验证的加密:AES-GCM 与 ChaCha20-Poly1305」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Security+ Academy 课程的其余内容,请升级到 CoddyKit PRO。 Security+ Academy 课程共包含 4 节课。
「经身份验证的加密:AES-GCM 与 ChaCha20-Poly1305」这节课中我会学到什么?
了解 AEAD 密码如何同时提供机密性和完整性,以及在 AES-GCM 中误用随机数为何会导致灾难性的密钥恢复。 你通过在浏览器中直接运行的动手代码来练习 Security+ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Security+ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Security+ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「经身份验证的加密:AES-GCM 与 ChaCha20-Poly1305」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Security+ Academy 课中编写并运行代码吗?
能。每节 Security+ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- TLS 1.3 握手与 0-RTT 会话恢复
- 经身份验证的加密:AES-GCM 与 ChaCha20-Poly1305
- 密钥派生函数:PBKDF2、bcrypt 与 Argon2
- 后量子密码学:CRYSTALS-Kyber 与 Dilithium