什么是密码学?为什么它比你想象的更重要 / What is Cryptography and Why It Matters More Than You Think
什么是密码学?为什么它比你想象的更重要
What Is Cryptography, and Why It Matters More Than You Think
---
想象这样一个场景:你坐在一家咖啡馆里,笔记本电脑屏幕朝向自己,手指在键盘上飞速敲击。咖啡馆嘈杂、有 Wi-Fi、有电源插口,还有——坐在你身后三米处的另一位顾客。他的笔记本电脑屏幕和你一样亮着,但他正在运行的,并不是他自己的邮件客户端,而是一个名叫 Wireshark 的网络嗅探工具(network sniffer)。你与银行服务器之间明文传输(plaintext transmission)的所有 HTTP 数据包,正在他的屏幕上以十六进制(hexadecimal)的形式一行一行地滚动着,包括你的用户名、密码、转账金额和收款账户。
你可能从来没有意识到,这个场景每天都在全球的咖啡馆、机场、酒店、共享办公空间里真实发生。也可能更让你吃惊的是:上面这个场景,其实是一种"过去式"——因为在 2025 年的今天,绝大多数真正重要的网络流量,已经被某种形式的密码学(Cryptography)所保护。你之所以能在咖啡馆里安全地登录银行、聊天、转账,并不是因为没有人在偷听,而是因为即使有人在偷听,他也看不懂。
这就是我们这本书想要回答的第一个、也是最重要的问题:密码学,到底在保护什么?
答案并不是一句简单的"保护信息不被偷看"。它保护的是一组更微妙、也更根本的东西——信任(trust)。当你打开一个 HTTPS 网站时,你信任它真的是银行;当你用 WhatsApp 给朋友发消息时,你信任只有你朋友能读到;当你扫码支付 100 元时,你信任这笔钱只会被转走一次;当你刷手机 SIM 卡时,你信任运营商无法冒充你的身份。密码学,就是把这种"信任"从一句口号,变成一组可验证、可审计、可数学证明的协议(protocol)的科学。
而这本书要做的事,就是把这件事讲清楚。
---
1.1 从一次咖啡馆偷听说起:A Story from a Coffee Shop
让我们把故事讲得更完整一点,因为它会引出密码学几乎所有的核心概念。
场景设定。北京三里屯的一家连锁咖啡馆,下午三点。你点了一杯美式,掏出 MacBook,准备给客户转账 5 万元。你打开浏览器,输入银行的网址——但这次你没有注意到,网址栏写的是 `http://` 而不是 `https://`。这意味着你和银行之间所有的通信,都以明文(plaintext,即"未加密的原文")的形式在网络上传输。
敌手登场。坐在你身后三米的 Eve(这是密码学界对"敌人"的传统命名,我们后面会详细介绍),他运行着一款抓包工具。Eve 不需要破解任何东西,他只需要"看"。所有经过这条公共 Wi-Fi 的数据包,对 Eve 来说就像打开的明信片。
信息泄露。短短三分钟内,Eve 在自己的屏幕上看到了以下内容:
``` POST /transfer HTTP/1.1 Host: bank.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 87
username=alice&password=Alice2024!&from_account=6225**&to_account=6228**&amount=50000.00 ```
这些信息里包含了:你的用户名、密码、转出账户、转入账户、金额。如果 Eve 是一个有经验的攻击者,他甚至可以直接用这些凭据(credentials)重新登录你的银行账户。
故事的转折。这时候,如果我们做一个简单的修改——把 `http://` 换成 `https://`,那么在传输之前,浏览器和银行服务器之间会先建立一个加密通道(encrypted channel)。这条通道会基于一种叫 TLS(Transport Layer Security,传输层安全协议) 的协议,使用一组名为 AES(Advanced Encryption Standard,高级加密标准) 和 RSA(Rivest–Shamir–Adleman,一种公钥密码算法) 的算法,把上面那段明文变成一段看起来像下面这样的东西:
``` POST /transfer HTTP/1.1 Host: bank.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 256
7f3a9c2e8b1d4f6a0c5e7d2b8a9f1c3e...(约 256 字节的密文) ```
Eve 依然能看到数据包经过他的网卡,依然能抓包,但屏幕上只会出现一堆密文(ciphertext)——看上去是随机的乱码,没有密钥就无法还原成有意义的信息。
故事的启示。同样的网络、同样的敌手、同样的数据包,唯一的差别是"是否使用了密码学"。结果却天差地别:一个让你倾家荡产,一个让你毫发无损。
这就是为什么我们要写这本书:密码学不是一种"高深莫测的黑科技",它是数字时代的下水道和电力系统——平时你完全感受不到它的存在,但一旦它消失,整个现代文明会在几天内崩溃。
为了让你直观感受到这一点,我们可以做一个思想实验(thought experiment):
> 假设全世界所有的密码学在一夜之间失效——所有 HTTPS 失效,所有银行 SSL 失效,所有 WhatsApp/Signal/Telegram 加密失效,所有 5G SIM 卡的认证失效,所有比特币和以太坊的签名失效。 > > 48 小时内会发生什么? > > - 银行系统:所有网银账户可以被任何抓到你的网络流量的人登录。ATM 跨行转账因为没有签名保护可以任意伪造。央行被迫关闭电子支付系统。 > - 移动通信:所有 4G/5G 基站失去对 SIM 卡的认证,任何人都可以冒充他人号码打电话、收短信——包括接收银行验证码。 > - 社交软件:你和你朋友的每一条私聊都会被公开。商业机密、隐私照片、医疗记录全部裸奔。 > - 加密货币:比特币的椭圆曲线签名失效,意味着任何人都可以伪造转账,"中本聪"账户里的 100 万个比特币会被瞬间清空。 > - 物联网:智能门锁、智能汽车、远程手术设备全部失去认证,黑客可以让你的车在高速公路上熄火。 > - 云服务:AWS、Azure、Google Cloud 上存储的所有企业数据可以被任何中间人读到。
这不是科幻,这是没有密码学的世界本来应该有的样子。我们之所以觉得今天的世界"还可以",仅仅是因为密码学在背后默默地工作着。
而当密码学出错的时候——比如 2014 年的 Heartbleed 漏洞(OpenSSL 的一个缓冲区溢出错误,导致攻击者可以从服务器内存中读取 64KB 的随机数据,其中可能包含私钥、密码、会话令牌等敏感信息)、2017 年的 WannaCry 勒索病毒(利用 Windows SMB 协议的漏洞,结合 NSA 泄露的 EternalBlue 工具加密用户文件)、2018 年的 TLS 1.3 之前各种 POODLE、ROBOT、KRACK 漏洞——我们就会立刻看到它的"缺失"会引发怎样的灾难。
这就是第一个值得你记住的认知:密码学不是给黑客用的工具,它是给普通用户用的护盾。在这本书里,我们要做的,就是把这面护盾拆开,看看它里面到底是什么。
---
1.2 密码学 ≠ 密码 ≠ 编码 ≠ 隐写术:四个易混概念的清晰区分
在我们深入之前,必须先解决一个"名词打架"的问题:很多人会把密码学(Cryptography)、密码(Password)、编码(Coding / Encoding)、隐写术(Steganography)混为一谈。在中文语境下尤其混乱,因为"密码"这个词被同时用来翻译 cryptography、password、cipher、code 这四个完全不同的概念。
让我们用四个具体例子把这四个概念彻底分开。
1.2.1 密码(Password):你脑子里的那串字符
定义。密码是一种身份验证凭据(authentication credential),它本身不是科学,它是一个秘密字符串,用来证明"你是你声称的那个人"。
例子。当你登录邮箱时输入的 `MyDog2020!`,这就是一个密码。它的特征是:
- 长度有限(通常 8-20 个字符)
- 由用户记忆或保存在密码管理器里
- 用来"证明你是账号的拥有者"
- 一旦泄露,需要立即更换
密码学是否关心密码? 关心,但只关心"密码在网络上传输时如何不被偷看"以及"服务器如何安全地存储密码(哈希 + 加盐,hash + salt)"这两件事。密码本身不是密码学的研究对象,密码学保护的是密码的"流动过程"。
1.2.2 编码(Encoding):让数据换一种"语言"说话
定义。编码是把信息从一种表示形式转换为另一种表示形式的过程,其目的不是保密,而是让数据能够在特定媒介上传输、存储或处理。
最常见的编码:
- **ASCII / UTF-8**:把字符映射为字节。例如 `A` → `01000001`,`中` → `11100100 10111000 10101101`。
- **Base64**:把二进制数据编码为可打印的 ASCII 字符。例如一段二进制 `0xDEADBEEF` 编码后变成 `3q2+7w==`。Base64 经常出现在电子邮件附件、JSON Web Token(JWT)、URL 参数中。
- **URL Encoding**:把空格、中文等 URL 不允许的字符编码为 `%20`、`%E4%B8%AD`。
- **Morse Code(摩斯电码)**:用点和划表示字母,是一种为电报设计的编码。
- **二维码(QR Code)**:把字符串编码为黑白像素矩阵。
关键特征:编码是可逆的、无密钥的、公开的。任何人都可以把 Base64 还原成二进制,不需要任何秘密。编码和密码学无关。
一个简单的判断标准:如果一个"看起来像加密"的算法可以公开还原,那么它就是编码,不是加密。Base64 不是加密,URL Encoding 不是加密,Morse Code 也不是加密。
1.2.3 加密(Encryption):让数据变成"看不懂"的样子
定义。加密是把明文(plaintext,可读的信息)通过加密算法(encryption algorithm)和密钥(key)转换为密文(ciphertext,看起来是随机乱码)的过程。没有正确的密钥,无法还原。
例子。AES 加密: ``` 明文:Hello, World! 密钥:0123456789abcdef 密文:a1b2c3d4e5f67890abcdef1234567890 ``` 即使你知道使用的是 AES 算法,没有密钥也无法把密文还原成 `Hello, World!`。这就是加密和编码的本质区别。
1.2.4 隐写术(Steganography):把秘密藏起来
定义。隐写术是把秘密信息隐藏在另一个看起来无害的载体(cover)中,使得"存在秘密"这件事本身都不可见。
例子。把一段机密文本嵌入到一张猫咪照片的像素最低有效位(Least Significant Bit, LSB)中。照片看起来和原图没有任何视觉差别,但用专门的工具可以提取出隐藏的消息。
密码学 vs 隐写术:
- 密码学:**保护内容的机密性**——敌手知道有秘密,但他看不懂。
- 隐写术:**保护存在性**——敌手甚至不知道有秘密存在。
两者经常结合使用:先用加密让秘密看不懂,再用隐写术把它藏起来,这样即使敌手怀疑有秘密,也找不到在哪里。
1.2.5 一张表总结四个概念
| 概念 | 英文 | 目的 | 是否需要密钥 | 是否可逆 | 与密码学关系 | |---|---|---|---|---|---| | 密码 | Password | 身份验证 | 不需要(秘密本身) | 否(单向验证) | 密码学保护密码的传输 | | 编码 | Encoding | 表示转换 | 不需要 | 是(公开) | 无 | | 加密 | Encryption | 机密性 | 需要 | 是(需密钥) | 核心 | | 隐写术 | Steganography | 隐藏存在 | 通常需要 | 是(需密钥) | 互补 |
记忆口诀:密码是钥匙,编码是翻译,加密是锁箱子,隐写术是把箱子藏进墙里。这本书里我们要拆开研究的,就是那只"锁箱子"——也就是加密,以及围绕它建立的整套密码学体系。
---
1.3 现代生活的五大场景:密码学如何保护每一次点击
光讲定义太抽象,让我们走进日常生活,看看密码学在你过去 24 小时里"救了你几次"。
场景一:网上银行——你的钱是怎么不被偷的
早上 9 点,你打开手机银行 APP,输入密码,准备给房东转账 8000 元。
这背后发生了哪些密码学操作?
1. APP 与银行服务器建立 TLS 连接。这一步使用一种叫 TLS 握手(TLS Handshake) 的协议。它通过非对称加密(asymmetric encryption,使用一对密钥:公钥 public key 和私钥 private key)协商出一个会话密钥(session key),之后所有数据传输都使用这个会话密钥做对称加密(symmetric encryption,加密和解密使用同一个密钥,速度快)。 2. 服务器证书验证。你的 APP 会验证银行的数字证书(digital certificate),这个证书由一个叫 CA(Certificate Authority,证书颁发机构) 的可信第三方签发。证书证明"你连接的服务器真的是 bank.example.com,而不是某个冒名顶替的钓鱼网站"。这一步使用 数字签名(digital signature,一种用私钥签、公钥验的机制)。 3. 你的密码安全传输。你的登录密码在 TLS 通道里以密文形式传给银行,Eve 抓包也只能看到乱码。 4. 服务器端密码存储。银行不会以明文形式存储你的密码,而是存储密码的哈希值(hash,一种单向函数,给定输入可以算出固定长度的输出,但无法从输出反推输入)+ 一个随机盐值(salt)。即使银行数据库被黑客拖走,黑客拿到的也不是你的密码,而是哈希值——而哈希值无法被"反推"。 5. 交易签名。当你按下"确认转账"时,银行系统会对这笔交易生成一个数字签名,这样事后审计可以证明"这笔交易确实是你发起的,没有被篡改"。这一步通常使用 HMAC(Hash-based Message Authentication Code,基于哈希的消息认证码) 或 ECDSA(Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法)。
没有密码学的后果:Eve 可以伪造任何交易,钓鱼网站可以冒充银行,你账户里的钱随时可能被清空。
场景二:WhatsApp 对话——你和朋友的悄悄话是怎么保密的
早上 10 点,你给同事发了一条 WhatsApp:"老板给的方案我觉得有问题,我们中午讨论下对策。"
WhatsApp 的端到端加密(End-to-End Encryption, E2EE) 工作原理:
1. 每个用户有一对密钥。当你注册 WhatsApp 时,你的手机会生成一对密钥:公钥上传到 WhatsApp 服务器,私钥永远不离开你的手机。 2. 每个会话生成对称密钥。当你和朋友开始聊天时,WhatsApp 使用一种叫 X3DH(Extended Triple Diffie-Hellman,扩展三次迪菲-赫尔曼密钥交换) 的协议协商出一个共享的对称密钥。这个密钥只有你和你朋友的手机知道,WhatsApp 服务器不知道。 3. 消息用对称密钥加密。每条消息使用这个共享密钥加密,使用的算法叫 Double Ratchet Algorithm(双棘轮算法)——这个算法的精妙之处在于,它会让密钥随着每条消息的发送而"演化",所以即使某一条消息的密钥被破解,攻击者也无法解密其他消息。这叫前向保密(Forward Secrecy)和后向保密(Post-Compromise Security)。 4. 服务器只转发密文。WhatsApp 的服务器在你和朋友之间只起到"路由器"的作用,它看到的只是加密后的乱码,即使被法院传票要求交出数据,它也只能交出密文。
没有密码学的后果:你和同事的对话对 ISP(Internet Service Provider,互联网服务提供商)、WhatsApp 公司、黑客、政府全部透明——"老板给的方案有问题"这种话变成公开信息。
场景三:比特币转账——你的"数字黄金"是怎么不被双花的
中午 12 点,你在 Coinbase 上把 0.1 个比特币转给朋友。
比特币背后的密码学非常精妙:
1. 地址生成。你的比特币地址(比如 `bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh`)是由你的公钥经过 SHA-256 和 RIPEMD-160 两次哈希运算,再加上一个校验和(checksum)生成的。地址本身是公钥的"指纹",但反过来从地址推不出公钥(除非你花钱)。 2. 交易签名。当你发起转账时,你的钱包软件会使用你的私钥对交易内容做一次 ECDSA 签名。这个签名有两个特点:
- 只有持有私钥的人才能生成。
- 任何人都可以用你的公钥验证签名的真伪。
3. 广播到全网。签名后的交易被广播到比特币网络的 1 万多个节点(node)。每个节点独立验证签名,确认"这笔转账确实是由地址 `bc1q...` 的所有者发起的"。 4. 打包进区块。矿工(miner)把交易打包进区块,区块之间通过 Merkle Tree(默克尔树) 这种数据结构高效地组织交易哈希。 5. **工作量证明(Proof of Work,