第1章 密码学概述与基本概念
信息安全是数字时代的基石,而密码学正是构建这块基石的核心技术。从古代军事通信的保密需求,到当今互联网交易、隐私保护与区块链技术的信任基石,密码学始终在静默地守护着人类信息交换的机密与完整。本章将系统性地揭开密码学的面纱,阐述其核心目标、基本构成与分类框架,并通过一个跨越两千年的经典案例——凯撒密码——让您亲手触摸密码学的脉搏。最终,我们将审视攻击者的视角,理解安全防御必须建立在何种假设之上。这一切,都将为后续深入探讨现代密码算法、协议与前沿量子挑战奠定坚实的概念基础。
1.1 密码学:定义、范畴与核心目标
密码学(Cryptography)源于希腊语“*kryptós*”(隐藏)和“*gráphein*”(书写),字面意为“秘密书写”。现代密码学已远远超越“书写秘密”的古典范畴,它是一门综合性的科学,融合了数学、计算机科学、电子工程与语言学,旨在设计实现各种安全服务的计算方法和协议。其对立面是密码分析(Cryptanalysis),即研究如何破解密码系统、获取机密信息的艺术。两者统称为密码学(Cryptology)。
密码学的应用场景无处不在:当您通过 HTTPS 协议访问银行网站时,TLS/SSL 协议中的非对称加密与对称加密协同工作,确保了通信的机密性与服务器身份的真实性;当您使用比特币进行转账时,椭圆曲线数字签名算法(ECDSA)确保了交易发起者的身份不可否认性与交易数据的完整性;当您下载一个软件安装包时,其附带的 SHA-256 哈希值让您能验证文件在传输过程中是否被篡改。没有密码学,现代数字社会的基础设施将瞬间崩塌。
密码学技术旨在达成以下四个核心信息安全目标,这些目标相互关联,共同构成了安全需求的完整图景:
1. 机密性(Confidentiality):确保信息仅能被授权方访问,防止未授权方(包括窃听者、窃密者)理解信息内容。这是最传统、最广为人知的密码学目标。实现手段主要是加密(Encryption),将可读的明文(Plaintext)通过算法和密钥转换为不可读的密文(Ciphertext)。 2. 完整性(Integrity):确保信息在存储或传输过程中未被篡改、插入、删除或重放。无论篡改是出于恶意(如攻击者)还是意外(如传输错误),接收方都应能检测到。实现手段主要是消息认证码(MAC)或密码散列函数(Hash Function)。 3. 认证(Authentication):确保实体(人、设备、系统)的身份是真实的,以及消息来源是其所声称的发送者。这分为两类:实体认证(如登录系统时的密码、生物特征、数字证书)和数据源认证(确认消息确实来自声称的发送方,通常与完整性绑定)。 4. 不可否认性(Non-repudiation):防止通信中的一方事后否认其曾执行过的操作或发送过的消息。例如,在电子合同中,发送方不能否认其签署行为。这通常通过数字签名(Digital Signature)技术实现,它提供了比消息认证码更强的法律证据效力。
这四个目标并非孤立,实际系统常需同时满足多个目标。例如,一个安全的电子邮件系统需要加密(机密性)保护邮件内容,需要数字签名(完整性、认证、不可否认性)证明发件人身份并防止邮件被篡改。理解这些目标是评估任何密码方案有效性的根本出发点。
1.2 密码学基本术语与模型
要理解密码系统,必须掌握一组核心术语。我们首先描述一个典型的保密通信模型,如图 1-1 所示。
```mermaid graph LR A[明文 P] --> B[加密算法 E] B --> C[密钥 K] B --> D[密文 C] D --> E[解密算法 D] E --> F[密钥 K] E --> G[恢复的明文 P] style A fill:#e1f5fe style G fill:#e1f5fe style D fill:#fbe9e7 style C fill:#fbe9e7 ```
图 1-1:经典密码系统模型(对称加密场景)
- **明文(Plaintext)**:原始的可读信息,是加密过程的输入。例如,“攻击定于黎明时分”。
- **密文(Ciphertext)**:明文经过加密算法和密钥处理后的不可读输出。例如,“LXFOPVEFRNHR”。
- **加密算法(Encryption Algorithm)**:将明文和密钥作为输入,生成密文的计算过程或数学函数。通常用 $E$ 表示。现代密码算法是公开的,其安全性不依赖于算法的保密,而完全依赖于密钥的保密(Kerckhoffs 原理)。
- **解密算法(Decryption Algorithm)**:加密算法的逆过程,将密文和密钥作为输入,恢复出原始明文。通常用 $D$ 表示。满足 $D(K, E(K, P)) = P$。
- **密钥(Key)**:一串用于控制加密和解密过程的秘密信息。它是密码系统的安全核心。密钥空间(Key Space)指所有可能密钥的集合,其大小决定了暴力破解的难度。例如,一个 56 位的密钥(如早期 DES)空间大小为 $2^{56}$,而一个 256 位的密钥空间大小则是 $2^{256}$,后者在计算上不可行。
- **密码分析者(Cryptanalyst)/攻击者(Adversary)**:试图破译密文、获取密钥或伪造消息的实体。其攻击能力和目标构成了评估系统安全性的边界。
对称加密与非对称加密的根本区别在于密钥的使用:
- **对称加密(Symmetric-key Cryptography)**:加密和解密使用**相同**的密钥,或能由其中一个简单推导出另一个。通信双方必须共享这个秘密密钥。常见算法有 AES、ChaCha20、3DES。其优点是速度快、效率高,适合加密大量数据;缺点是密钥分发与管理困难($n$ 个用户需要 $n(n-1)/2$ 个密钥)。
- **非对称加密(Asymmetric-key Cryptography / Public-key Cryptography)**:使用一对 mathematically linked 的密钥:公钥(Public Key)和私钥(Private Key)。公钥可以公开分发,用于加密或验证签名;私钥必须严格保密,用于解密或生成签名。用公钥加密的信息只能用对应的私钥解密。常见算法有 RSA、ECC(椭圆曲线密码学)。其优点是解决了密钥分发问题,并天然支持数字签名;缺点是速度比对称加密慢几个数量级,通常不用于直接加密大量数据,而是用于加密对称密钥或生成签名。
密码散列函数(Cryptographic Hash Function) 是另一类基础原语,它不属于加密范畴。它接受任意长度的输入(消息),输出固定长度的、看似随机的字符串(哈希值/摘要)。其核心特性是:单向性(从哈希值反推原消息在计算上不可行)、抗碰撞性(找到两个不同输入产生相同输出在计算上不可行)和确定性(相同输入总有相同输出)。代表算法有 SHA-256、SHA-3。它主要用于验证完整性,而非保密。
1.3 历史镜鉴:凯撒密码与古典密码的兴衰
历史是理解技术演进的最佳课堂。凯撒密码(Caesar Cipher)作为古典密码的典范,其原理简单却意义深远,完美诠释了密码学的核心思想与局限。
案例:凯撒密码 据传,古罗马军事家凯撒在指挥战争时,为保护军事指令不被敌方截获,使用了一种简单的替换方法:将明文中的每个字母在字母表中向后(或向前)固定移动一个固定的位数(密钥)。例如,密钥为 3(后移 3 位):
- 明文:`ATTACK AT DAWN`
- 加密:字母 A->D, T->W, C->F... 得到密文 `DWWDFN DW GDZQ`
- 解密:密文字母前移 3 位即可恢复。
这种密码本质上是单表替换密码(Monoalphabetic Substitution Cipher)。其算法是公开的(字母表循环移位),密钥就是那个移位值(通常为 1-25)。对于当时不识字的普通士兵而言,密文如同天书。然而,其致命弱点在于字母频率统计。任何自然语言中,字母的使用频率并非均匀分布。例如,英语中字母 `E` 的频率最高(约 12.7%),其次是 `T`、`A`、`O` 等。攻击者只需截获足够长的密文(通常几百字符),统计各符号的出现频率,并与标准语言频率表对比,即可高概率猜出移位值,从而破解整个密文。这种攻击称为频率分析(Frequency Analysis),由阿拉伯学者阿尔·金迪(Al-Kindi)在公元 9 世纪左右系统阐述,这标志着密码分析作为一门学科的诞生。
凯撒密码的兴衰揭示了古典密码学的根本范式:安全性基于算法的保密(Security through Obscurity)。一旦算法本身被敌方获悉(这在长期对抗中几乎必然发生),系统便不堪一击。现代密码学彻底抛弃了这一范式,确立了 Kerckhoffs 原理(19世纪由荷兰密码学家提出):一个安全的密码系统,即使除密钥外的一切细节(包括算法)都公开,也应当保持安全。这迫使安全设计者将全部信任置于密钥的管理上,从而催生了基于数学难题(如大整数分解、离散对数)的公钥密码学革命。
1.4 攻击者视角:密码分析的基本攻击模型
设计密码系统必须假设攻击者具有何种能力。密码学通过定义不同的攻击模型(Attack Model),为安全证明设定边界。攻击者的能力通常从弱到强分为以下几类,了解它们是评估任何密码方案安全性的起点:
1. 唯密文攻击(Ciphertext-only Attack):攻击者仅拥有若干密文样本,试图从中推断出明文或密钥。这是攻击者能力最弱的模型。凯撒密码在足够长的密文下即被此攻击破解。现代强密码算法(如 AES-256)被设计为能抵御此类攻击,即使拥有天文数字般的密文,也无法获得关于明文或密钥的有效信息。 2. 已知明文攻击(Known-plaintext Attack):攻击者拥有一些密文及其对应的已知明文对(例如,知道某封加密邮件的开头固定格式),试图利用这些信息推导出密钥或解密其他密文。历史上,二战期间盟军利用已知的德国天气报告格式(“WETTER”开头)破译恩尼格玛密码的部分信息。 3. 选择明文攻击(Chosen-plaintext Attack):攻击者可以选择特定的明文,并获取其对应的密文(例如,通过向加密设备或服务发送请求)。这比已知明文攻击更强,因为攻击者可以“定制”最有利于分析的明文。现代对称加密算法(如 AES 在合适模式下)和非对称加密(如 RSA-OAEP)都被证明在标准模型下能抵御选择明文攻击。 4. 选择密文攻击(Chosen-ciphertext Attack):攻击者可以选择特定的密文,并获取其对应的解密结果(明文)。这是对解密功能的主动攻击,对公钥加密系统尤其危险(例如,攻击者可能利用解密 oracle 来逐步破解密文)。强大的公钥加密方案(如 RSA-PSS 用于签名,以及带认证加密的 KEM/DEM 结构)必须能抵御此类攻击,特别是自适应选择密文攻击(Adaptive CCA),即攻击者可以根据之前解密查询的结果动态选择新的密文。
安全定义:在给定攻击模型下,如果一个密码方案的优势(成功攻击的概率)对于任何“实际可行”(多项式时间)的攻击者都“可忽略不计”(小于 $1/2^{128}$ 或类似阈值),则称该方案在该模型下是安全的。这是现代密码学严谨安全证明的基础。
1.5 实践环节:体验凯撒密码的加密与解密
理论需结合实践方能内化。本节将引导您通过两种方式亲手体验凯撒密码,直观感受古典密码的工作方式与脆弱性。
方法一:使用在线工具 1. 在搜索引擎中查找“Caesar Cipher online tool”或“凯撒密码在线加密”。 2. 打开一个可信的网站(如 Cryptii, Boxentriq 等)。 3. 在“明文”框输入您想加密的文本(例如,“Hello, World!”)。 4. 设置“移位值/密钥”为 3。 5. 点击“加密”或“Encrypt”,观察密文输出(例如,“Khoor, Zruog!”)。 6. 保持密文不变,将工具模式切换为“解密”或“Decrypt”,密钥仍为 3,观察是否恢复原文。 7. 进阶尝试:不告诉朋友密钥,只给他密文“Khoor, Zruog!”。让他尝试手动猜测密钥(从 1 到 25 逐个尝试解密),很快便会发现当密钥为 3 时得到有意义的明文。这就是暴力破解。
方法二:使用 Python 代码实现 对于初学者,理解代码背后的逻辑是宝贵经验。以下是一个极简的 Python 实现,展示了核心算法思想。
```python def caesar_cipher(text, shift, mode='encrypt'): """ 凯撒密码实现。 :param text: 明文字符串或密文字符串 :param shift: 移位值(0-25),密钥 :param mode: 'encrypt' 或 'decrypt' :return: 处理后的字符串 """ result = []
根据模式决定移位方向:加密时后移,解密时前移(相当于负移位)
actual_shift = shift if mode == 'encrypt' else -shift
for char in text: if char.isalpha():
确定大小写基数
base = ord('A') if char.isupper() else ord('a')
核心算法:将字符转换为0-25的数字,加上移位,模26,再转回字符
shifted_char = chr((ord(char) - base + actual_shift) % 26 + base) result.append(shifted_char) else:
非字母字符(空格、标点)保持不变
result.append(char) return ''.join(result)
--- 实践示例 ---
plaintext = "Attack at dawn! Secret message." key = 5
加密
ciphertext = caesar_cipher(plaintext, key, 'encrypt') print(f"明文: {plaintext}") print(f"密钥 (移位): {key}") print(f"密文: {ciphertext}")
解密
decrypted = caesar_cipher(ciphertext, key, 'decrypt') print(f"解密后: {decrypted}")
暴力破解演示(假设攻击者只有密文)
print("\n--- 暴力破解尝试 ---") for possible_key in range(1, 26): attempt = caesar_cipher(ciphertext, possible_key, 'decrypt') print(f"密钥 {possible_key:2}: {attempt[:40]}...") # 只显示前40字符
攻击者会寻找有意义的英文单词,如 "Attack" 或 "Secret"
```
代码解读与思考: 1. 核心数学操作是 `(ord(char) - base + shift) % 26`。`ord()` 获取字符的 ASCII 码,减去 `'A'` 或 `'a'` 的 ASCII 码(65 或 97)将其映射到 0-25 范围。加上移位后,对 26 取模实现循环。最后加回 `base` 并转回字符。 2. 注意 `%`(取模)运算处理了“Z 后是 A”的循环特性。这是凯撒密码在数学上可视为模 26 加法群上的运算。 3. 为什么非字母字符不变? 古典密码通常只处理字母表,标点和空格保留以保持可读性,但这反而为频率分析提供了“锚点”(如空格是英语中最常见的“字符”)。 4. 暴力破解演示:循环 25 次(密钥 0 无意义)即可尝试所有可能。对于更复杂的多表替换(如维吉尼亚密码),暴力破解的复杂度会随密钥长度指数增长,但仍有更高效的攻击(如卡西斯基试验、重合指数法)。
通过这个简单实践,您应已直观理解:密钥空间极小(仅 25 种可能)、算法确定性、单表替换导致频率特征保留是凯撒密码被快速破解的根本原因。这为后续章节探讨如何构建具有巨大密钥空间、消除统计冗余、并依赖数学难题的现代密码系统埋下了伏笔。
1.6 小结与展望
本章作为全书的基石,系统定义了密码学的范畴、四大核心安全目标(机密性、完整性、认证、不可否认性),并厘清了明文、密文、密钥、加密/解密算法等基本术语。我们通过凯撒密码这一历史镜鉴,亲身体验了古典密码的运作与基于频率分析的脆弱性,深刻理解了 Kerckhoffs 原理——现代密码学安全必须建立在密钥保密而非算法保密之上——的划时代意义。最后,我们站在攻击者视角,了解了从弱到强的四种基本攻击模型,这是评估任何密码方案安全性的逻辑起点。
然而,凯撒密码的密钥空间(25)与对称加密 AES-256 的密钥空间($2^{256}$)之间,存在着天壤之别;单表替换的统计脆弱性与现代分组密码的混淆扩散机制之间,隔着 Claude Shannon 的信息论理论。下一章,我们将深入对称加密算法的核心,剖析分组密码的工作原理、核心模式(如 ECB、CBC、CTR)及其安全考量,并正式引入 Shannon 提出的混淆(Confusion)与扩散(Diffusion) 两大基本原则——这正是现代密码算法抵御频率分析等统计攻击的数学灵魂。从凯撒的简单移位,到 AES 的 S 盒与列混合,这是一场在数学与计算复杂性战场上持续了千年的攻防演进。
1.1 密码学:定义、范畴与核心目标(扩展)
密码学(Cryptography)作为信息安全的核心支柱,其定义随着计算技术的发展而不断深化。现代密码学已从传统的“秘密书写”演变为一门基于计算复杂性理论的严谨科学。其核心可定义为:密码学是研究如何设计密码系统(Cipher)以实现机密性、完整性、认证和不可否认性等安全目标的科学与技术。与之对应