认证加密与关联数据(AEAD):从加密到认证的统一框架
概述
在现代密码学中,仅有加密远远不够。一个只提供机密性却不提供完整性保护的加密系统,如同一个只锁前门却敞开窗户的保险箱——攻击者虽然无法直接读取密文,但可以通过篡改、重排、截断密文来破坏系统的安全性。认证加密(Authenticated Encryption, AE) 正是为解决这一根本问题而诞生,它在同一个算法框架内同时提供加密和消息认证两个功能。
AEAD(Authenticated Encryption with Associated Data) 是认证加密的进一步扩展。"关联数据"(Associated Data)指的是那些需要认证但不需要加密的数据——例如网络数据包的头部、协议元数据、加密文件的文件名等。AEAD 能够同时保证:
- 机密性(Confidentiality):密文不泄露明文的任何信息
- 完整性(Integrity):任何对密文或关联数据的篡改都能被检测到
- 真实性(Authenticity):密文确实由持有正确密钥的一方生成
AEAD 在现代协议中的核心地位
AEAD 已成为几乎所有现代安全协议的默认加密模式:
| 协议 | 默认 AEAD 模式 | 备注 | |
|---|---|---|---|
| TLS 1.3 | AES-GCM, ChaCha20-Poly1305 | 所有密码套件均为 AEAD | |
| IPSec (IKEv2) | AES-GCM, AES-CCM | ESP 协议强制使用 AEAD | |
| SSH | AES-GCM (RFC 5647), ChaCha20-Poly1305 | AEAD 密码套件(RFC 5647, IANA 注册) | |
| WireGuard | ChaCha20-Poly1305 | 唯一支持的加密模式 | |
| 国密 TLS (GM/T 0024) | SM4-GCM | 国密协议中的 AEAD 方案 |
历史演进:为什么需要 AEAD
第一阶段:分离的加密与认证
在 AEAD 概念出现之前,加密和认证是两个独立的操作,开发者需要自行组合。这种组合方式存在严重的安全隐患。
三种经典组合方式及其缺陷:
方式 1: Encrypt-and-MAC
C = Enc(K_enc, P)
T = MAC(K_mac, P)
发送 (C, T)
缺陷:MAC 泄露明文信息;先验证还是先解密?
方式 2: MAC-then-Encrypt
T = MAC(K_mac, P)
C = Enc(K_enc, P || T)
发送 C
缺陷:解密后才能验证,可能泄露解密错误信息
方式 3: Encrypt-then-MAC
C = Enc(K_enc, P)
T = MAC(K_mac, C)
发送 (C, T)
缺陷:需要两个密钥;实现复杂度高这三种方式各有问题,但核心矛盾在于:加密和认证是两个独立的设计决策,将它们组合在一起时,接口边界处最容易出现安全漏洞。
第二阶段:从组合到统一
2000 年前后,密码学界开始认识到,加密和认证不应该被视为两个独立的功能,而应该被统一在一个算法中。这一认识的直接推动力是 2001 年对 CBC 模式填充 oracle 攻击的发现:
- Vaudenay (2002) 证明,在 CBC 模式下,攻击者可以通过观察服务器对填充错误和 MAC 错误的不同响应时间,逐字节恢复明文
- 这一攻击直接影响了 SSL/TLS 协议的安全性,迫使 IETF 重新审视加密和认证的组合方式
第三阶段:AEAD 标准化
2004 年,IETF 在 RFC 5116 中正式定义了 AEAD 的抽象接口:
AEAD_Encrypt(K, N, A, P):
输入:密钥 K,Nonce N,关联数据 A,明文 P
输出:密文 C,认证标签 T
AEAD_Decrypt(K, N, A, C, T):
输入:密钥 K,Nonce N,关联数据 A,密文 C,认证标签 T
输出:明文 P 或 ⊥(认证失败)这个接口的精妙之处在于:加密和认证使用同一个密钥,一次调用完成所有操作,不存在"先验证还是先解密"的歧义。
AEAD 的安全模型
IND-CCA2 与 INT-CTXT
AEAD 的安全性由两个互补的安全目标定义:
1. 不可区分性 under 选择密文攻击(IND-CCA2)
这是加密的最高安全级别。攻击者可以:
- 提交任意明文,获得对应密文(加密 oracle)
- 提交任意密文,获得对应明文(解密 oracle)
- 但挑战密文本身不能提交给解密 oracle
2. 密文完整性(INT-CTXT)
攻击者无法构造出一个从未被加密过的、能通过认证验证的密文。即使攻击者看到了许多有效的 (密文, 标签) 对,也无法伪造新的有效对。
AEAD 的核心定理: 同时满足 IND-CCA2 和 INT-CTXT 的 AEAD 方案,等价于同时提供机密性、完整性和真实性。这意味着 AEAD 的安全性可以归约为这两个标准的密码学游戏。
Nonce 与密钥管理
AEAD 方案的安全性严重依赖于 Nonce(一次性数字)的管理:
- 唯一性要求:同一个密钥下,每个 Nonce 只能使用一次
- Nonce 重用灾难:如果同一个 Nonce 被使用两次,大多数 AEAD 方案的安全性会完全崩溃
安全性层次:
密钥 K ──→ 必须绝对保密,永不泄露
Nonce N ──→ 同一密钥下必须唯一(可以公开,可以预测)
关联数据 A ──→ 不需要加密,但必须完整传递主流 AEAD 模式深度剖析
AES-GCM(Galois/Counter Mode)
AES-GCM 是 NIST SP 800-38D 标准化的 AEAD 模式,也是目前应用最广泛的 AEAD 方案。它由 John Viega 和 David McGrew 设计,结合了 CTR 模式加密和 Galois 域乘法认证。
#### 数学基础
GCM 的认证基于 GF(2^128) 上的多项式乘法。定义不可约多项式:
P(x) = x^128 + x^7 + x^2 + x + 1GHASH 函数将关联数据 A 和密文 C 映射为 GF(2^128) 上的一个值:
H = AES_K(0^128) // 认证密钥
GHASH(A, C) = X_{m+n+1}
其中 X_0 = 0
X_i = (X_{i-1} ⊕ S_i) · H (i = 1, ..., m+n+1)
S_1 || S_2 || ... || S_m = A 的分块(128位一组)
S_{m+1} || ... || S_{m+n} = C 的分块
S_{m+n+1} = len(A) || len(C) (长度编码)#### 加密流程
Nonce (96位)
│
▼
┌───────────────┐
│ Counter = 1 │
└───────┬───────┘
│
▼
┌───────────────┐
K ─────▶│ AES_K │─────▶ Keystream
└───────┬───────┘
│
▼
┌───────────────┐
P ─────▶│ XOR │─────▶ C
└───────────────┘
认证标签:
T = GHASH(A, C) ⊕ AES_K(Nonce || 0^31 || 1)#### GCM 的优缺点
| 维度 | 评价 |
|---|---|
| 并行性 | 加密和 GHASH 可高度并行,适合硬件加速 |
| 吞吐量 | 在有 AES-NI 和 PCLMULQDQ 指令的 CPU 上可达 10+ Gbps |
| Nonce 长度 | 标准 96 位,其他长度需要额外处理(效率降低) |
| 标签长度 | 支持 128/120/112/104/96 位,NIST 建议至少 96 位 |
| 短消息开销 | 固定 16 字节标签 + 12 字节 IV,短消息效率低 |
| Nonce 重用风险 | 灾难性:泄露 GHASH 密钥 H,完全丧失认证安全性 |
ChaCha20-Poly1305
ChaCha20-Poly1305 由 Daniel J. Bernstein 设计,结合了 ChaCha20 流密码和 Poly1305 消息认证码。它在 RFC 8439 中标准化,是 TLS 1.3 的两大默认 AEAD 之一。
#### 设计思想
ChaCha20-Poly1305 的设计哲学与 GCM 截然不同:
- GCM:基于分组密码(AES)和有限域运算,依赖硬件加速
- ChaCha20-Poly1305:基于 ARX(Add-Rotate-XOR)运算和素域模运算,纯软件实现高效
#### ChaCha20 核心函数
ChaCha20 的核心是一个 20 轮的 ARX 置换,操作在 4×4 的 32 位字矩阵上:
注:以下为 ChaCha20 四分之一轮操作的伪代码(类 C 语言风格),使用 <<= 表示循环左移。
实际实现可参考 RFC 8439 附录中的参考实现或 libsodium 等开源库。
初始矩阵:
┌────────┬────────┬────────┬────────┐
│ "expa" │ "nd 3" │ "2-by" │ "te k" │ ← 常量
├────────┼────────┼────────┼────────┤
│ Key │ Key │ Key │ Key │ ← 256-bit 密钥
├────────┼────────┼────────┼────────┤
│ Key │ Key │Counter │ Nonce │ ← 密钥 + 计数器 + Nonce
└────────┴────────┴────────┴────────┘
每轮操作:
四分之一轮(Quarter Round)对四列/对角线执行:
a += b; d ^= a; d <<<= 16;
c += d; b ^= c; b <<<= 12;
a += b; d ^= a; d <<<= 8;
c += d; b ^= c; b <<<= 7;#### Poly1305 认证
Poly1305 使用素数 p = 2^130 - 5 上的多项式求值:
r, s ← 从密钥派生(r 被 clamp 处理)
tag = (Poly1305_r(associated_data || ciphertext || lengths) + s) mod 2^128
其中 Poly1305_r(M) = Σ(m_i · r^i) mod (2^130 - 5)#### 优缺点对比
| 维度 | 评价 |
|---|---|
| 软件性能 | 无硬件加速时通常优于 AES-GCM |
| 硬件加速 | 无专用指令,但有 SIMD 优化空间 |
| Nonce 长度 | 96 位,固定长度 |
| 标签长度 | 固定 128 位(不可截断) |
| 抗侧信道 | ARX 运算天然抗时序攻击 |
| Nonce 重用风险 | 灾难性:泄露密钥流和认证密钥 |
AES-CCM(Counter with CBC-MAC)
AES-CCM 在 NIST SP 800-38C 中标准化,结合了 CTR 模式加密和 CBC-MAC 认证。它在 802.11i(WPA2)、Bluetooth LE、IPSec 等协议中广泛使用。
#### 结构特点
CCM 采用 MAC-then-Encrypt 结构:
1. 计算 CBC-MAC 标签:
T = CBC-MAC_K(A || P)
2. CTR 模式加密:
C = CTR_Encrypt_K(P || T)#### CCM 的独特约束
- 先认证后加密:明文长度必须在加密前确定(不能流式处理)
- 两阶段处理:先计算 MAC,再加密,需要两次遍历数据
- 关联数据长度编码:使用变长编码,对短关联数据有额外开销
| 维度 | 评价 |
|---|---|
| 流式处理 | 不支持,必须知道明文总长度 |
| 并行性 | CBC-MAC 不可并行,是主要瓶颈 |
| 硬件要求 | 仅需 AES 加密,不需要乘法运算 |
| 适用场景 | 资源受限的嵌入式设备、无线协议 |
AES-GCM-SIV(Nonce 滥用抵抗)
RFC 8452 定义了 AES-GCM-SIV,它在保持 GCM 高性能的同时,提供了 Nonce 滥用抵抗(Nonce Misuse Resistance)——即使同一个 Nonce 被重复使用,也不会完全丧失安全性。
#### 核心创新
SIV(Synthetic IV)模式的关键思想是:IV 从明文和关联数据中派生,而不是外部提供。
SIV_Encrypt(K, N, A, P):
S2V(K, A, N) → SIV // 从关联数据和 Nonce 合成 IV
C = CTR_Encrypt(SIV, P) // 使用合成 IV 加密
T = SIV[0:16] // 标签就是合成 IV 的前 16 字节安全性保证: 如果 Nonce 被重用,攻击者只能知道"两个明文是否相同",但无法恢复明文内容或伪造消息。这比 GCM 的灾难性失败要温和得多。
SIV 模式的通用设计原理
SIV 模式代表了一类重要的 AEAD 设计范式:
通用 SIV 结构:
PRF(K, A || N || P) → Synthetic IV
Enc(Synthetic IV, P) → Ciphertext
Tag = Synthetic IV[0:tag_len]
关键性质:
1. IV 是明文的确定性函数 → 相同明文+相同 Nonce → 相同密文
2. 泄露的信息仅限于"明文是否相等"
3. 不同 Nonce 下的安全性不受影响AEAD 模式综合对比
技术特性对比
| 特性 | GCM | CCM | ChaCha20-Poly1305 | GCM-SIV |
|---|---|---|---|---|
| 标准 | SP 800-38D | SP 800-38C | RFC 8439 | RFC 8452 |
| 底层原语 | AES + GF(2^128) | AES + CBC-MAC | ARX + mod (2^130-5) | AES + GF(2^128) |
| 加密模式 | CTR | CTR | Stream (ChaCha20) | CTR |
| 认证方式 | GHASH | CBC-MAC | Poly1305 | POLYVAL |
| Nonce 长度 | 96 位(标准) | 104-112 位 | 96 位 | 96 位 |
| 标签长度 | 96-128 位 | 32-128 位 | 128 位(固定) | 128 位 |
| 流式加密 | ✅ | ❌ | ✅ | ✅ |
| 并行加密 | ✅ | ❌ | 部分 | ✅ |
| 并行认证 | ✅ | ❌ | 部分 | ✅ |
| Nonce 滥用抵抗 | ❌ | ❌ | ❌ | ✅ |
| 硬件加速依赖 | AES-NI + PCLMULQDQ | AES-NI | 无 | AES-NI + PCLMULQDQ |
| 抗侧信道 | 需要额外措施 | 较好 | 天然较好 | 需要额外措施 |
性能对比
以下为典型 x86-64 平台(支持 AES-NI + PCLMULQDQ)上的相对性能:
注:以下为典型参考值,基于 OpenSSL 3.x 和 libsodium 在对应平台上的公开基准测试数据综合估算。
实际性能受具体实现、编译器优化、数据对齐等因素影响。
具体性能数据请以实际部署环境的基准测试为准。
平台:Intel Core i7(支持 AES-NI + PCLMULQDQ + AVX2)
消息长度 AES-256-GCM ChaCha20-Poly1305 AES-256-CCM
64B ~3.2 Gbps ~2.8 Gbps ~1.8 Gbps
256B ~8.5 Gbps ~5.2 Gbps ~3.5 Gbps
1500B ~12.3 Gbps ~7.8 Gbps ~5.1 Gbps
64KB ~14.1 Gbps ~9.2 Gbps ~5.8 Gbps
ARM Cortex-A72(无 AES-NI,有 NEON):
消息长度 AES-256-GCM ChaCha20-Poly1305 AES-256-CCM
64B ~0.8 Gbps ~1.5 Gbps ~0.6 Gbps
256B ~1.5 Gbps ~3.2 Gbps ~1.1 Gbps
1500B ~2.1 Gbps ~4.8 Gbps ~1.4 Gbps
64KB ~2.4 Gbps ~5.6 Gbps ~1.6 Gbps
注:以上为典型参考值,实际性能受具体实现、编译器优化、数据对齐等因素影响。
具体性能数据请以实际部署环境的基准测试为准。选型决策树
需要 AEAD 加密?
│
┌────┴────┐
│ │
有 AES-NI? 无 AES-NIC?
│ │
┌────┴────┐ │
│ │ │
需要 Nonce 不需要 ChaCha20-Poly1305
滥用抵抗? │ (首选方案)
│ │
┌────┴────┐ AES-GCM
│ │
AES-GCM-SIV AES-GCMAEAD 在国密体系中的应用
SM4-GCM
国密算法 SM4 同样支持 GCM 模式。GM/T 0024-2014《SSL VPN 技术规范》中定义了 SM4-GCM 作为国密 TLS 的核心密码套件之一。
SM4-GCM 的数学结构与 AES-GCM 类似,但有几个关键差异:
- 分组长度:SM4 和 AES 都是 128 位分组,因此 GHASH 的有限域 GF(2^128) 相同
- S 盒差异:SM4 的 S 盒与 AES 不同,影响的是加密部分的性能,不影响 GHASH
- GHASH 中的乘法:使用相同的 GF(2^128) 不可约多项式 P(x) = x^128 + x^7 + x^2 + x + 1
国密协议中的 AEAD 要求
GM/T 0054-2018《信息系统密码应用基本要求》中,对传输层加密的明确要求包括:
- 传输数据应使用经国家密码管理部门核准的密码算法
- 应采用认证加密模式保护数据的机密性和完整性
- 推荐使用 SM4-GCM 模式进行数据加密和认证
AEAD 的工程实践要点
1. Nonce 管理策略
Nonce 管理是 AEAD 工程中最容易出错的环节:
策略 A:计数器模式(推荐用于单连接)
- 从 0 开始,每条消息递增
- 优点:简单、保证唯一性
- 缺点:不能容忍消息丢失或乱序
策略 B:随机 Nonce(推荐用于多连接/无状态场景)
- 使用 CSPRNG 生成随机 Nonce
- 优点:容忍消息丢失和乱序
- 缺点:存在生日悖论碰撞风险
- 安全边界:96 位 Nonce,约 2^48 条消息后碰撞概率达到 50%
策略 C:合成 Nonce(SIV 模式)
- 从明文和关联数据中派生
- 优点:天然抵抗 Nonce 重用
- 缺点:相同明文产生相同密文(泄露相等性)2. 标签长度选择
标签长度与伪造概率:
128 位 → 伪造概率 2^-128(推荐,最高安全级别)
120 位 → 伪造概率 2^-120(NIST 允许的最低值)
96 → 伪造概率 2^-96(短消息场景可接受)
64 → 伪造概率 2^-64(不推荐,仅用于极度受限环境)
NIST SP 800-38D 建议:
- 同一密钥下加密的总数据量不超过 2^39 - 256 位(约 64 GB)
- 推荐标签长度至少 96 位
- 对于高安全场景,使用 128 位标签3. 关联数据的正确使用
关联数据(AAD)是一个强大但容易被误用的特性:
✅ 正确使用:
- TLS 记录头(内容类型、版本、长度)
- IPSec 序列号和 SPI
- 数据包的源/目的地址(防止跨连接重放)
❌ 常见错误:
- 将需要加密的数据放入 AAD(AAD 不会被加密!)
- 在不同上下文中重用相同的 AAD 结构
- 忘记在解密端提供相同的 AAD(会导致认证失败)参考来源
- NIST SP 800-38D: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC — https://csrc.nist.gov/pubs/sp/800/38/d/final
- NIST SP 800-38C: Recommendation for Block Cipher Modes of Operation: The CCM Mode for Authentication and Confidentiality — https://csrc.nist.gov/pubs/sp/800/38/c/final
- RFC 5647: AES Galois Counter Mode for the SSH Transport Layer Protocol — https://www.rfc-editor.org/info/rfc5647
- RFC 8439: ChaCha20 and Poly1305 for IETF Protocols — https://www.rfc-editor.org/info/rfc8439
- RFC 8452: AES-GCM-SIV: Nonce Misuse-Resistant Authenticated Encryption — https://www.rfc-editor.org/info/rfc8452
- RFC 5116: An Interface and Algorithms for Authenticated Encryption — https://www.rfc-editor.org/info/rfc5116
- NIST Block Cipher Techniques (Current Modes) — https://csrc.nist.gov/projects/block-cipher-techniques/bcm/current-modes
- GM/T 0024-2014: SSL VPN 技术规范
- GM/T 0054-2018: 信息系统密码应用基本要求
- D. J. Bernstein, "The Poly1305-AES Message-Authentication Code", 2005
相关实践
- 如需了解 SM4-GCM 在国密 TLS 中的具体实现,请参阅《SM4 分组密码的 GCM 认证加密模式原理》
- 如需了解 TLS 1.3 中 AEAD 密码套件的协商机制,请参阅《国密 TLS 1.1 协议详解:GM/T 0024 与 RFC 8998》
- 如需了解后量子时代的 AEAD 迁移策略,请参阅《后量子密码学:从量子威胁到 NIST 标准化的新密码体系》