引言

密码学是人类历史上最古老也最迷人的学科之一。从古罗马的军事密文,到现代的 TLS 加密,再到未来的量子密钥分发,密码学一直是我们保护秘密的最后一道防线。

密码

古典密码时代

凯撒密码

凯撒密码是最早的替换式密码之一,由古罗马的凯撒大帝用于军事通信。

| 明文 | A | B | C | D | … | X | Y | Z |
|——|—|—|—|—|—–|—|—|—|—|
| 密文 | D | E | F | G | … | A | B | C |

原理很简单:将字母表中每个字母向后偏移 3 位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def caesar_encrypt(text: str, shift: int = 3) -> str:
"""凯撒密码加密"""
result = ""
for char in text.upper():
if char.isalpha():
shifted = (ord(char) - ord('A') + shift) % 26
result += chr(shifted + ord('A'))
else:
result += char
return result


def caesar_decrypt(text: str, shift: int = 3) -> str:
"""凯撒密码解密"""
return caesar_encrypt(text, -shift)


# 示例
encrypted = caesar_encrypt("ATTACK AT DAWN")
print(f"密文: {encrypted}") # DWWDFN DW GDZQ
print(f"解密: {caesar_decrypt(encrypted)}") # ATTACK AT DAWN

凯撒密码的密钥空间只有 25(偏移 1-25 位),暴力破解秒秒钟完成。

维吉尼亚密码

维吉尼亚密码使用一个关键词来动态改变每个字母的偏移量,大大增加了破解难度。

1
2
3
4
5
6
明文: A T T A C K A T D A W N
密钥: K E Y K E Y K E Y K E Y
密文: K X R K G I K X C K A L

破解难度 = 26^(密钥长度)
密钥长度为 10 → 26^10 ≈ 141 万亿种可能

维吉尼亚密码在长达 300 年的时间里被认为是「不可破解的密码」。

Enigma 密码机

二战时期,德国使用的 Enigma 密码机是一个机电式转子密码设备。它每天更换转子配置和接线板设置,密钥空间达到 10²³ 的量级。

图灵等人在布莱切利庄园的工作,是对 Enigma 密码的成功破解,据估计将二战缩短了 2-4 年。

现代密码学

柯克霍夫原则

1
2
3
4
5
一个密码系统的安全性不应该依赖于算法的保密性,
而应该只依赖于密钥的保密性。

换言之:即使敌人知道你的全部加密算法,
只要他不知道密钥,密文就应该无法破解。

对称加密

发信方和收信方使用同一个密钥

AES (高级加密标准) 是目前最广泛使用的对称加密算法:

参数 AES-128 AES-256
密钥长度 128 bit 256 bit
轮数 10 14
暴力破解 目前不可行 量子计算机亦难破解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from cryptography.fernet import Fernet

# 生成密钥
key = Fernet.generate_key()
cipher = Fernet(key)

# 加密
message = b"Secret message"
encrypted = cipher.encrypt(message)
print(f"加密后: {encrypted}")

# 解密
decrypted = cipher.decrypt(encrypted)
print(f"解密后: {decrypted.decode()}")

非对称加密

发信方使用公钥加密,收信方使用私钥解密。

RSA 是最著名的非对称加密算法,其安全性基于大数分解的困难性:

1
2
3
4
5
6
7
8
9
10
11
12
13
RSA 核心数学原理:

1. 选择两个大质数 p 和 q
2. n = p × q
3. φ(n) = (p-1)(q-1)
4. 选择 e,使 1 < e < φ(n) 且 gcd(e, φ(n)) = 1
5. 计算 d = e^(-1) mod φ(n)

公钥: (n, e)
私钥: (n, d)

加密: c = m^e mod n
解密: m = c^d mod n

椭圆曲线加密 (ECC) 提供了与 RSA 同等的安全性,但密钥长度更短。256 位的 ECC 密钥约等于 3072 位的 RSA 密钥的安全强度。

