第 2 章 古典密码:凯撒密码、维吉尼亚密码、栅栏密码
要说密码学入门,绕不开这三个老前辈。凯撒、维吉尼亚、栅栏——它们虽然简单,但背后的设计思想今天还在用。我当年啃密码学教材时,就是靠手算这几样把底子打实的。别光看代码,自己拿笔算一遍,印象才深。
2.1 凯撒密码:最朴素的单表替换
凯撒密码,说白了就是把字母表平移固定的位数。比如移动 3 位,A 变成 D,B 变成 E……明文 “HELLO” 就变成 “KHOOR”。加密和解密用同一个数,只是方向相反。
手算方法:找一张字母表,写下明文字母,然后数 k 个位置往后写。我习惯在纸上画两个圆环,内环明文、外环密文,转着看。
- 加密:C = (P + k) mod 26
- 解密:P = (C - k) mod 26
- 密钥空间:只有 25 种有效位移(移 26 等于没移)
我刚开始教新手时,常有人把 A 当 0 还是 1 搞混。记住:A=0,B=1……Z=25。这样 mod 运算不会出界。
2.2 维吉尼亚密码:用关键词拉开差距
凯撒太容易被暴力破解了,一个频率分析就倒。维吉尼亚密码用多表替换,一个字母可能被加密成不同密文,频率分布就被打散了。
手算方法:选一个关键词,比如 “KEY”。把关键词重复写到明文长度上,每个位置用对应的字母作为凯撒位移量。K=10,E=4,Y=24。明文 “HELLO” 配关键词 “KEYKE”,于是:
明文:H(7) E(4) L(11) L(11) O(14)
密钥:K(10) E(4) Y(24) K(10) E(4)
密文:R(17) I(8) J(9) V(21) S(18)
所以密文是 “RIJVS”。解密时反过来减就行。
注意:密钥长度越长,破解难度越大。但要是关键词重复出现,模式就暴露了,这就是卡西斯基检测法的突破口。我在做安全审计时,见过不少系统把 “PASSWORD” 这种词当密钥,简直白送。
| 对比项 | 凯撒密码 | 维吉尼亚密码 |
|---|---|---|
| 密钥形式 | 单一数字 | 关键词(字符串) |
| 替换方式 | 单表替换 | 多表替换 |
| 密钥空间 | 25 | 26ⁿ(n为关键词长度) |
| 常见破解 | 暴力枚举、频率分析 | 卡西斯基+重合指数 |
2.3 栅栏密码:换个角度写字母
我当年读谍战小说时第一次看到它。说白了就是把明文字母按行写成一个矩阵,然后按列读出来。
手算方法:给定栏数(比如 3 栏),把明文字母按行填入。例如明文 “HelloWorld”:
行1: H l W d
行2: e o r
行3: l l
按列读取:第一列 H e l,第二列 l o l,第三列 W r,第四列 d。得到密文 “Hel lolW rd”(实际写时连续)。解密时反过来——根据密文长度和栏数算出每列有几个字母,再按列填入。
栅栏密码的密钥就是栏数,通常很小(2~10)。栏数选太大,明文会被切得太碎,解密反而容易出错。我以前写破解脚本时,习惯从 2 开始试到 10,大部分都能跑出来。
知识结构归纳
这三种密码分别代表了古典密码的三大思路:单表替换、多表替换和置换。下面的 SVG 图把它们的关系和手算要点串了起来。
这三种密码今天虽然不再直接用于加密,但它们的影子无处不在。凯撒是平移的雏形,维吉尼亚是流密码的祖先,栅栏是换位密码的代表。后面学现代密码时你会反复见到这些思想。
我自己在做 CTF 题目时,经常遇到古典密码的变体。比如把凯撒跟 ROT13 混淆,或者把栅栏的栏数伪装成单词长度。这时候别急,先按手算方法分析,再写代码验证,效率最高。
好了,这一章就到这。拿出纸笔,把上面三个例子自己算一遍,比读十遍都管用。