密码学的世界观:保密、完整性与不可否认性 / The Worldview of Cryptography: Confidentiality, Integrity, and Non-Repudiation
第 1 章 密码学的世界观:保密、完整性与不可否认性
Chapter 1: The Worldview of Cryptography: Confidentiality, Integrity, and Non-Repudiation
密码学究竟要保护什么?这一问的答案不是书斋里的学者推演出来的,而是用血肉烧出来的——1939 年的波兰,Marian Rejewski 用手工爆破恢复出第一枚 Enigma 密钥;1943 年的布鲁克林,Julius Rosenberg 把浓缩铀情报加密后传给莫斯科,而 NSA 的分析师在二十年后的 Venona 项目中发现电报的"密钥簿"出过纰漏,于是间谍网覆灭、两人受电椅处决。两场相隔半个地球的情报战,分别暴露了"保密性"与"完整性"的失败;它们的灰烬堆上,站着今日工程师必须背熟的三块基石:Confidentiality(保密性)、Integrity(完整性)、Authenticity(真实性 / 认证性),以及它们的衍生品——Non-Repudiation(不可否认性)。本章的任务,是把这四块基石用工程语言重新垒一遍,并搭建一张能为后续十五章共享的概念地图。
1.1 从情报战的灰烬中站起来:三性原则的历史起源
1.1.1 Enigma 与大西洋护航战:保密性失守的代价
德军海军在 1942 年 2 月启用四转子 Enigma M4("Shark"),同时把密钥分发从密钥簿(key book)改为短日密钥。德方工程师自信地认为,密码机的转子接线和每日配置构成"双重隐蔽",破解无异于大海捞针。然而,Bletchley Park 的图灵团队在 Banburismus 序列比对法的加持下,1943 年底重又把 M4 拉回了可读区间。U-boat 的接令、被猎护航船的位置、燃油口令,全部以明文落入英国人眼底。Bletchley Park 的解密输出经过"Ultra"渠道送至丘吉尔桌面,再分发到护航指挥官手中——结果是大西洋护航战的损失率从 1942 年 9 月的约 25% 跌落到 1943 年下半年的不足 2%。这是一个典型Confidentiality 失败的样本:算法(Enigma 机械结构)复杂度极高,但密钥簿分配流程与转子接线"长期不变",于是攻击者把工程难点降级为统计难题,再用机电设备放大。
1.1.2 Venona 与罗森堡案:完整性与不可否认性的崩塌
Venona 项目揭示的是另一类失败。1942–1945 年间,莫斯科中心向纽约、墨西哥城等地的苏联情报站发送约 3000 份单次密钥簿(one-time pad, OTP)加密电报,密钥由电报运营商不经意重用。NSA 的密码分析师在冷战高峰期的 1948 年开始察觉"乱码中有汉景帝陵墓结构"的统计异常,到 1952 年解密出第一批明文。Julius 与 Ethel Rosenberg 的案例里,关键证据是 *Liberal Politburo Member* 系列电报,外加 *PERLO*、*ANTENNA* 等代号对应 FBI 反间谍锁定的几名嫌疑人。法官 Kaufman 在死刑判决中明确援引了 Venona 解密的笔录与证人证言对照。这意味着什么?意味着发射端即使有 OTP 级"绝对保密",也救不了消息被中间人篡改或被双重代理伪造——完整性、真实性、不可否认性三性同时坍塌。
1.1.3 三性原则的工程化提炼
Enigma 与 Venona 的复盘给出三条工程教训:
1. 算法的隐蔽(security by obscurity)无法取代密钥的保密——后者才是攻击者无法穷举的稀有资源; 2. 一份消息可能同时背负多重安全目标,每一项都需独立的密码学原语去维护; 3. 工程上必须明确"我们到底要保护谁、对抗谁、付出多少代价",否则再精巧的原语也是空中楼阁。
CIA(Confidentiality、Integrity、Authenticity)三元组是 20 世纪 80 年代被信息安全社区提炼出来的标准化表达;1998 年 Donn Parker 在他的书 *Fighting Computer Crime* 中把它扩到六元组(Parkerian Hexad)。本章接下来一节就给出它们的形式化定义,并指出哪些性质属于"密码学原语可达",哪些属于"协议可达",哪些"目前还只能写进保险条款"。
1.2 三性的形式化定义:从 CIA 三元组到 Parkerian 六元组
1.2.1 保密性(Confidentiality)
形式定义:给定一个加密方案 $\Pi = (\text{KeyGen}, \text{Enc}, \text{Dec})$,若对于任意概率多项式时间(PPT)的区分器 $\mathcal{A}$,其在 IND-CPA 游戏中 $$\left|\Pr[b = b^\star \mid (pk, sk) \leftarrow \text{KeyGen}(1^\lambda); (m_0, m_1) \leftarrow \mathcal{A}^{\text{LR}}(\cdot); c \leftarrow \text{Enc}(pk, m_b); b^\star \leftarrow \mathcal{A}^{\text{LR}}(c)\right] - \frac{1}{2}\right| \le \epsilon(\lambda)$$ 成立,其中 $\epsilon(\lambda)$ 是可忽略函数,则 $\Pi$ 提供 IND-CPA 保密性。IND-CCA、IND-CCA2、KDM 等更强等级可类比扩展。
更直观地说,保密性的本质是"消息 $\Rightarrow$ 密文"这一过程中,攻击者无法用多项式资源提取出任何比随机猜测更多的信息。注意,保密性只关心被动攻击者;一旦攻击者能修改消息,单靠加密救不了完整性。
1.2.2 完整性(Integrity)与真实性(Authenticity)
完整性在密码学语境下细分为两个子性质:
- **数据完整性(Data Integrity)**:比特级别的未经授权修改应当被检测到。MAC(消息认证码)或 AEAD(认证加密)方案对此负责。形式化定义常以 *unforgeability under chosen-message attack*(UF-CMA)为目标:
$$\text{Adv}_{\text{MAC}}^{\text{uf-cma}}(\mathcal{A}) = \Pr[\text{MAC.Verify}(k, m^\star, \sigma^\star) = 1 \mid (m^\star, \sigma^\star) \leftarrow \mathcal{A}^{\text{MAC.Sign}(k,\cdot)}(\cdot); m^\star \notin \mathcal{Q}] \le \epsilon$$
- **来源真实性(Authenticity / Origin Authentication)**:数据不仅"未被改过",还"来自声称的发送者"。对认证主体(人、设备、进程)做身份绑定是它的延伸——这就是为什么密码原语之外,PKI、TLS、SSH 的证书体系都入场:它们用证书层级把"私钥"绑定到"主体名"。
Kerckhoffs 自己其实更看重真实性——他在 1883 年《La Cryptographie Militaire》中给出六项原则,第四条直指"密钥必须能由通信双方互换,并且能在需要时变更",强调的是端到端真正的"对方是谁"问题;加密只是把对方"打包保密"住的工具。
1.2.3 不可否认性(Non-Repudiation)
仅仅有 MAC 救不了不可否认性——因为 MAC 是对称的,接收方也能伪造一份"看起来来自发送方"的码字,从而无法在争议时指证发送者。要确保"发送方事后无法否认其行为",必须引入不可伪造的第三方可验签名:数字签名方案 $\Sigma = (\text{KeyGen}, \text{Sign}, \text{Verify})$ 在 EUF-CMA 意义下安全(不可伪造),且验证所需公钥是公开、可索引、可追溯的(例如在 X.509 证书层级中绑定到法律主体)。
现实里这一环节往往脱链:PGP 信任网中公钥与现实人物名片的对应关系依赖"线下指纹核验",一旦该步骤出错,签名的不可否认性就变成"可否认"或"可嫁祸"。Venona 的教训正是反面教材——间谍电报虽有 OTP 加密,但发送者身份全靠代号,电报落到 NSA 手中也无法反向追责。
1.2.4 Parkerian 六元组的工程补全
Don Parker 把 CIA 扩展到六元组,加上两项与密码学边缘相关的性质:
| 性质 | 工程含义 | 主要由谁保证 | | --- | --- | --- | | Confidentiality | 数据对未授权者不可见 | 对称加密、公钥加密 | | Integrity | 数据未被未授权篡改 | MAC、AEAD、签名 | | Authenticity | 数据来自声称的来源 | 签名、证书、TLS | | Non-Repudiation | 事后不可否认责任 | 数字签名 + 公证 | | Availability | 服务在需要时可达 | 抗 DoS、冗余、速率限制 | | Utility | 数据对授权方有用 | 备份、压缩、可恢复性 |
最后两项是"密码学相邻"的工程任务:DoS 防御更多在网络/系统层;可用性和实用性本身并不需要加密原语,但也常因密码学失败而被波及(例如 2018 年的 Let's Encrypt CAA bug 曾短暂吊销约 2.7% 的活跃证书,造成全网服务不可用——这算 Availability 失守,密码学本身没出错,运营商的政策系统错)。
把这六条合在一起,可以理解为"现代应用安全的多目标函数"。工程师编写协议时,必须先回答"这六项中,我们要实现的是哪几条子集?用何种原语或工程手段?剩余的由谁来兜底?"——回答不出这些,工程只能停留在教科书级别。
1.3 Kerckhoffs 原则与香农格言:把安全放在明面上
1.3.1 Kerckhoffs 六原则的精简重述
1883 年 Auguste Kerckhoffs 在《La Cryptographie Militaire》第二条原则指出:"系统的安全性不应依赖于让对手无法理解的加密机制,而应依赖于密钥的保密性"。这一句话在 140 年后的今天被简化为 Kerckhoffs's Principle,但其原义远比口号丰富:
1. 系统应该在理论上不可破解; 2. 系统的安全性不应依赖于让对手无法理解的加密机制,而应依赖于密钥的保密性; 3. 密钥应当易于记忆,无需书面记录,且双方能互换; 4. 系统应能用电报传输; 5. 系统应便携,仅需少量操作员; 6. 系统在易于理解、操作的同时,应在所有条件下可靠运作。
注意第二条之后的细则才是工程落地的真问题:密钥易记、易交换,意味着密钥不能太长、不能依赖未审计的硬件——这是 Public-key Cryptography 在 1976 年出现前几乎无法逾越的鸿沟,也是现代 TLS 用 ECDHE 临时密钥的原因。
1.3.2 Shannon 的重新表述与"敌人已知系统"
Claude Shannon 1949 年 *Communication Theory of Secrecy Systems* 把 Kerckhoffs 第二条浓缩为一句工程名言:"The enemy knows the system"(敌人已知系统)。这意味着我们必须假设攻击者拿到完整的协议规范、参考实现、甚至源码——唯独不知密钥。Shannon 还引入了信息论安全(又称无条件安全、完美保密)的概念:一个加密方案若 $$\Pr[M = m \mid C = c] = \Pr[M = m]$$ 对任意 $m, c$ 成立,即密文 $C$ 不泄漏关于明文 $M$ 的任何信息,就称其完美保密。Vernam 单次密钥簿(OTP)是唯一的完美保密方案。但 OTP 要求密钥长度等于明文长度、不可重用、安全分发——这些工程约束让 OTP 在绝大多数场景中无法使用。所以现代密码学退而求其次,求计算安全(Computational Security):在多项式时间内区分器不能胜出,$\epsilon(\lambda)$ 可忽略即可。
1.3.3 违背 Kerckhoffs 的工程惨案
工程界把"闭源即安全"称为 Security by Obscurity,它有大量反面教材:
- **GSM 的 A5/1 算法**:1990 年代,GSM 联盟把 A5/1 算法文档定为版权控制下的机密文件。1999 年,Marc Briceno 与朋友把藏在 SIM 卡分发链中的字节数组拼回算法;同年 Marc0mo、Ross Anderson 的工作把 A5/1 列为"全球最广泛使用却从不公开"的算法。2003 年,Elad Barkan、Eli Biham、N Keller 的 *"Instant Ciphertext-Only Cryptanalysis of GSM Encrypted Communication"* 给出基于 Rainbow Tables 的实时破解:只要 4TB 预算,1 秒即可解密一条 2G 通话。一个被刻意隐蔽的算法,最终在大规模攻击下毫无意义。
- **CSS(Content Scramble System)**:1996 年 DVD 论坛推出 CSS 时使用 40-bit 密钥并隐瞒算法。1999 年挪威程序员 Jon Lech Johansen(DVD Jon)发布的 DeCSS 在几年内破解完所有 DVD。隐藏没有拖延破解,反而拖延了密钥轮换、协议升级的窗口。
- **KEO(Kerberos V 的部分早期部署)**:早期 Kerberos 实现中票据(ticket)字段保留公司约定俗成的"私有字串"用于会话识别,攻击者无需攻破票据,只要算出"私有字串"在密文中的偏移,即可中间人。这与 OTP 不重用原则的失败模式类似——失败的不是加密,而是围绕它的协议假设。
Kerckhoffs 原则的真正含义,不是鼓励开源,而是把所有非密钥的部分都当成攻击者已知来审计。通过公开规范,把漏洞从"暗箱里的隐疾"变成"阳光下可修补的缺陷",这是安全工程的胜利姿态。
1.4 威胁模型:被动、主动与侧信道的三层攻击面
1.4.1 Dolev-Yao 攻击者模型:现代密码协议的事实假设
1981/1983 年 Danny Dolev 与 Andrew Yao 给出现代密码协议的标准威胁模型:攻击者控制整个通信网络。这意味着:
- 攻击者可以监听(read)任意在信道上传输的消息;
- 攻击者可以阻断(drop)任意消息;
- 攻击者可以注入(forge)任意消息;
- 攻击者可以重放(replay)任意旧消息;
- 攻击者**不能**访问参与者的私有状态(私钥、本地存储)——除非协议本身设计失败把密钥广播出去。
Dolev-Yao 模型使得"加密信道 + 不可否认性签名 + 抗重放计数器 + 完整性 MAC"成为必须而非可选。本书后续章节对 TLS、Signal、SSH 的安全证明,几乎都建立在 Dolev-Yao 上。
1.4.2 被动攻击:只看不改
Passive Attack 定义:攻击者仅在协议通信链路上观测消息,不修改、不注入、不重放。常见威胁是窃听(Eavesdropping)。理论上,被动攻击只能伤害 Confidentiality,但它们有时会被升级:例如 TLS 1.2 的 CBC 模式曾在 2011 年通过 BEAST 攻击利用 chosen-plaintext 类的被动能力,把"只读"变成"可注入明文",最终碰撞出 IV 重复导致可解密段。
工程上对被动攻击的核心防御是加密(对称或非对称),以及针对流量的元数据保护(Tor 的多重中继、mixnets 的重排序)。注意:流量元数据的暴露("什么时候、跟谁、多大量")即使在端到端加密下也无法避免,是 *traffic analysis*,它是密码学盲区,常需独立工程手段(如 WPAD 填充、Marionnet 协议、苹果的 iCloud Private Relay)。
1.4.3 主动攻击:能改、能注入、能重放
Active Attack 是 Dolev-Yao 模型下的标准攻击形态。常见子型包括:
- **Man-in-the-Middle(MITM)**:攻击者在通信双方之间代收/转发消息。公钥体制的 Certificate Authority(CA)和 Certificate Transparency(CT)几乎完全是为对抗 MITM 而设。
- **Tampering**:在传输链路上修改密文或签名;AEAD 就是为此而生的原语。
- **Replay**:恶意重传合法历史消息;防护手段是 **nonce / counter** 或基于时间戳(带 bound)的 PRF。
- **Chosen-Ciphertext Attack(CCA)**:攻击者获取解密机访问权,可解密任意自己构造的密文,观察其返回。RSA-OAEP、CRYSTALS-Kyber 的 Fujisaki-Okamoto 变换都建立在 IND-CCA 安全上。
1.4.4 侧信道攻击:物理副信道的泄露
Side-Channel Attack (SCA) 是 Dolev-Yao 之外的第二战场。一份正确实现的 IND-CCA 安全算法,仍可能通过物理实现的可观察副产物泄露密钥:
- **Timing Attack**:执行时间随密钥位的不同而异。1996 年 Paul Kocher 揭示 RSA 私钥运算时间可被用来推断 mod 运算的汉明重量,进而恢复私钥。
- **Power Analysis**:简单(SPA)与差分(DPA)功耗分析。Kocher 在 1999 年 DPA 论文中给出基于汉明距离模型的密钥恢复,使智能卡物理攻击从理论走入工程。
- **Cache Attack**:Flush+Reload、Prime+Probe 利用共享 L3 cache 的访问痕迹,从同机云租户进程间窃取 RSA 私钥(2014 年 Last-Level Cache 跨 VM 攻击)。
- **EM Emanation**:1934 年