算法 密钥长度 等效安全强度 性能
RSA 2048 bit 112 bit
ECC 256 bit 128 bit
RSA 4096 bit 140 bit 很慢

哈希函数

哈希函数将任意长度的输入映射为固定长度的输出,且具有单向性。

SHA 家族

1
2
3
4
5
6
7
8
9
10
11
12
import hashlib

message = "Hello, World!"

# SHA-256
sha256_hash = hashlib.sha256(message.encode()).hexdigest()
print(f"SHA-256: {sha256_hash}")
# dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f

# SHA-512
sha512_hash = hashlib.sha512(message.encode()).hexdigest()
print(f"SHA-512: {sha512_hash}")

哈希的应用

应用场景 说明
密码存储 存储 hash(password + salt) 而非明文
数字签名 对文件哈希值签名而非整个文件
数据完整性 下载文件时比对哈希值
区块链 每个区块包含前一区块的哈希
Git 用 SHA-1 哈希标识每次提交

TLS/SSL 握手

当你访问 HTTPS 网站时,浏览器和服务器之间发生了什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TLS 1.3 简化握手流程:

Client Server
│ │
│──── ClientHello ──────────────────→│
│ (支持的加密套件, 密钥共享) │
│ │
│←─── ServerHello ──────────────────│
│ (选择的加密套件, 证书, 密钥共享) │
│ │
│ 此时双方已拥有会话密钥 │
│ │
│←────── 加密的应用数据 ────────────→│
│ │
RTT: 1 round trip (比 TLS 1.2 的 2 RTT 快)

区块链中的密码学

工作量证明

比特币使用 SHA-256 作为工作量证明的哈希函数。矿工需要找到满足特定模式的 nonce 值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import hashlib

def proof_of_work(block_data: str, difficulty: int) -> tuple:
"""简化的 PoW 演示"""
prefix = '0' * difficulty
nonce = 0

while True:
hash_input = f"{block_data}{nonce}".encode()
hash_result = hashlib.sha256(hash_input).hexdigest()

if hash_result.startswith(prefix):
return nonce, hash_result

nonce += 1

# 难度为 4:需要一个以 0000 开头的哈希
nonce, hash_val = proof_of_work("Block1: Alice pays Bob 1 BTC", 4)
print(f"Nonce: {nonce}, Hash: {hash_val}")

数字签名

区块链交易使用椭圆曲线数字签名算法 (ECDSA) 来验证交易发起者的身份:

1
2
3
4
5
6
7
创建交易:
1. 交易数据 → 哈希 → 用发送方私钥签名
2. 广播交易 + 签名 + 发送方公钥

验证交易:
节点用发送方公钥验证签名 → 确认交易未被篡改
且确实由私钥持有者发起

量子计算的威胁

Shor 算法

1994 年,彼得·肖尔 (Peter Shor) 提出了一种量子算法,可以在多项式时间内分解大整数。

1
2
3
4
5
经典计算机分解 RSA-2048:
→ 约需要 10 亿年

量子计算机(有足够多稳定量子比特)运行 Shor 算法:
→ 约需要数小时

这意味着一旦大规模量子计算机成为现实,RSA 和 ECC 都将不再安全。

后量子密码学

NIST 正在推进后量子密码学标准的制定。2024 年已经选出了首批标准算法:

  • CRYSTALS-Kyber:密钥封装机制
  • CRYSTALS-Dilithium:数字签名
  • SPHINCS+:基于哈希的数字签名(备选)

这些算法基于格理论 (Lattice-based)、编码理论 (Code-based) 等数学难题,被认为能够抵抗量子计算机的攻击。

总结

密码学的演进史本质上是 攻防双方的不断升级

  1. 古典密码 → 频率分析 → 多表替换
  2. 机电加密 → 图灵破解 → 数字加密
  3. 对称加密 → 密钥分发难题 → 非对称加密
  4. 经典安全 → 量子威胁 → 后量子密码学

下一阶段的密码学,必将在量子计算威胁和后量子密码方案的博弈中继续前进。唯一不变的是人类保护秘密的永恒渴望。