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 组,每组退化为一个凯撒密码,用频率分析逐列求解移位量即可恢复密钥。

维吉尼亚密码加密与唯密文攻击流程 加密:多表移位 明文 P 密钥 K(循环) 密文 C 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 Q K G M K X D C K V C_i = (P_i + K_i) mod 26 同一明文字母 → 不同密文字母 单表频率分析失效 唯密文攻击:两步破解 ① 卡西斯基检测密钥长度 m 重复三字母组距离 → 取最大公约数 示例:距离 6、9、12 → m = 3 ② 按列拆分为 m 组凯撒密码 每列独立做频率分析 恢复各列移位量 → 拼出密钥 频率分析:英文字母出现频率对照(教学示意) E 12.7% T 9.1% A 8.2% O 7.5% I 7.0% N 6.7% S 6.3% H 6.1% R 6.0% D 4.3% L 4.0% Z 0.1% 攻击者将密文字母频率与标准频率比对,偏移量即为该列凯撒密钥

四、已知明文攻击:从“猜”到“算”

已知明文攻击(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 选足够长明文即得完整密钥
实战判断要点:拿到一段密文时,先看长度和字母分布。若字母频率与英文高度吻合,优先怀疑单表替换(凯撒、仿射);若频率被“抹平”,则考虑多表替换(维吉尼亚)。确定类型后,再根据是否掌握明文片段选择攻击路径:有明文对直接解方程,无明文对则走频率分析或暴力枚举。
常见误区:不要认为“密钥更长就更安全”。维吉尼亚密码的密钥若短于明文且重复使用,仍会被卡西斯基方法击破;只有当密钥长度接近明文长度且真正随机时,才接近一次一密的安全性。古典密码的教训是:安全性来自密钥空间、非线性与随机性,而不是加密规则的复杂度。

本节的核心结论可以概括为三句话:凯撒密码暴露了密钥空间过小的问题;仿射密码展示了参数约束与线性可解性;维吉尼亚密码则说明多表替换能抵抗单表频率分析,但无法抵抗周期检测与已知明文攻击。掌握这三种密码的破解思路,就具备了理解现代密码攻击模型的基础直觉。