有一个非常典型的案例:频率分析
公元 850 年,一个阿拉伯人写了一本薄薄的小册子。
这本书里描述了一种方法:只要统计密文中每个符号出现的次数,和目标语言的字母频率做对照,任何替换密码都会被轻松破解。
这个方法叫频率分析。发明者是 Al-Kindi,巴格达的博学家。然后这本书消失了。
在随后的 600 年里,整个欧洲大陆继续使用单表替换密码(凯撒密码的变体),并且深信它无法被破译。国王用它传递军令,教廷用它交换机密,商人用它保护账簿。没有人知道,600 年前就已经有人能一眼看穿这些密文。
直到 15 世纪文艺复兴时期,意大利学者才「重新发明」了频率分析——比 Al-Kindi 晚了六个世纪。
在线 demo
在开始正文之前,可以先在在线 demo 中体验一下如何使用 频率分析:破解古典密码的千年技术

一个密码能骗人多久
问题来了:频率分析到底是怎么工作的?为什么它能破解「替换密码」?
先看一个最简单的例子。凯撒密码的规则:把每个字母往后移动固定位数。偏移 3 位,A 变 D,B 变 E,Z 绕回变 C。
用偏移 3 加密 “THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG”,得到:
WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ 看起来像乱码。但字母的出现频率骗不了人。
英文中,E 出现的频率最高(12.7%),T 其次(9.1%),A 第三(8.2%)。这组数据来自 Robert Lewand 2000 年对大量英文语料的统计(Cryptological Mathematics, MAA)。
如果你把密文中每个字母的出现次数统计出来,画一张柱状图——你会发现这张图的形状和英文标准频率一模一样,只是整体向右平移了几格。

平移了几格?那就是密钥。
在 demo 里可以亲眼看到这个过程:频率分析:破解古典密码的千年技术
输入任何凯撒密文,点「暴力破解」,程序会把 26 种偏移全试一遍,对每种结果计算字母频率和英文标准频率的卡方距离(χ²),卡方值最小的那个就是正确答案。
26 次尝试,全部结束
凯撒密码的密钥空间只有 25 种可能(偏移 1 到 25)。就算不用频率分析,纯暴力也只需要试 25 次。
但 Al-Kindi 的贡献在于:他给出了一个通用方法,能对付所有单表替换密码——不只是凯撒这种简单偏移,而是任意打乱 26 个字母的映射。任意打乱 26 个字母有多少种可能?
26! = 403,291,461,126,605,635,584,000,000
四千亿亿亿种。暴力破解在当时完全不可能。但频率分析只需要一张频率表和一点耐心,就能把这个天文数字的搜索空间压缩到可以人工操作的范围。
核心逻辑:
- 统计密文中出现最多的字母 → 大概率对应 E
- 第二多的 → 大概率是 T 或 A
- 逐步建立映射关系,结合常见词(THE, AND, IS)做交叉验证
- 整段密文逐渐浮出水面
这套方法在 850 年就已经完备了。然后欧洲花了 600 年才重新搞明白。
遗失的原因和当时的环境还是有非常
为什么 Al-Kindi 的成果没传到欧洲?
语言壁垒。 Al-Kindi 的著作用阿拉伯文写成,中世纪的欧洲学者几乎不懂阿拉伯文。虽然 12-13 世纪有大规模的阿拉伯文→拉丁文翻译运动(托莱多翻译学院等),但翻译的重点是亚里士多德、欧几里得、托勒密这些「大部头」。一本关于密码破解的小册子,没进入翻译清单。
需求错位。 中世纪欧洲的密码使用者主要是教廷和王室。他们需要的是「能用的加密方法」,没有动力去研究「加密方法是否安全」。安全性靠的是保密制度(持有密码本的人少),不靠密码本身的数学强度。
知识载体脆弱。 Al-Kindi 原稿的唯一已知抄本直到 1987 年才在伊斯坦布尔的苏莱曼尼耶图书馆被重新发现(编号 Ayasofya 4832)。在印刷术普及之前,手抄本的幸存率极低。
结果:一项已经成熟的技术,在人类知识库中消失了整整六个世纪。
重新发现之后:一场军备竞赛
15 世纪欧洲人重新发现频率分析后,密码学被迫进化。
1553 年,Giovan Battista Bellaso 提出了一种对策:用一个密钥词,让每个字母的偏移量不同。第一个字母偏移 S(18),第二个偏移 E(4),第三个偏移 C(2)……密钥词用完后循环使用。
这就是维吉尼亚密码(被后人误归功于 Blaise de Vigenère)。
它为什么能抵抗频率分析?因为同一个明文字母在不同位置会被加密成不同的密文字母。E 不再总是变成同一个字符,频率分布被「抹平」了。

