密码学导论:历史、原则与威胁模型
第1章:密码学导论:历史、原则与威胁模型
密码学(Cryptography)——这个源自古希腊语“*kryptós*”(隐藏)与“*gráphein*”(书写)的词汇——远不止是算法与数学的集合。它是人类文明中一场永不落幕的攻防博弈,是理性与创造力在信息保密领域的终极交锋。本章将为您拉开这场宏大叙事的序幕,建立贯穿全书的核心分析框架:我们为何需要密码学?其根本目标是什么?一套“好”的密码系统应遵循何种哲学?我们又该如何科学、严谨地评估其安全性?这些问题的答案,构成了从凯撒的军令到量子密钥分发(QKD)一切演进的基石。
1.1 历史长河:从隐秘墨水到数学堡垒
密码学的发展并非线性进步,而是数次范式转移的集合。理解其历史,是理解其现状与未来的关键。
1.1.1 古典时代:手工艺术的巅峰(公元前至19世纪)
早期密码学是“艺术”而非“科学”,其安全性完全依赖于算法的保密与操作者的忠诚。
- **古埃及**:最古老的已知密码实例并非用于军事,而是用于**仪式与装饰**。例如,在法老墓穴壁画中,工匠会将某些符号顺序颠倒或替换,这更接近一种“神秘化”手段而非实用保密。
- **斯巴达的密码棒(Scytale)**:约公元前5世纪。将一条皮革长条螺旋缠绕在特定直径的木棒上,沿轴向书写信息;解下后,皮革上呈现杂乱无章的字母串。只有拥有**相同直径木棒**的接收者才能重新缠绕并还原信息。其安全基于**物理参数的保密**(棒径),一旦泄露即失效。这是一个典型的**转置密码**。
- **凯撒密码(Caesar Cipher)**:公元前1世纪。将明文字母表**循环移位**固定位数(如3位)。其安全性极低,因为密钥空间仅25种可能(移位1-25位)。它引入了**密钥(Key)** 的概念——一个独立的、可变的参数,与算法本身分离。这是密码学思想的一次飞跃。
- **阿尔伯蒂的密码盘(Alberti Cipher Disk)**:15世纪文艺复兴时期。由莱昂·巴蒂斯塔·阿尔伯蒂发明,是第一个已知的**多表替换密码**系统。它包含两个同尺寸的字母表圆盘(内盘固定,外盘可旋转),通过**改变旋转角度(密钥)** 实现字母到字母的复杂映射,并可手动切换“密钥字母”,极大增加了频率分析的难度。这标志着密码学开始从简单替换走向**动态、多状态**的系统。
历史启示:古典密码的核心弱点在于Kerckhoffs假设的反面——它们将安全建立在“敌人不知道算法”的脆弱基础上。一旦算法被俘获(如通过间谍或缴获),系统即告崩溃。
1.1.2 机械与机电时代:规模化的尝试(19世纪至二战)
工业革命带来了密码机械化的可能,但核心原理仍是古典的复杂化。
- **恩尼格玛密码机(Enigma Machine)**:纳粹德国在二战中广泛使用的机电转子密码机。其安全性源于:
1. 多个转子:每个转子实现一个字母替换,多个转子串联形成复合替换。 2. 转子步进:每按一次键,至少一个转子转动,改变替换映射。 3. 反射器(Reflector):保证加密解密对称,但同时也导致一个关键弱点:一个字母永远不会被加密成它自己。 尽管恩尼格玛的密钥空间巨大( rotor 排列、环位设置、插板接线等),但盟军(尤其是波兰的雷耶夫斯基、英国的图灵)通过数学分析、捕获硬件、利用操作失误(如重复的天气报告密钥) 成功破译。这证明了即使最复杂的机械密码,若设计或使用不当,仍可被系统性的密码分析(Cryptanalysis) 攻破。图灵的“Bombe”机是自动化密码分析的先驱。
历史启示:恩尼格玛的破译表明,安全性不能依赖于操作的完美无缺。必须设计即使在使用习惯存在微小偏差时,仍能保持一定强度的系统。
1.1.3 信息论与现代密码学革命(1949-1976)
两次里程碑事件将密码学从艺术转变为基于数学的工程科学。
- **香农的《通信的数学理论》(1949)**:克劳德·香农正式提出了**保密系统的信息论模型**。他定义了**完全保密(Perfect Secrecy)** 的概念:当且仅当密文不提供关于明文的任何信息时,即 $I(M;C)=0$(M为明文,C为密文)。他证明了**一次一密(One-Time Pad, OTP)** 是实现完全保密的唯一方法:密钥是真正随机、与明文等长、且仅使用一次的比特串。OTP在理论上是不可破的,但其**密钥分发与存储的困难**使其实用性受限。香农的工作确立了**用数学(概率论、信息论)衡量安全**的范式。
- **DES(数据加密标准,1977)**:由IBM设计、NSA修改、NIST发布的首个**公开、标准化**的对称加密算法。其意义不在于其强度(如今56位密钥已被暴力破解),而在于它确立了现代密码学设计的**黄金标准**:**算法公开,安全仅依赖于密钥保密(Kerckhoffs原则)**。DES的公开征集、公开分析、公开评估过程,开创了**公开审查(Open Scrutiny)** 的文化,任何声称安全的系统必须能经得起全球密码学界的审视。
1.1.4 公钥密码学与数字革命(1976至今)
- **Diffie-Hellman密钥交换(1976)**:Whitfield Diffie与Martin Hellman发表了划时代论文《密码学的新方向》,提出了**公钥密码学(Public-Key Cryptography)** 的概念,并给出了第一个**密钥交换协议**。它允许双方在不安全的信道上,通过交换公开信息,**协商出一个共享的秘密密钥**。其安全性基于**离散对数问题**的计算困难性。这解决了对称密码的**密钥分发难题**。
- **RSA公钥加密与签名(1977)**:Rivest, Shamir, Adleman基于**大整数分解问题**提出了第一个实用的公钥加密和数字签名方案。RSA的数学优雅且易于实现,迅速成为非对称密码的代名词。公钥密码学不仅解决了密钥分发,更催生了**数字签名、身份认证、公钥基础设施(PKI)** 等全新安全服务。
历史演进主线:密码学从 “算法保密” (古典) → “密钥保密” (DES时代) → “问题保密” (公钥时代,即安全基于数学难题的困难性,而非算法细节)演进。每一次飞跃都伴随着攻击模型的进化和安全定义的精确化。
1.2 核心安全目标:密码学的使命
现代密码学旨在实现四大核心安全目标,这些目标常被合称为CIA三元组(Confidentiality, Integrity, Availability) 的密码学实现,并增加了不可否认性。
- **机密性(Confidentiality)**:确保信息仅被授权实体访问。这是最古老的目标。**实现技术:加密(Encryption)**。加密算法 $Enc_k(M)$ 使用密钥 $k$ 将明文 $M$ 转换为密文 $C$。只有持有正确密钥的授权方才能解密 $Dec_k(C)=M$。
- **完整性(Integrity)**:确保信息在传输或存储过程中未被篡改(无论是恶意还是意外)。**实现技术:密码散列函数(Cryptographic Hash Function)与消息认证码(MAC)**。散列函数 $H(M)$ 输出固定长度的“指纹”(哈希值)。任何对 $M$ 的微小改动都会导致 $H(M)$ 几乎必然改变。MAC(如 $MAC_k(M)$)则结合密钥,提供**可认证的完整性**,只有知道密钥的实体才能生成有效的MAC。
- **认证(Authentication)**:确保实体身份的真实性(“你是你所声称的那个人”)以及信息来源的真实性(“此消息确实来自声称的发送者”)。**实现技术:数字签名、MAC、身份认证协议**。数字签名 $Sign_{sk}(M)$ 使用发送者的**私钥**生成,任何持有其**公钥**的验证者均可验证签名,从而同时实现**消息认证**与**发送者认证**。
- **不可否认性(Non-repudiation)**:防止发送者事后否认其发送过的消息。这是**数字签名的核心属性**。由于签名仅能由持有对应私钥的实体生成,而私钥理论上只有实体自己持有,因此签名提供了**证据**,使发送者无法抵赖。
重要关系:这些目标并非孤立。例如,一个安全的通信协议(如TLS)需要: 1. 密钥交换(非对称加密)建立会话密钥。 2. 对称加密(如AES)保障传输过程的机密性。 3. MAC或认证加密(如AES-GCM)保障完整性与认证。 4. 数字签名(如RSA-PSS)在握手阶段用于服务器认证并提供不可否认性。
1.3 设计哲学基石:Kerckhoffs原则与密码系统的本质
19世纪荷兰密码学家奥古斯特·柯克霍夫(Auguste Kerckhoffs) 在《军事密码学》中提出了著名的六条原则,其中第二条成为现代密码学的基石: > “即使密码系统的所有细节都落入敌手,只要密钥保持秘密,系统仍然安全。”
这就是Kerckhoffs原则。它与“密码学中的安全应当依赖于密钥的保密,而非算法的保密”这一信条完全等价。
1.3.1 为何必须如此?
1. “算法保密”不可持续:硬件/软件可能被缴获、逆向工程;内部人员可能叛变;算法可能通过侧信道(功耗、电磁辐射)泄露。 2. “算法公开”带来巨大优势:
- **广泛审查**:公开算法允许全球密码学家对其进行攻击尝试,快速发现缺陷。这是“**Linus定律**”(Given enough eyeballs, all bugs are shallow)在密码学中的体现。DES、AES的公开征集与数年分析是其最终被信任的关键。
- **标准化与互操作性**:公开标准(如AES, SHA-3, RSA-PSS)使得不同厂商的产品可以安全互操作。
- **信任可验证**:用户不必盲目相信厂商的“黑盒”宣传,可以自己或委托专家评估算法。
3. 密钥可管理:密钥是相对短小的随机比特串,可以通过物理手段(一次性密码本)、密钥交换协议(DH)、或公钥加密(RSA)进行安全分发和更换。而更换一个广泛部署的算法是灾难性的。
对比:Shannon的“完全保密”:香农证明了OTP满足完全保密,但OTP的密钥必须满足随机、等长、一次一密。这本质上是一种密钥空间等于消息空间的极端情况,无法用于大规模通信。现代密码学接受计算安全性(Computational Security):在攻击者有限计算资源(时间、空间) 下,破译密文的概率可忽略不计(如小于 $2^{-128}$)。Kerckhoffs原则是计算安全模型的前提假设。
1.3.2 现代实现:密码原语与协议
基于此原则,现代密码系统被分解为:
- **密码原语(Cryptographic Primitives)**:提供单一基本安全功能的底层算法,如:
- 对称加密(AES)
- 公钥加密(RSA-OAEP)
- 数字签名(ECDSA)
- 密码散列(SHA-3)
- 密钥派生函数(HKDF)
- **密码协议(Cryptographic Protocols)**:将多个原语按特定顺序组合,以实现复杂的安全目标,如:
- TLS 1.3:结合了非对称密钥交换(ECDHE)、对称加密(AES-GCM)、签名(ECDSA/RSA-PSS)、散列(SHA-256)等,实现安全通信会话。
- 比特币交易:结合了椭圆曲线签名(ECDSA)、散列(SHA-256)实现所有权认证与交易完整性。
设计哲学:不要自己设计密码原语或协议。即使你是天才,也几乎不可能在第一次就避免所有潜在弱点(如差分密码分析、时序攻击)。必须使用经过广泛公开审查、有标准定义的成熟方案(如NIST、IETF、ISO标准)。
1.4 安全证明的目标:IND-CPA, IND-CCA等
如何形式化地证明一个密码方案“安全”?这需要先定义攻击模型(Adversarial Model) 和安全目标(Security Goal)。
1.4.1 攻击模型:攻击者知道什么?能做什么?
攻击者的能力是分级的,从弱到强:
| 攻击模型 | 英文全称 | 攻击者能力 | 对应现实场景 | | :--- | :--- | :--- | :--- | | 唯密文攻击 | Ciphertext-Only Attack (COA) | 仅观察密文 $C$ | 窃听一条加密通信 | | 已知明文攻击 | Known-Plaintext Attack (KPA) | 拥有若干 $(M_i, C_i)$ 对 | 已知部分文件头及其加密结果 | | 选择明文攻击 | Chosen-Plaintext Attack (CPA) | 可主动选择明文 $M$,并获得其密文 $Enc_k(M)$ | 攻击者控制加密 oracle(如在线服务) | | 选择密文攻击 | Chosen-Ciphertext Attack (CCA) | 可主动选择密文 $C$,并获得其解密结果 $Dec_k(C)$(除挑战密文外) | 攻击者控制解密 oracle(如错误消息泄露) | | 自适应选择密文攻击 | Adaptive CCA (CCA2) | 可在获得挑战密文前后,持续与解密 oracle 交互 | 最强大的现实攻击模型,模拟主动网络攻击 |
关键区分:在CCA中,解密 oracle 通常被禁止解密挑战密文本身,否则攻击者可 trivial 获胜。CCA2是衡量公钥加密和签名方案安全性的黄金标准。
1.4.2 安全目标:我们希望防御什么?
最核心的加密方案安全目标是语义安全(Semantic Security),其现代形式化为不可区分性(Indistinguishability):
- **IND-CPA 安全(选择明文攻击下的不可区分性)**:
攻击者进行如下实验: 1. 挑战者生成密钥对 $(pk, sk)$,将公钥 $pk$ 给攻击者。 2. 攻击者选择两个长度相等的明文 $M_0, M_1$,发送给挑战者。 3. 挑战者随机选 $b \in \{0,1\}$,计算挑战密文 $C^* = Enc_{pk}(M_b)$,发送给攻击者。 4. 攻击者输出猜测 $b'$。 方案是 IND-CPA 安全的,如果任何高效攻击者的优势 $|Pr[b'=b] - 1/2|$ 可忽略不计。
直观意义:攻击者无法从密文中判断出它对应的是 $M_0$ 还是 $M_1$。密文不泄露任何关于明文的有用信息。所有现代标准加密方案(如RSA-OAEP, ElGamal, 认证加密)都必须满足IND-CPA。
- **IND-CCA 安全(自适应选择密文攻击下的不可区分性)**:
实验类似,但攻击者在整个过程中(包括看到 $C^*$ 之后)都可以向解密 oracle 查询任意密文 $C \neq C^*$,并获得 $Dec_{sk}(C)$。 方案是 IND-CCA 安全的,如果攻击者优势可忽略。 重要性:许多仅满足IND-CPA的方案(如基础ElGamal)在CCA下会失败。例如,攻击者可通过修改 $C^*$ 并解密修改版本来获取关于 $M_b$ 的信息。实际部署的加密方案(如TLS中用于密钥交换的加密)必须是IND-CCA安全的。 RSA-OAEP在随机预言机模型下被证明是IND-CCA安全的。
1.4.3 其他重要安全定义
- **存在性不可伪造性(Existential Unforgeability)**:对于数字签名,要求攻击者(即使能进行选择消息攻击)**无法生成任何新的、有效的(消息,签名)对**。通常写作 **EUF-CMA**(在自适应选择消息攻击下存在性不可伪造)。这是签名方案的**最低要求**。
- **随机预言机模型(Random Oracle Model, ROM)**:一种将理想化的密码散列函数 $H$ 视为真正随机函数的证明模型。许多方案(如RSA-OAEP, PSS)在ROM下可证明安全。尽管ROM有争议(真实散列函数非真正随机),但此类证明仍是设计方案和发现潜在缺陷的**重要指南**。
- **标准模型(Standard Model)**:不依赖随机预言机,基于明确假设(如判定性Diffie-Hellman假设)的证明。更严格,也更困难。许多现代方案(如基于格的加密)追求标准模型证明。
1.4.4 安全证明的“游戏”范式
现代安全证明通常采用游戏跳转(Game Hop) 方法: 1. 定义真实游戏(Game 0):攻击者与真实方案交互,目标是猜对 $b$。 2. 通过一系列游戏(Game 1, Game 2, ...) 进行转换,每个转换都严格限制攻击者的优势(通常通过归约到一个公认的数学难题,如“计算Diffie-Hellman问题困难”)。 3. 最终游戏(Game N)中,攻击者的优势显然为0(例如,挑战密文是随机比特,与 $b$ 无关)。 4. 所有转换中优势损失的总和,即为攻击者在真实游戏中的总优势。如果每一步的优势损失都可忽略,且总损失可忽略,则方案安全。
示例(简化的RSA-OAEP IND-CCA证明思路):
- Game 0:真实RSA-OAEP加密。
- Game 1:将RSA函数(模幂运算)替换为一个**随机置换**。根据RSA问题的困难性,攻击者区分两者的优势可忽略。
- Game 2:修改OAEP的掩码生成函数(MGF),使其输出随机。根据散列函数(如SHA-256)的伪随机性,优势可忽略。
- Game 3:挑战密文的两个可能明文 $M_0, M_1$ 在加密前已被随机化,导致 $C^*$ 本身是均匀随机的,与 $b$ 无关。攻击者优势为0。
- **结论**:攻击者优势可归结为RSA问题困难性和散列函数伪随机性的优势之和,故可忽略。
1.5 统一标尺:为全书建立评估框架
本章定义的框架——历史脉络、核心目标、设计原则、攻击模型与安全证明——将作为评估本书后续所有算法的唯一标尺。
- 当我们介绍**AES**时,我们将分析其如何实现机密性、完整性(在GCM模式下),其设计如何遵循Kerckhoffs原则(公开、简单),并讨论其在已知明文、选择明文攻击下的安全性(实际上,AES作为块密码,其安全模式(如CTR, GCM)需单独分析)。
- 当我们介绍