什么是密码学?——守护秘密的古老艺术
第 1 章:什么是密码学?——守护秘密的古老艺术
当秘密开始说话
你有没有过这样的经历:小时候和好朋友发明了一套只有你们能懂的"暗号",比如用"苹果"代表"下课一起去买冰棍",用"大树"代表"老师来了赶紧收漫画"。你们在课堂上小心翼翼地传递这些词语,心跳加速,生怕被别人发现。这种心跳的感觉——保护信息不被他人知晓的渴望——正是密码学最原始的起点。
密码学(cryptography)并不是计算机时代的产物,也不是互联网出现后才诞生的"高科技"。它的历史几乎和人类文明一样悠久。当一个人第一次试图对另一个人隐瞒某个信息时,密码学的种子就已经埋下了。
那么,密码学究竟是什么?用一个最简单的定义来说:密码学是研究如何安全传递信息的学科。这里的"安全"包含多重含义——它不仅指信息不被偷看,还包括信息不被篡改,以及确认信息确实来自声称的发送者。这三个维度——保密性、完整性和认证——构成了现代密码学的三大支柱。
理解这三个目标并不困难。让我们从几个身边的例子开始,一步步揭开密码学的面纱。
1.1 密码学就在你身边
许多人对"密码学"这个词望而生畏,觉得它是数学家、黑客和间谍的专属领域。但事实上,密码学的思想早就渗透在日常生活的方方面面,只是我们常常没有意识到罢了。
藏头诗:古老的文字游戏
唐朝诗人白居易有一首诗写道:"花非花,雾非雾,夜半来,天明去。来如春梦几多时?去似朝云无觅处。"表面上看,这是一首朦胧优美的抒情诗,但有人指出它可能暗藏玄机——每句诗的第一个字连起来读,暗示了某种信息。这就是藏头诗(acrostic),一种最原始的"加密"手法。
藏头诗的原理很简单:信息的发送者(加密者)将真正的消息隐藏在看似普通的内容之中,只有知道"解密的钥匙"——也就是知道要关注每个句子的第一个字——的接收者,才能还原出隐藏的信息。这个"钥匙"就是后来我们要详细介绍的密钥(key)的雏形。
当然,藏头诗的安全性极低——它只能骗过完全不知情的人,稍有经验的观察者很快就能发现其中的规律。但这恰恰说明了一个重要的密码学原理:任何加密方法的安全程度,取决于攻击者获取信息的难度和破解所需的计算成本。藏头诗容易破解,是因为它没有引入足够的"计算复杂性"。
纸条暗号:对称密钥的原型
再来看看更"接地气"的例子。假设你和同桌小明约定:以后传纸条时,把每个汉字都往后偏移两个位置——比如"我"写成"找","们"写成"怕"。小明收到纸条后,按照同样的规则逆向还原,就读懂了你写的"我们"。
这就是一个完整的信息传递流程:明文(plaintext)→ 加密(encryption)→ 密文(ciphertext)→ 解密(decryption)→ 明文。你和同伴共享同一个"偏移规则"(往前偏移两个位置),这就是对称密钥(symmetric key)的最简单形态——加密和解密使用相同的密钥。
这个例子虽然幼稚,但它触及了密码学最核心的一个问题:密钥的分配。你和同伴必须事先碰面、当面约定这个偏移量,否则就无法通信。而一旦你们分开了——比如放学后你想给家里打电话时——就没办法安全地传递这个密钥了。这个"密钥分配困境"(key distribution problem)困扰了密码学家几千年,直到20世纪70年代非对称密码体系的出现才得到实质性解决。
游戏中的密码思维
仔细回想一下,很多游戏里都内置了密码学思想。《宝可梦》里用密码兑换游戏道具,《逆转裁判》中用"取出证物"来验证某个陈述的真伪(完整性验证),甚至《塞尔达传说》里打开某个洞穴需要念出特定咒语(口令认证,password authentication)。
这些游戏并非刻意教授密码学知识,但它们的开发者——无论是意识到还是没有——都借用了密码学的基本逻辑:设定一个只有特定人知道的"验证条件",通过验证即赋予相应权限。这正是现代身份认证系统(authentication system)的游戏化呈现。
Beyond entertainment, cryptography quietly powers the digital infrastructure we rely on every day. Every time you see a padlock icon in your browser's address bar, that's cryptography at work. When you unlock your phone with a fingerprint or face, cryptographic protocols verify that you are who you claim to be. The HTTPS in a website address means that all data exchanged between your device and the server is encrypted. Online banking, messaging apps, digital signatures on contracts, and even the chip in your credit card—none of these would be secure without cryptography.
超越娱乐领域,密码学悄无声息地为我们的数字生活提供了基础设施。 每次你在浏览器地址栏看到锁形图标时,密码学正在发挥作用。当你用指纹或面部识别解锁手机时,密码学协议正在验证你就是你声称的那个人。网站地址中的 HTTPS 意味着你的设备和服务器之间的所有数据都经过了加密处理。网上银行、即时通讯应用、合同上的数字签名,甚至信用卡芯片——离开了密码学,所有这些都将毫无安全保障。
从这些身边的例子中,我们可以提炼出密码学的几个核心特征:它是一种信息转换技术(明文变密文);它依赖于某种可共享但需保密的规则(密钥);它的目标是让信息在传输过程中不被未授权方理解或篡改。这三个特征,将贯穿我们整本书的讨论。
1.2 密码学的三大目标:保密性、完整性与认证
如果说上一节告诉我们密码学"存在于哪里",那么这一节要回答的是它"究竟在保护什么"。当你使用一个加密通讯应用时,你可能只是觉得"别人看不到我的消息"——但这个看似简单的愿望背后,实际上包含着三层不同性质的保护需求。
保密性:只有对的人才能读懂
保密性(confidentiality)是最直观的目标:确保信息只被授权的人看到。未经授权的旁观者即便截获了信息,看到的也只是一堆无意义的乱码。
实现保密性的基本思路是将明文转换成密文。这个转换过程依赖一个函数,我们不妨称之为加密函数。形式上可以这样描述:
$$C = E_K(P)$$
其中 $P$ 是明文(plaintext),$K$ 是密钥(key),$E$ 是加密函数(encryption function),$C$ 是密文(ciphertext)。解密的过程则是:
$$P = D_K(C)$$
其中 $D$ 是解密函数(decryption function)。注意,这里加密和解密都使用了同一个密钥 $K$,这正是对称密码的特征。
需要特别强调的是,在现代密码学中,密钥是保密性的核心,而不是加密算法本身。一个好的加密算法应该是公开的——它的原理可以被任何人研究、分析和攻击。真正需要保密的只有密钥。这被称为科克霍夫斯原则(Kerckhoffs's Principle),由19世纪的荷兰密码学家奥古斯特·柯克霍夫斯(Auguste Kerckhoffs)提出,至今仍是密码学设计的基石。
> 柯克霍夫斯原则:即使密码系统的所有细节都被敌人知晓,只要密钥保持安全,系统就应该仍然是安全的。 > > *Kerckhoffs's Principle: A cryptosystem should be secure even if everything about the system, except the key, is public knowledge.*
这可能听起来违反直觉——为什么要把算法公开?原因很实际:保密的算法意味着没有人能独立验证它的安全性。而开放的算法经过全球数学家和安全专家的反复审视,如果多年后仍未被攻破,它的安全性就更加可信。AES(高级加密标准)、RSA 等现代加密算法都是按照这一原则设计的。
完整性:信息在传递途中没有被动手脚
保密性解决的是"不被看见"的问题,但还有另一个同样重要的问题:信息在传输过程中有没有被人偷偷修改过?
举个例子:你给妈妈发了一条消息:"妈妈,给我转2000块钱,账号是123456。"但如果有人在网络中截获了这条消息,把它改成"妈妈,给我转20000块钱,账号是123456"再发出去——消息仍然是加密的(保密性没问题),但内容被篡改了!这就是完整性(integrity)被破坏的情况。
完整性保证的是:接收方能够检测到信息是否在传输过程中被篡改。这不仅仅是一个技术问题,在法律合同、金融交易、医疗记录等场景中,完整性验证甚至比保密性更为关键。
那么,如何验证完整性呢?一个常见的方法是使用哈希函数(hash function)。哈希函数可以将任意长度的输入转换成固定长度的"指纹"——称为哈希值(hash value)或摘要(digest)。如果原文被修改了哪怕一个字符,重新计算的哈希值就会完全不同。
$$h = H(P)$$
接收方收到消息后,对照发送方提供的哈希值,重新计算一遍哈希值,如果两者一致,就说明信息在传输途中没有被篡改。这个过程不需要加密信息本身——哈希值可以随消息一起发送,因为它不包含原始信息的内容。攻击者看到哈希值也无法反推出原始消息(至少在理论上)。
一个好的哈希函数必须具备三个特性:单向性(无法从哈希值反推原始输入)、抗碰撞性(极难找到两个不同的输入产生相同的哈希值)和雪崩效应(输入的微小变化会导致输出的剧烈变化)。MD5、SHA-1、SHA-256 等都是常见的哈希函数。
认证:确认对方真的就是那个人
第三个目标是认证(authentication):确认通信对象的身份,防止有人假冒。
想象一个场景:你收到一封来自"银行"的邮件,要求你点击链接重置密码。如果你点击了,可能就会落入钓鱼陷阱。但密码学中的认证机制能帮助我们确认:这条消息真的是从声称的发送方发出的吗?
认证通常依赖于以下几种"证据":
- **你知道的东西**(something you know):密码、PIN码。
- **你拥有的东西**(something you have):手机、硬件令牌、智能卡。
- **你本身就是什么**(something you are):指纹、虹膜、面部特征。
在数字世界中,数字签名(digital signature)是实现认证的核心技术。发送方使用自己的私钥对消息生成一个"签名",任何拥有对应公钥的人都可以验证这个签名是否有效——就像用手写签名来证明文件的来源一样。数字签名不仅认证了发送方的身份,还同时保证了消息的完整性(因为签名内容通常包含消息的哈希值)。
值得区分的是消息认证(message authentication)和实体认证(entity authentication):前者验证某条具体消息是否来自声称的发送者,后者验证某个实体(比如一个正在登录的用户)在当前时刻是否真的就是其所声称的身份。许多应用需要同时实现这两种认证。
三者的协同关系
有趣的是,保密性、完整性和认证这三个目标并非独立存在,而是相互依存、相互支撑的。一个完善的安全系统需要同时考虑这三个维度。
例如,在一次安全的网络通讯中:你希望消息只被对方看到(保密性),你希望对方收到的消息确实是你发的而不是被人篡改过的(完整性),你也希望对方能确信消息确实来自你而不是某个假冒者(认证)。现代密码协议如 TLS(传输层安全协议)就是同时实现这三个目标的典型例子——它为网页浏览提供了加密通道(HTTPS 中的 S),确保数据完整性和双向认证。
下面这张图展示了密码学的三大目标及其相互关系:
```mermaid graph TD A[密码学核心目标] --> B[保密性<br/>Confidentiality] A --> C[完整性<br/>Integrity] A --> D[认证<br/>Authentication]
B --> E["只有授权方能读取信息<br/>明文 → 密文"] C --> F["检测信息是否被篡改<br/>哈希函数/消息认证码"] D --> G["确认通信方身份<br/>数字签名/认证协议"]
H[通信场景] --> I[Alice 发送消息给 Bob] I --> B I --> C I --> D
J[潜在威胁] --> K["Eve: 窃听者<br/>窃取信息"] J --> L["Mallory: 篡改者<br/>修改信息"] J --> M["Oscar: 假冒者<br/>伪造身份"] ```
> 图注:密码学三大目标与通信场景的关系。在信息传递过程中,攻击者可能扮演不同角色——窃听者、篡改者或假冒者——密码学通过不同的技术手段分别应对这些威胁。
1.3 密码学舞台上的经典角色
密码学界有三个家喻户晓的"演员",它们的出场频率如此之高,以至于任何一本密码学教材都会首先介绍它们——它们就是 Alice、Bob 和 Eve。
Alice 和 Bob:永恒的通信者
Alice(通常缩写为 A)和 Bob(通常缩写为 B)是密码学文献中最常见的两个角色,代表一次通信的发送方和接收方。Alice 想要给 Bob 发送一条消息,而这个通信过程需要某种形式的安全保护。
这两个名字最早出现在1978年的一篇学术论文中——那篇论文首次提出了 RSA 加密算法(我们将在后面的章节详细介绍)。论文的作者们需要用例子来说明加密和解密的过程,于是用 "Alice" 和 "Bob" 替代了枯燥的 "A 方" 和 "B 方"。这个命名方式既简洁又具有普适性,很快就成为了整个密码学领域的标准约定。
为什么选择 Alice 和 Bob?一方面,这两个名字的首字母 A 和 B 自然对应了通信的双方;另一方面,它们的发音友好,在描述多轮对话时听起来自然流畅。随着密码学的发展,这两个角色也被赋予了越来越丰富的"性格"——在许多教材和科普中,Alice 和 Bob 被描绘成需要安全通信的好朋友,或者在电子商务中进行交易的用户和商家。
在本书中,Alice 和 Bob 将作为我们最重要的"演员"贯穿始终。他们之间的每一次对话、每一次加密通讯的尝试,都将帮助我们理解不同的密码学概念和协议。
Eve:袖手旁观的窃听者
Eve(Eavesdropper 的首字母)代表的是一个被动攻击者(passive adversary)。她的特点是:她可以窃听 Alice 和 Bob 之间的通信,尝试从截获的密文中恢复明文,但她不会主动篡改或伪造消息。
将 Eve 描绘成一个"窃听者"是非常形象的。她就像站在墙角偷听别人说话的人——她能听到内容,但不会介入对话本身。在实际的密码学威胁模型中,Eve 代表的是窃听攻击(eavesdropping attack),这是最基本的信息安全威胁之一。
然而,Eve 的"被动"身份并不意味着她不值得防备。事实上,在很多通信场景中,防止窃听恰恰是首要的安全需求。当你用手机给朋友发消息时,你最担心的可能就是消息被某个不知名的人看到——那个"不知名的人"就是 Eve。
Mallory 和 Oscar:更危险的对手
除了 Eve,密码学中还有一些其他的"角色":
Mallory(恶意攻击者,Malicious 的首字母)是一个主动攻击者(active adversary)。与被动的 Eve 不同,Mallory 不仅能窃听通信内容,还能拦截、修改、甚至伪造消息。她代表了更为危险的网络攻击形式,比如中间人攻击(Man-in-the-Middle Attack,MITM)—— Mallory 位于 Alice 和 Bob 的通信路径中间,分别与双方建立连接,使得 Alice 以为她在和 Bob 通信,Bob 以为他在和 Alice 通信,而实际上双方都在和 Mallory 通信。
Oscar(对手,Opponent 的首字母)通常代表一个试图破解密码系统的敌手,有时也与 Mallory 的角色重叠。
这些角色的设定看似游戏化,实际上反映了一个严肃的威胁模型(threat model)构建过程。在设计任何安全系统之前,密码学家必须首先明确:系统需要抵御什么样的攻击者?攻击者的能力边界在哪里?只有明确了这些前提,才能设计出有针对性的防御方案。
Alice-Bob-Eve 通信模型
为了更清晰地展示这个场景,我们用序列图来描绘一个基本的加密通信过程:
```mermaid sequenceDiagram participant A as Alice participant E as Eve (窃听者) participant B as Bob
A->>A: 撰写明文消息 P A->>A: 使用密钥 K 加密: C = E_K(P) A->>B: 发送密文 C
Note over E: Eve 拦截到密文 C<br/>但无法解密(没有密钥)
B->>B: 收到密文 C B->>B: 使用密钥 K 解密: P = D_K(C) B->>B: 读取明文消息 P
Note over A,B: 共享密钥 K 已事先安全分发 ```
> 图注:Alice-Bob-Eve 基本通信模型。Alice 使用与 Bob 共享的密钥对消息加密并发送。Eve 可以截获密文,但由于没有密钥,无法得知消息内容。
这个模型揭示了密码学通信的一个基本范式:发送方使用密钥将明文转换为密文,接收方使用同样的密钥将密文还原为明文,而攻击者即使截获了密文也无法获知内容。然而,这个模型也留下了一个关键问题:如果 Alice 和 Bob 此前从未见过面,他们该如何安全地共享这个密钥?这就是密码学中最核心的"密钥分发问题"——我们将在后续章节中看到现代密码学是如何巧妙地解决这个难题的。