这个密码被称为 le chiffre indéchiffrable——「不可破译之密码」。这个名号维持了将近 300 年。
然后,1854 年,Charles Babbage(对,就是那个设计了差分机的人)破解了它。
他的方法:找密文中的重复片段,计算它们之间的距离,取公因数——就能推断出密钥长度。一旦知道密钥长度,就可以把密文按位置分组,每一组重新变成了单表替换——又可以用频率分析了。
但 Babbage 没有发表。学界普遍推测是因为克里米亚争(1853-1856)期间,英国情报部门不希望这个能力被公开。
九年后,1863 年,普鲁士军官 Friedrich Kasiski 独立发表了同样的方法,后人称之为 Kasiski 检验。
又一次重复发明。 而且原因相同——前一个发现者把知识锁了起来。
在 demo 里可以亲手体验这个过程。输入一段维吉尼亚密文,程序会:
- 用重合指数(IC)分析密钥长度——当分组正确时,每组的 IC 值会从随机水平(≈0.038)跳回英文水平(≈0.067)
- 确定长度后逐位用频率分析破解密钥的每一个字母
- 还原完整密钥,解密全文
三步走完,密钥暴露无遗。试试看:频率分析:破解古典密码的千年技术

最戏剧性的重复发明:公钥密码
密码史上最大规模的「技术遗失后重新发明」发生在 20 世纪 70 年代,而且发生在同一代人之间。
时间线:
| 时间 | 事件 |
|---|---|
| 1970 | 英国 GCHQ 的 James Ellis 提出「非秘密加密」概念 |
| 1973 | GCHQ 的 Clifford Cocks 实现具体算法——本质就是 RSA |
| 1974 | GCHQ 的 Malcolm Williamson 实现密钥交换——本质就是 Diffie-Hellman |
| 1976 | Whitfield Diffie 和 Martin Hellman 公开发表密钥交换协议 |
| 1977 | Rivest、Shamir、Adleman 公开发表 RSA |
| 1997 | GCHQ 解密档案,世人才知道英国人早了 3-4 年 |
信息来源:GCHQ 于 1997 年 12 月 18 日官方确认这段历史,James Ellis 的内部报告《The Possibility of Secure Non-Secret Digital Encryption》原文已公开(CESG Research Report No. 3006)。
注意这里的结构:
- Ellis/Cocks/Williamson 的工作被标注为 UK TOP SECRET,锁进保险柜。
- 学术界的 Diffie-Hellman 和 RSA 完全独立地重新走了一遍同样的思路。
- 两边互不知情长达 20 多年。
遗失的原因只有一个:保密制度。知识在物理上存在,但在社会意义上等同于不存在。
这和 Al-Kindi 的案例形成了对称:
- 一个是因为语言壁垒和手抄本脆弱导致知识物理消亡;
- 一个是知识物理存在但被制度性屏蔽。结果完全相同:后来的人不得不从零开始。
频率分析今天还有用吗
有用。而且不只是在「古典密码」这个已经没人用的领域。
频率分析的核心思想——通过统计分布的不变性来推断隐藏信息——在现代信息安全中以各种变体存活:
| 应用场景 | 频率分析的变体 |
|---|---|
| 流量分析 | 即使内容加密,数据包大小和时间间隔的分布仍可推断通信内容类型 |
| 侧信道攻击 | CPU 缓存命中率的统计模式可泄漏 AES 密钥(Bernstein 2005, Cache-timing attacks on AES) |
| 语言模型指纹 | 不同大模型生成文本的 token 频率分布有细微差异,可用于溯源 |
| 压缩预言攻击 | CRIME/BREACH 攻击利用压缩率变化推断 HTTPS 加密内容(Rizzo & Duong 2012) |
Al-Kindi 在 850 年发现的那个洞察——「加密隐藏了内容,但隐藏不了统计规律」——到今天仍然成立。现代密码(AES、ChaCha20)之所以安全,恰恰是因为它们的设计目标之一就是让密文的统计分布无限接近随机——就是为了堵死这条路。
最后,在 demo 里能玩什么
我做了一个交互式频率分析破解器,可以亲手体验从密文到明文的完整破解过程:
试试交互式频率分析破解器 → 频率分析:破解古典密码的千年技术
下面是一段密文,你能不能解开:
Olq klx zinc kxfykeieq ipasrk fgzrz jmrgiw gyv fj ldigg em 6:30 SQ dp eg spciq, cmqrzrz gyv fj uwh, vyvhompx sg upqklxk, gjfobfk ffag tvgroyswv, kedari r hnet, uhyxwdkek hmx c gmlk, ftlwaari kixll, hzkalmpx xajswxl escgiw hx xtrjyag, ccp cmwv ks fsog dsgwc hfv lgqgfrx wpuv — egv xjvr uwmpx iqhiekiw ls hvie yvckiymp hfv bl?


