认证加密与关联数据(AEAD):从加密到认证的统一框架

密码学概念 · 2026-06-11

概述

在现代密码学中,仅有加密远远不够。一个只提供机密性却不提供完整性保护的加密系统,如同一个只锁前门却敞开窗户的保险箱——攻击者虽然无法直接读取密文,但可以通过篡改、重排、截断密文来破坏系统的安全性。认证加密(Authenticated Encryption, AE) 正是为解决这一根本问题而诞生,它在同一个算法框架内同时提供加密和消息认证两个功能。

AEAD(Authenticated Encryption with Associated Data) 是认证加密的进一步扩展。"关联数据"(Associated Data)指的是那些需要认证但不需要加密的数据——例如网络数据包的头部、协议元数据、加密文件的文件名等。AEAD 能够同时保证:

  • 机密性(Confidentiality):密文不泄露明文的任何信息
  • 完整性(Integrity):任何对密文或关联数据的篡改都能被检测到
  • 真实性(Authenticity):密文确实由持有正确密钥的一方生成

AEAD 在现代协议中的核心地位

AEAD 已成为几乎所有现代安全协议的默认加密模式:

协议默认 AEAD 模式备注
TLS 1.3AES-GCM, ChaCha20-Poly1305所有密码套件均为 AEAD
IPSec (IKEv2)AES-GCM, AES-CCMESP 协议强制使用 AEAD
SSHAES-GCM (RFC 5647), ChaCha20-Poly1305AEAD 密码套件(RFC 5647, IANA 注册)
WireGuardChaCha20-Poly1305唯一支持的加密模式
国密 TLS (GM/T 0024)SM4-GCM国密协议中的 AEAD 方案

历史演进:为什么需要 AEAD

第一阶段:分离的加密与认证

在 AEAD 概念出现之前,加密和认证是两个独立的操作,开发者需要自行组合。这种组合方式存在严重的安全隐患。

三种经典组合方式及其缺陷:

这三种方式各有问题,但核心矛盾在于:加密和认证是两个独立的设计决策,将它们组合在一起时,接口边界处最容易出现安全漏洞。

第二阶段:从组合到统一

2000 年前后,密码学界开始认识到,加密和认证不应该被视为两个独立的功能,而应该被统一在一个算法中。这一认识的直接推动力是 2001 年对 CBC 模式填充 oracle 攻击的发现

  • Vaudenay (2002) 证明,在 CBC 模式下,攻击者可以通过观察服务器对填充错误和 MAC 错误的不同响应时间,逐字节恢复明文
  • 这一攻击直接影响了 SSL/TLS 协议的安全性,迫使 IETF 重新审视加密和认证的组合方式
核心洞察是:如果加密和认证在算法设计阶段就统一考虑,而不是事后组合,就能从根本上消除这类接口漏洞。

第三阶段:AEAD 标准化

2004 年,IETF 在 RFC 5116 中正式定义了 AEAD 的抽象接口:

CODE
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
在 IND-CCA2 安全下,攻击者无法区分两个等长明文的加密结果。

2. 密文完整性(INT-CTXT)

攻击者无法构造出一个从未被加密过的、能通过认证验证的密文。即使攻击者看到了许多有效的 (密文, 标签) 对,也无法伪造新的有效对。

AEAD 的核心定理: 同时满足 IND-CCA2 和 INT-CTXT 的 AEAD 方案,等价于同时提供机密性、完整性和真实性。这意味着 AEAD 的安全性可以归约为这两个标准的密码学游戏。

Nonce 与密钥管理

AEAD 方案的安全性严重依赖于 Nonce(一次性数字)的管理:

  • 唯一性要求:同一个密钥下,每个 Nonce 只能使用一次
  • Nonce 重用灾难:如果同一个 Nonce 被使用两次,大多数 AEAD 方案的安全性会完全崩溃
- 在 GCM 中,Nonce 重用会导致 GHASH 密钥泄露,进而允许伪造任意消息 - 在 ChaCha20-Poly1305 中,Nonce 重用会暴露 XOR 密钥流,允许恢复明文

CODE
安全性层次:
  密钥 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) 上的多项式乘法。定义不可约多项式:

CODE
P(x) = x^128 + x^7 + x^2 + x + 1

GHASH 函数将关联数据 A 和密文 C 映射为 GF(2^128) 上的一个值:

CODE
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)  (长度编码)

#### 加密流程

#### 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)运算和素域模运算,纯软件实现高效
这意味着在没有 AES-NI 指令的 ARM 处理器、嵌入式设备和旧硬件上,ChaCha20-Poly1305 通常比 AES-GCM 更快。

#### ChaCha20 核心函数

ChaCha20 的核心是一个 20 轮的 ARX 置换,操作在 4×4 的 32 位字矩阵上:

#### Poly1305 认证

Poly1305 使用素数 p = 2^130 - 5 上的多项式求值:

CODE
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 结构:

CODE
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 从明文和关联数据中派生,而不是外部提供

CODE
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 设计范式:

CODE
通用 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 模式综合对比

技术特性对比

特性GCMCCMChaCha20-Poly1305GCM-SIV
标准SP 800-38DSP 800-38CRFC 8439RFC 8452
底层原语AES + GF(2^128)AES + CBC-MACARX + mod (2^130-5)AES + GF(2^128)
加密模式CTRCTRStream (ChaCha20)CTR
认证方式GHASHCBC-MACPoly1305POLYVAL
Nonce 长度96 位(标准)104-112 位96 位96 位
标签长度96-128 位32-128 位128 位(固定)128 位
流式加密
并行加密部分
并行认证部分
Nonce 滥用抵抗
硬件加速依赖AES-NI + PCLMULQDQAES-NIAES-NI + PCLMULQDQ
抗侧信道需要额外措施较好天然较好需要额外措施

性能对比

以下为典型 x86-64 平台(支持 AES-NI + PCLMULQDQ)上的相对性能:

选型决策树

AEAD 在国密体系中的应用

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 工程中最容易出错的环节:

2. 标签长度选择

CODE
标签长度与伪造概率:
  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)是一个强大但容易被误用的特性:

CODE
✅ 正确使用:
  - 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

相关实践