斯巴达卷棒密码
发布 2026 年 9 月 5 日 · · 6 分钟阅读
卷棒密码不给字母改名,它只打乱顺序。把一条皮条缠在木棒上,横着写过去,再解开。所有字母都还在,明明白白地摆在那里,只是顺序错了。此后两千年里所有置换密码都是这一个动作的改良。
- 时代
- 古典时代
- 类型
- 置换
- 密钥空间
- staff diameter
- 难度
- 入门
I现象
把明文按每行 n 个字母写下来,n 就是木棒的棱数;然后按列读,而不是按行读。
取 n = 4、消息 LOOM KEEPS ITS OWN COUNSEL:
| L | O | O | M |
| K | E | E | P |
| S | I | T | S |
| O | W | N | C |
| O | U | N | S |
| E | L |
自上而下逐列读取,得到 LKSOOE OEITWUL OETNN MPSCS——每个字母都还在,但没有一个还待在原来的位置。
与凯撒最关键的区别在于:字母频率完全没变。密文中 E 的数量与明文中 E 的数量一模一样。被攻击的只是位置。
II密钥空间
密钥是木棒的直径——一块木头,而不是一个数字。这既迷人又不实用。
由于直径在原理上连续,有效密钥空间其实是消息长度的约数集合。对一条 60 字母的消息,约数是 1、2、3、4、5、6、10、12、15、20、30、60;去掉 1 与 60(恒等变换),还剩 10 个。不到三个半比特——比凯撒的空间还小。
更糟的是攻击者根本不需要猜。每个可能的直径都会产出一个候选明文,而语言是一眼可辨的。十五次尝试就是一杯咖啡的时间。
这是置换密码反复教给人的一课:密钥空间不是物理物品的数量,而是这些物品能对这一条特定消息做出多少种区分。
III加密步骤
- 选定直径 n。历史上这就是你实际持有的那根木棒。
- 去掉空格与标点,把明文写成一段连续的大写字母串。
- 把字母串写进一张 n 列的表,从左到右、从上到下填充。
- 若表不能填满,用填充字母补齐最后一行——接收方必须知道哪些字母要丢弃。
- 自上而下、自左而右逐列读取。这就是密文。
- 把皮条重新缠上木棒照着写——这个物理动作与建表是等价的。
IV解密步骤
- 先数密文字母个数。若木棒直径是 n,用长度除以 n 得到行数。
- 这次按列向下把密文写进一张 n 列的表——也就是发信人用过的那张表。
- 按行横向读出,恢复明文。
- 丢弃末尾的填充字母。
- 若不知道 n,就试长度的每一个约数。对每个候选按行读出,保留读得通的那一个。
V弱点
易位构词法(anagramming)。 只有密文的攻击者,可以把字母按每一种可能的宽度排成矩形,再逐列读。正确的宽度会自己暴露:某一瞬间列里出现了词。
频率未被触动。 凯撒至少还打乱了“哪个字母常见”。卷棒把语言的频率画像原样留下,这意味着所有统计工具都可以不加修改地使用。
长度是破绽。 能排成完整矩形的列数是极短的清单,攻击者仅凭消息长度、不需要任何密钥材料就能算出来。
物理密钥很脆弱。 木棒可以被偷、被量、被复制。不换硬件就无法换密钥,也无法在同一场战役里对不同消息使用不同密钥。
VI实战挑战
密文
TOESP EHOAA AREMV LTNLW ELTS
提示: 四列。按列写下去,按行读出来。
展开答案
明文
THE LOOM WEAVES ALL PATTERNS
·史料
普鲁塔克在《吕山德传》中描述了斯巴达的 skytale:一条皮条缠在木棒上、横着书写,寄给持有相同木棒的将领。据记载它曾让一次对波斯的远征保密成功,也是已知最早为密码目的而非书写目的专门设计的器械。它的弱点——密钥是一件必须运输、复制并保护的实物——此后一直也是所有密钥分发系统的弱点。
·继续读
卷棒属于置换密码,而置换从未消亡——它只是与其他手法组合。一战德军的 ADFGVX 野战密码是“分馏替换 + 列置换”;二战英国 SOE 特工使用的双重置换系统,其实就是把卷棒的思路用了两遍。
它在现代的直系后代是分组密码里的置换盒。AES 在交替的轮中执行替换(S 盒)与置换(ShiftRows 与 MixColumns),其假设是两种操作单独都不强、合起来才强——这恰恰是斯巴达木棒没能形成的直觉。
下一台织机:pigpen-cipher 回到替换,但用画出来的框架取代字母表。