密码学安全模型:从 IND-CPA 到 IND-CCA2 的攻击者能力层级
概述
密码学安全模型是评估密码方案安全性的形式化框架。它精确定义了攻击者能做什么、不能做什么,以及什么算作"被攻破"。理解安全模型是正确选择密码算法、评估合规要求的基础。
本文从两个核心实验框架出发——不可区分性(Indistinguishability)和不可伪造性(Unforgeability),逐步展开从 IND-CPA 到 IND-CCA2 的攻击者能力层级,并说明这些模型如何对应真实世界攻击,以及国密算法在这些模型中的定位。
不可区分性实验框架
从完美保密到语义安全
香农在 1949 年提出完美保密(Perfect Secrecy):密文不泄露明文的任何信息,即 $P(m|c) = P(m)$。但完美保密要求密钥长度不小于消息长度,实际中不可行。
Goldwasser 和 Micali 在 1984 年提出语义安全(Semantic Security):密文不泄露明文的任何可计算信息。这引出了不可区分性实验框架。
IND-CPA:选择明文攻击下的不可区分性
实验流程:
- 挑战者生成密钥 $k \leftarrow \text{Gen}(1^n)$
- 攻击者 $\mathcal{A}$ 可以访问加密预言机 $\text{Enc}_k(\cdot)$,提交任意明文获取密文
- $\mathcal{A}$ 输出两个等长明文 $m_0, m_1$
- 挑战者随机选择 $b \in \{0,1\}$,返回挑战密文 $c^* = \text{Enc}_k(m_b)$
- $\mathcal{A}$ 可以继续访问加密预言机,输出猜测 $b'$
- 若 $b' = b$,攻击者成功
$$\text{Adv}^{\text{ind-cpa}}_{\mathcal{A}}(n) = \left|\Pr[b'=b] - \frac{1}{2}\right|$$
安全定义:若对所有概率多项式时间(PPT)攻击者,优势 $\text{Adv}$ 是关于安全参数 $n$ 的可忽略函数,则方案是 IND-CPA 安全的。
实际含义:即使攻击者能加密任意明文,也无法从密文中区分出是哪条明文。
哪些方案满足/不满足 IND-CPA:
| 方案 | IND-CPA | 原因 |
|---|---|---|
| SM4-ECB | ❌ | 确定性加密,相同明文产生相同密文 |
| SM4-CBC (random IV) | ✅ | 随机 IV 使相同明文产生不同密文 |
| SM4-CTR | ✅ | 随机 nonce 保证概率加密 |
| SM4-GCM | ✅ | 认证加密,概率加密 + 完整性 |
| RSA-PKCS#1 v1.5 | ❌ | 确定性填充,可被区分 |
| RSA-OAEP | ✅ | 随机化填充 |
IND-CCA1:非适应性选择密文攻击
在 IND-CPA 基础上,攻击者在收到挑战密文之前可以访问解密预言机 $\text{Dec}_k(\cdot)$。
关键限制:收到 $c^*$ 后不能再访问解密预言机。
实际含义:攻击者能在挑战前收集(密文,明文)对,但不能利用挑战密文来获取解密帮助。
IND-CCA2:适应性选择密文攻击
最强模型。攻击者在整个实验过程中都可以访问解密预言机,唯一的限制是不能直接提交 $c^*$ 本身去解密。
实际含义:攻击者可以基于挑战密文构造相关密文(如修改某些字节、截断、重排)并提交解密,观察结果。
为什么 IND-CCA2 是黄金标准:
- 真实攻击中,攻击者往往能提交修改后的密文并观察错误消息(Padding Oracle)
- IND-CCA2 安全保证即使攻击者能解密其他密文,也无法从 $c^*$ 中提取信息
- 认证加密(AEAD)天然满足 IND-CCA2
三种模型的关系
$$\text{IND-CCA2} \Rightarrow \text{IND-CCA1} \Rightarrow \text{IND-CPA}$$
逆命题不成立。例如:
- SM4-CBC with random IV 是 IND-CPA 安全,但不是 IND-CCA2 安全(Padding Oracle 攻击可奏效)
- SM4-GCM 是 IND-CCA2 安全(认证加密天然抵抗选择密文攻击)
不可伪造性实验框架
EUF-CMA:选择消息攻击下的存在性不可伪造
用于数字签名方案。
实验流程:
- 挑战者生成密钥对 $(pk, sk) \leftarrow \text{Gen}(1^n)$
- 攻击者 $\mathcal{A}$ 获得公钥 $pk$ 和签名预言机 $\text{Sign}_{sk}(\cdot)$
- $\mathcal{A}$ 自适应地查询消息 $m_1, m_2, \ldots, m_q$ 的签名 $\sigma_i$
- $\mathcal{A}$ 输出 $(m^*, \sigma^*)$
- 成功条件:$\text{Verify}(pk, m^*, \sigma^*) = 1$ 且 $m^*$ 未被查询过签名预言机
SUF-CMA:强存在性不可伪造
更强条件:攻击者能对已签名消息生成不同签名也算成功。即 $(m^*, \sigma^*)$ 中 $\sigma^*$ 不同于之前查询返回的任何签名。
实际含义:防止签名伪造和签名变形攻击。
EUF-CMA vs SUF-CMA:
| 方案 | EUF-CMA | SUF-CMA | 说明 |
|---|---|---|---|
| SM2 签名 | ✅ | ❌ | 签名可变形:$(r, s)$ 和 $(r, -s \bmod n)$ 都有效 |
| RSA-PSS | ✅ | ✅ | 强不可伪造 |
| RSA-PKCS#1 v1.5 | ✅ | ❌ | 存在签名变形可能 |
| ECDSA | ✅ | ❌ | 类似 SM2,签名可变形 |
安全模型与实际攻击的对应
Padding Oracle 攻击 vs IND-CCA2
2002 年 Vaudenay 发现的 Padding Oracle 攻击:攻击者利用服务器返回的"填充错误"与"MAC 错误"的不同响应,逐字节解密密文。
攻击原理:
- 攻击者截获密文 $C = C_1 \| C_2 \| \ldots \| C_n$
- 修改 $C_{i-1}$ 的字节,提交给服务器
- 观察服务器响应:填充错误 vs 其他错误
- 通过二分搜索确定中间状态值,恢复明文
防御:使用认证加密(SM4-GCM、AES-GCM),在解密前先验证认证标签。认证加密天然是 IND-CCA2 安全的。
Bleichenbacher 攻击 vs PKCS#1 v1.5
1998 年 Bleichenbacher 针对 RSA-PKCS#1 v1.5 的填充预言攻击。服务器对填充格式的错误响应不同,攻击者利用这一差异恢复明文。
攻击原理:
- 攻击者截获密文 $c = m^e \bmod n$
- 选择随机数 $s$,构造修改密文 $c' = (s^e \cdot c) \bmod n$
- 提交 $c'$ 给服务器,观察是否返回"填充错误"
- 通过大量查询缩小明文范围,最终恢复完整明文
防御:使用 RSA-OAEP(随机化填充,错误不泄露填充信息)。
ROBOT 攻击:Bleichenbacher 的现代变种
2018 年 Böck 等人在 15 年后重新验证了 Bleichenbacher 攻击的现实威胁,发现包括 Facebook、PayPal 在内的多个主流网站仍受影响。
教训:不安全方案不会因为时间流逝而变得安全,唯一正确的做法是彻底替换。
KEM 安全模型
IND-CCA2 for KEM
密钥封装机制(KEM)的安全模型与加密类似,但目标不同:
- KEM 的输出是(密文,密钥)对 $(c, k)$
- 攻击者需要区分 $k$ 与随机密钥 $k'$
- IND-CCA2 安全的 KEM 保证即使攻击者能解封装其他密文,也无法区分真实密钥
国密算法的安全模型定位
SM4 工作模式选择
| 模式 | IND-CPA | IND-CCA2 | 适用场景 |
|---|---|---|---|
| ECB | ❌ | ❌ | 仅用于密钥包装,不推荐 |
| CBC | ✅ (random IV) | ❌ | 需要额外 MAC(如 HMAC-SM3) |
| CTR | ✅ | ❌ | 需要额外 MAC |
| GCM | ✅ | ✅ | 推荐默认选择 |
| CCM | ✅ | ✅ | 资源受限环境 |
SM2 签名的安全属性
SM2 数字签名算法(GM/T 0003.2-2012)在随机预言机模型下被证明是 EUF-CMA 安全的。
注意签名可变形性:给定有效签名 $(r, s)$,$(r, n-s)$ 也是有效签名($n$ 为曲线阶)。这在某些需要签名唯一性的场景需要额外处理:
- 在签名后检查 $s < n/2$,若不满足则取 $n-s$
- 或在协议层添加唯一标识
SM2 加密的安全属性
SM2 公钥加密(GM/T 0003.4-2012)使用 C1C3C2 密文格式:
- C1:临时公钥(随机点)
- C3:SM3 哈希(完整性校验)
- C4:异或加密数据
安全模型与合规评估
等保/密评中的隐含要求
GB/T 39786-2021 和 GM/T 0054-2018 中的多项要求隐含了安全模型:
| 条款 | 隐含安全模型 | 实现方式 |
|---|---|---|
| 数据传输机密性 | IND-CPA | SM4-CBC/CTR + random IV |
| 数据传输完整性 | 完整性保护 | HMAC-SM3 或 SM4-GCM |
| 数据传输抗重放 | IND-CCA2 | SM4-GCM(认证加密) |
| 身份认证 | EUF-CMA | SM2 数字签名 |
为什么密评要求认证加密
密评实践中,仅使用 SM4-CBC 而不配 MAC 会被扣分。原因正是 CBC 不满足 IND-CCA2——攻击者可通过 Padding Oracle 攻击篡改密文。
正确做法:
- 首选:SM4-GCM(认证加密,单次处理)
- 备选:SM4-CBC + HMAC-SM3(Encrypt-then-MAC 模式)
总结
安全模型是密码学工程的"语言"。理解 IND-CPA/IND-CCA2 和 EUF-CMA/SUF-CMA 的差异,能帮助你在以下场景做出正确选择:
- 算法选型:需要认证加密时选择 GCM/CCM,而非裸 CBC/CTR
- 合规评估:GM/T 0054-2018 的"传输加密"要求隐含 IND-CCA2 安全
- 漏洞分析:Padding Oracle 攻击的本质是方案不满足 IND-CCA2
- 协议设计:TLS 1.3 强制使用 AEAD 模式,确保 IND-CCA2 安全
- 签名唯一性:区块链等场景需要 SUF-CMA,SM2 需要额外处理签名变形
参考来源
- GM/T 0001-2012《SM4 分组密码算法》
- GM/T 0003.2-2012《SM2 第2部分:数字签名算法》
- GM/T 0003.4-2012《SM2 第4部分:公钥加密算法》
- GM/T 0054-2018《信息系统密码应用基本要求》
- GB/T 39786-2021《信息安全技术 信息系统密码应用基本要求》
- Goldwasser S, Micali S. Probabilistic encryption[J]. Journal of Computer and System Sciences, 1984, 28(2): 270-299.
- Bellare M, Rogaway P. Optimal asymmetric encryption[A]. Advances in Cryptology — EUROCRYPT '94, 1994.