第 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” 这种词当密钥,简直白送。

对比项凯撒密码维吉尼亚密码
密钥形式单一数字关键词(字符串)
替换方式单表替换多表替换
密钥空间2526ⁿ(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 混淆,或者把栅栏的栏数伪装成单词长度。这时候别急,先按手算方法分析,再写代码验证,效率最高。

好了,这一章就到这。拿出纸笔,把上面三个例子自己算一遍,比读十遍都管用。