3. 古典密码与密码分析入门
古典密码是理解现代密码学的最佳起点:它们的数学结构简单到可以手算,却完整包含了加密、解密、密钥、攻击者模型这些核心概念。本节围绕四种典型古典密码——凯撒密码、仿射密码、维吉尼亚密码,以及三种攻击方式——频率分析、唯密文攻击、已知明文攻击,展开一次可动手复现的实战演练。所有示例中的密文、统计数字均为教学构造,用于说明方法本身,不代表真实系统的安全性。
一、凯撒密码:移位与暴力破解
凯撒密码是最简单的替换密码,加密规则为 C = (P + k) mod 26,解密为 P = (C − k) mod 26,其中 k 是 0~25 的移位量,也是唯一密钥。例如取 k=3,明文 ATTACK 加密后得到 DWWDFN。凯撒密码的密钥空间只有 26,攻击者只需枚举全部 26 个移位量,逐个观察哪个结果像自然语言,即可在几秒内破解。这种攻击属于唯密文攻击:攻击者只掌握密文,不需要任何明文片段。
下面给出一个可直接运行的 Python 枚举脚本,用于演示暴力破解过程:
def caesar_decrypt(c, k):
return ''.join(chr((ord(ch) - 65 - k) % 26 + 65) for ch in c)
cipher = "DWWDFN"
for k in range(26):
print(k, caesar_decrypt(cipher, k))
运行后会在 k=3 处输出 ATTACK,其余 25 行则是无意义的字母串。判断依据很直接:只有可读的英文单词才是正确密钥。凯撒密码的教学价值在于,它让“密钥空间大小决定暴力破解可行性”这一结论变得可触摸。
二、仿射密码:两个参数的线性变换
仿射密码把移位扩展为线性变换:C = (a·P + b) mod 26,解密为 P = a⁻¹·(C − b) mod 26。这里 a 必须与 26 互素,否则不存在乘法逆元,解密不唯一。与 26 互素的 a 有 1、3、5、7、9、11、15、17、19、21、23、25 共 12 个,b 有 26 种取值,因此密钥空间为 12×26=312,比凯撒密码大一个量级,但依然可以被暴力枚举。
以 a=5、b=8 为例,先求 5 在模 26 下的逆元:5×21=105=4×26+1,故 a⁻¹=21。加密 HELLO 时,H(7)→(5×7+8) mod 26=43 mod 26=17→R,E(4)→28 mod 26=2→C,L(11)→63 mod 26=11→L,O(14)→78 mod 26=0→A,得到密文 RCLLA。解密时用 21 乘回即可还原。仿射密码说明了一个重要事实:参数之间存在约束关系,a 的取值不是任意的,这种“密钥合法性条件”在现代密码中同样存在(如 RSA 中 e 与 φ(n) 互素)。
三、维吉尼亚密码:多表替换与密钥周期
维吉尼亚密码用一组移位量循环加密,密钥是一个单词。加密规则为 C_i = (P_i + K_{i mod m}) mod 26,m 为密钥长度。例如密钥 KEY(K=10,E=4,Y=24),明文 ATTACKATDAWN,逐字符相加得到密文 KXQKGMKXDCKV。由于同一个明文字母在不同位置可能被加密成不同密文字母,单表频率分析失效,维吉尼亚密码因此被称为“不可破译的密码”,直到 1863 年卡西斯基提出周期检测方法。
破解维吉尼亚密码分两步:先确定密钥长度 m,再逐列做频率分析。确定 m 的常用方法是寻找密文中重复出现的三字母组,记录它们之间的距离,取这些距离的最大公约数。例如密文中 KXQ 出现在位置 0 和 6,距离为 6,若多个重复组的距离公约数为 3,则 m 很可能为 3。确定 m 后,把密文按列拆成 m 组,每组退化为一个凯撒密码,用频率分析逐列求解移位量即可恢复密钥。
四、已知明文攻击:从“猜”到“算”
已知明文攻击(KPA)假设攻击者掌握一对或多对明文—密文。对维吉尼亚密码,只要知道明文和对应密文,直接相减即可得到密钥片段:K_i = (C_i − P_i) mod 26。例如已知明文 ATTACK 对应密文 KXQKGM,逐位相减得到 K、E、Y、K、E、Y,密钥 KEY 立即暴露。对仿射密码,已知两对明密文即可联立方程组解出 a 和 b;对凯撒密码,一对明密文就足以确定移位量。
这解释了为什么现代密码学强调“即使攻击者获得部分明文,也不应泄露密钥”。古典密码在 KPA 下几乎全部崩溃,而现代分组密码通过非线性 S 盒、扩散层和轮密钥设计,使得单对明密文无法线性推出密钥。
五、三种攻击模型的对比与实战判断
| 攻击模型 | 攻击者掌握的信息 | 对凯撒密码 | 对仿射密码 | 对维吉尼亚密码 |
|---|---|---|---|---|
| 唯密文攻击 | 仅密文 | 枚举 26 种移位 | 枚举 312 种密钥 | 卡西斯基 + 频率分析 |
| 已知明文攻击 | 若干明文—密文对 | 1 对即可确定 k | 2 对解出 a、b | 相减直接得密钥片段 |
| 选择明文攻击 | 可自选明文获取密文 | 选 A 即得 k | 选 A、B 即得 a、b | 选足够长明文即得完整密钥 |
本节的核心结论可以概括为三句话:凯撒密码暴露了密钥空间过小的问题;仿射密码展示了参数约束与线性可解性;维吉尼亚密码则说明多表替换能抵抗单表频率分析,但无法抵抗周期检测与已知明文攻击。掌握这三种密码的破解思路,就具备了理解现代密码攻击模型的基础直觉。