AEAD (Authenticated Encryption with Associated Data) 加密方式详解
AEAD (Authenticated Encryption with Associated Data),即带关联数据的认证加密,是现代密码学中的一个重要概念和加密模式。它不仅仅提供传统加密算法的机密性 (Confidentiality),还能同时保障数据的完整性 (Integrity) 和真实性 (Authenticity)。此外,AEAD 模式允许对“关联数据”进行认证,这些数据不需要加密,但其完整性也需要被验证。
核心思想:将加密(提供机密性)和消息认证码 (MAC, 提供完整性和真实性) 组合到一个单一的密码操作中,同时允许对非加密数据进行认证。
一、为什么需要 AEAD?
在 AEAD 出现之前,密码学中存在两种主要的安全目标:
- 机密性 (Confidentiality):通过加密手段(如 AES、ChaCha20)使未经授权的方无法读取数据。
- 完整性 (Integrity) 和真实性 (Authenticity):通过消息认证码 (MAC) 或数字签名来确保数据在传输过程中未被篡改,并确认数据确实来自声称的发送方。
传统的加密方式(如 ECB、CBC 模式的 AES)和消息认证码(如 HMAC)是单独的组件。开发者需要手动将它们组合起来,以实现所谓的认证加密 (Authenticated Encryption)。然而,不正确的组合方式可能会引入严重的安全漏洞。
1.1 “组合”认证加密的陷阱
有三种常见的组合方式,但只有一种是安全的:
- Encrypt-then-MAC (EthenM):先加密明文得到密文,然后对密文计算 MAC 标签。这是唯一安全的组合方式。
- MAC-then-Encrypt (MthenE):先对明文计算 MAC 标签,然后将明文和 MAC 标签一起加密。
- 问题:即使密文被篡改,攻击者也可能在不破坏 MAC 结构的情况下进行修改,从而导致解密会报错,但攻击者可能从错误信息中获取有用信息(Padding Oracle Attack)。此外,MAC 不保护明文的机密性。
- Encrypt-and-MAC (EandM):分别对明文进行加密和 MAC 计算。
- 问题:这可能会泄露明文的模式,因为 MAC 不涉及加密。攻击者可以独立篡改密文和 MAC,然后尝试匹配它们以通过验证。
由于开发者经常会错误地组合加密和 MAC 算法,导致各种安全漏洞,密码学界开始倡导使用认证加密原语,其中 AEAD 模式是其中非常成功且广泛采用的一种。
二、AEAD 的核心概念
AEAD 模式将机密性、完整性和真实性整合到一个单一的算法操作中。
2.1 主要功能
- 加密 (Encryption):将明文转换为无法解读的密文,提供机密性。
- 认证 (Authentication):生成一个 MAC 标签,用于验证密文和关联数据的完整性及真实性。
- 关联数据 (Associated Data, AD):AEAD 模式的一个独特之处。它允许在加密和认证过程中包含一些不加密但需要认证的数据。这些数据在解密和验证时也必须提供,且不能被篡改。
- 应用场景:网络协议中的头部信息(如 IP 地址、端口号、协议版本),会话 ID,时间戳等。这些信息不需要保密,但其完整性对协议的正确运行至关重要。如果 AD 被篡改,解密和验证过程就会失败。
2.2 AEAD 的输出
AEAD 加密操作通常会产生两个输出:
- 密文 (Ciphertext):加密后的明文。
- 认证标签 (Authentication Tag / MAC Tag):用于验证密文和关联数据的完整性与真实性的密文。
解密时,需要提供密文、Nonce、密钥和关联数据。如果 MAC 标签验证不通过,则解密失败,不会返回任何明文。这被称为 “Fail-fast” 特性,可以防止攻击者通过操控密文来尝试各种解密结果。
2.3 Nonce / IV (Initialization Vector)
与所有流密码或块密码的工作模式一样,AEAD 模式也需要一个随机数 (Nonce) 或初始化向量 (IV)。
- Nonce 的要求:
- 唯一性:对于给定的密钥,每个加密操作使用的 Nonce 都必须是唯一的。重复使用 Nonce 是灾难性的安全漏洞,会导致密钥流的重复利用,从而泄露密钥并使得密文易被攻击。
- 无序性:不需要是随机的,但必须是唯一的。通常使用递增计数器或随机数生成。
- 不保密:Nonc 不需要保密,通常与密文和标签一起公开传输。
三、常见的 AEAD 模式
3.1 AES-GCM (Galois/Counter Mode)
- 特点:
- 底层算法:基于 AES 块密码的计数器模式 (CTR) 进行加密,并使用 Galois 字段乘法来计算 MAC。
- 性能:在支持 AES-NI 硬件指令的 CPU 上表现出色,加密和认证速度都非常快。
- 广泛应用:广泛应用于 TLS/SSL (HTTPS)、IPSec、SSH 等协议中。
- Nonce 大小:通常为 96 位(12 字节)。
3.2 ChaCha20-Poly1305
- 特点:
- 底层算法:基于 ChaCha20 流密码进行加密,并使用 Poly1305 消息认证码。
- 性能:在没有 AES-NI 硬件支持的 CPU 上(如许多移动设备),ChaCha20-Poly1305 表现通常优于 AES-GCM,因为它完全可以通过软件高效实现。
- 抗侧信道攻击:纯软件实现,且不涉及查找表,因此对某些侧信道攻击有更强的抵抗力。
- 广泛应用:在 TLS 1.2/1.3 中作为重要选项,特别是 Google Chrome 浏览器和许多移动应用的首选。WireGuard VPN 也将其作为核心加密套件。
- Nonce 大小:通常为 96 位(12 字节)。
3.3 其他 AEAD 模式
- GCM-SIV:旨在解决 AES-GCM 非重复 Nonce 的问题,提供了 Nonce Reuse Resistance,即使 Nonce 重复也能保证数据安全(但依然不能保证机密性,只是 MAC 不会被伪造)。
- OCB (Offset Codebook Mode):一个高效的 AEAD 模式,但由于专利问题,不像 GCM 那样普及。
四、AEAD 的优势
- 安全性高:防止了不正确组合加密和 MAC 算法造成的潜在漏洞。
- 简单易用:开发者只需选择一个 AEAD 算法,提供密钥、Nonce、明文和关联数据,算法内部会自动处理加密和认证的复杂逻辑。
- 机密性、完整性、真实性保障:一次操作同时满足所有三个安全目标。
- 防范篡改:即使攻击者只修改密文或关联数据的一个比特,MAC 验证也会失败,接收方能够立即发现篡改。
- Fail-fast 机制:如果认证失败,解密操作会中止并返回错误,避免泄露部分解密的数据,防止各种 Padding Oracle Attack。
- 保护非加密数据:关联数据机制非常实用,避免了为保护少量非敏感数据也要对其进行加密的开销。
五、AEAD 的应用场景
- TLS/SSL (HTTPS):AEAD 模式是 TLS 1.2 及更高版本中的标准加密套件。
- VPN 协议:例如 WireGuard 使用 ChaCha20-Poly1305。
- 数据存储:加密文件系统或数据库字段时,使用 AEAD 确保数据安全不被篡改。
- 网络通信协议:任何需要可靠、安全通信的协议。
- 密钥管理和分发:保护传输中的密钥。
六、Go 语言实现 AES-GCM AEAD
Go 语言标准库通过 crypto/cipher 包提供了 AEAD 接口,并有 crypto/aes 和 golang.org/x/crypto/chacha20poly1305 等实现。
1 | package main |
运行结果示例:
1 | 密钥 (Hex): 91d36d... |
此 Go 语言示例演示了如何使用 crypto/aes 和 crypto/cipher 包实现 AES-GCM AEAD。它展示了密钥和 Nonce 的生成、数据的加密与解密、以及 MAC 标签对密文和关联数据完整性的保护。通过模拟篡改密文和 AD,你可以看到 AEAD 如何有效地检测并拒绝非法数据。最后,也再次强调了 Nonce 唯一性的重要性。
七、总结
AEAD 模式是现代密码学中的基石,它通过将机密性、完整性和真实性整合到单一操作中,大大简化了安全协议的设计和实现,降低了开发者因不当组合加密原语而引入安全漏洞的风险。AES-GCM 和 ChaCha20-Poly1305 是目前最主流和被推荐的 AEAD 算法,它们各自在不同的硬件环境下展现出最佳性能,并已成为 TLS 等关键协议的强制性或推荐组件。在任何需要数据机密性、完整性与真实性的应用中,优先选择 AEAD 模式是最佳实践。
