两千年前罗马军团的加密术,以及它教给我们的第一条铁律:密钥空间太小,一切免谈。
公元前一世纪,尤利乌斯·凯撒给他的将军们写信时,把每个字母向后挪三位:A 变 D,B 变 E,以此类推。这就是凯撒密码——人类有记载最早的加密方法之一。它简单到可以用一个纸轮盘完成,也简单到我们能用它讲清楚整个密码学最核心的一个量:密钥空间。
把 26 个字母编号 A=0, B=1, …, Z=25。凯撒密码的加密就是一个模 26 的加法:
这里 K 就是密钥——移位量。凯撒本人固定用 K=3,但我们可以取 1 到 25 之间任意值(K=0 等于没加密)。mod 26 保证字母表"绕回来":Z 往后挪 3 位会回到 C。这个"绕回来"的模运算,后面会一路跟着我们直到 RSA 和椭圆曲线。
一个密码所有可能密钥的集合,其大小决定了"挨个试"要试多少次。凯撒密码的密钥空间只有 25 个有效值(排除 K=0)。记住这个数字——它马上就会要了凯撒密码的命。
下面这个 Demo 就是一个数字化的凯撒轮盘。拖动移位滑块,看外圈(明文)如何对齐到内圈(密文);上方的文本会实时加密。试试把移位调到 3,输入 ATTACK AT DAWN。
现在切换阵营,当一回 Eve。假设你截获了一段凯撒密文,但不知道 K。你会怎么做?
答案简单得令人失望:把 25 个密钥全试一遍。这叫暴力破解(brute force)——穷举整个密钥空间。25 次解密里,只有一个会产出通顺的英文,那就是答案。人眼扫一遍就能挑出来;而计算机可以用"哪段最像英语"自动挑。
怎么让机器判断"像不像英语"?一个经典办法是卡方统计量:把这段文本的字母频率和标准英文频率(E 最多、Z 最少……第 3 章详谈)做比较,偏差越小越像英语。下面的 Demo 会把 25 种解密全列出来,并用卡方分数自动把最可能的答案顶到最前面、标绿。
凯撒密码的算法本身没问题,毁在密钥空间只有 25。任何密钥空间小到可以穷举的密码,都是不安全的,无论算法多巧妙。现代 AES 的密钥空间是 2128 ≈ 3.4×1038——就算把全世界的计算机都拉来,每秒试万亿次,也要远超宇宙年龄。这就是"暴力破解不可行"的真正含义。
一个自然的念头:既然移位不够,那我不按固定规律移,而是让 26 个字母各自随机映射到另一个字母呢?这就是单表替换密码,密钥空间暴涨到 26! ≈ 4×1026——比 AES 差不了几个数量级,暴力破解彻底没戏。
听起来固若金汤?第 3 章会用一个残酷的事实把它撕开:密钥空间大,不等于安全。替换密码保留了语言的统计结构,而统计结构会像指纹一样出卖它。我们会亲手用频率分析,在几秒内破解一个 4×1026 密钥空间的密码。
你可能在老论坛见过 ROT13——就是 K=13 的凯撒密码。因为 13 是 26 的一半,加密和解密是同一个操作(转两次回到原文)。它从不用于保密,而是用来"遮挡"剧透、答案、冒犯性文字,让人需要主动解码才看得到。这是个有趣的提醒:编码 ≠ 加密。Base64 同理——它只是换种表示,毫无保密性。
C = (P + K) mod 26,密钥就是移位量。