跨行棋盘密码与 VIC 密码:冷战间谍加密详解
跨行棋盘密码与 VIC 密码完整指南——苏联冷战间谍所用的加密系统。学习单元—双元替换加密原理,亲手构建棋盘格,并探索其精彩的间谍历史。
简介
1953 年夏天的一个普通日子,布鲁克林的一位报纸送报员——名叫 Jimmy Bozart 的男孩——把一枚五分硬币掉在了人行道上。硬币裂成两半,里面赫然藏着一张微小的缩微胶片。胶片上是一组数字网格,一条让 FBI 困惑了整整四年的密码信息。这些数字背后的加密系统正是 VIC 密码,而其核心正是一种看似简单的技术——跨行棋盘密码。
跨行棋盘密码通过一个网格将字母转换为数字,常用字母被赋予单位数编码,罕见字母则使用两位数编码。这种可变长度编码——称为单元—双元替换——既压缩了信息,又模糊了字母边界,并生成全数字输出,非常适合电报传输。结合置换和一次性密码本叠加加密,跨行棋盘密码成为密码历史学家 David Kahn 所称的"可能是任何间谍使用过的最复杂密码"的基础。
本指南将带你从构建第一个棋盘格,到理解 NSA 为何无法破解 VIC 密码。在此过程中,你将通过加密与解密示例深入学习,探索背后的间谍历史,并了解跨行棋盘密码与其他经典密码系统之间的联系。
免费体验我们的跨行棋盘密码编解码器,边读边实验。
什么是跨行棋盘密码
跨行棋盘密码是一种替换密码,使用三行十列的网格将字母编码为数字。其核心创新在于可变长度编码:语言中最常用的八个字母各用一位数字表示,其余十八个字母则各需两位数字。
这种可变长度方案称为单元—双元替换(源自法语:monome = 单个单元,dinome/binome = 双单元)。"跨行"(straddling)这一名称来自两位数编码在输出流中"横跨"两个位置的特性——第一位数字标识行,第二位标识列。
可变长度的意义
在标准英语文本中,最常见的八个字母(E、T、A、O、N、R、I、S)约占所有字符的 65%—70%。通过为这些字母分配单位数编码,跨行棋盘密码平均每个字母只需约 1.35 位数字——明显少于 Polybius 方格等固定长度系统所需的每字母 2.0 位数字。
但压缩只是优势的一半。可变长度编码还能模糊数字流中的字母边界。在 Polybius 方格中,攻击者知道每对数字代表一个字母。在跨行棋盘密码中,攻击者在不知道哪些数字是行指示符的情况下,很难判断一个字母在哪里结束、下一个从哪里开始。这种模糊性大大增加了频率分析的难度。
网格结构
跨行棋盘密码网格由三个部分组成:
-
标题行:包含 8 个最常用字母,分布在特定列位置(0—9)。两个位置留空——这些空白位置充当行指示符。
-
第二行:包含另外 10 个字母。每个字母的编码由第一个空白位置的列号加上该字母在本行中的列号组成。
-
第三行:包含其余 8 个字母以及可选的特殊字符(句号、斜杠、空格)。每个字母的编码由第二个空白位置的列号加上其列号组成。
字母的具体排列方式和空白位置的选择构成了密码的密钥。发送方和接收方必须就确切的网格配置达成一致。
构建棋盘格
下面使用经典的 VIC 密码配置,逐步构建一个跨行棋盘密码格。
第一步:选择标题行字母
选取 8 个最常用的英文字母。传统助记词是 ESTONIAR(E、S、T、O、N、I、A、R),涵盖了英语中最常见的字母。
第二步:选择空白位置
从列位置(0—9)中选择两个留空。在 VIC 密码中,2 和 6 位置为空,它们成为行指示符。
第三步:排列标题行字母
将 8 个字母分布到其余 8 个位置:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
|---|---|---|---|---|---|---|---|---|---|---|
| E | S | _ | T | O | N | _ | I | A | R |
E 在位置 0,S 在 1,T 在 3,O 在 4,N 在 5,I 在 7,A 在 8,R 在 9。位置 2 和 6 为空(行指示符)。
第四步:填充扩展行
将其余字母填入两个扩展行。第二行(通过行指示符 2 访问)和第三行(通过行指示符 6 访问):
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
|---|---|---|---|---|---|---|---|---|---|---|
| E | S | _ | T | O | N | _ | I | A | R | |
| 2 | B | C | D | F | G | H | J | K | L | M |
| 6 | P | Q | U | V | W | X | Y | Z | . | / |
现在每个字母都有唯一编码:
- 标题行字母:E=0,S=1,T=3,O=4,N=5,I=7,A=8,R=9
- 第 2 行字母:B=20,C=21,D=22,F=23,G=24,H=25,J=26,K=27,L=28,M=29
- 第 6 行字母:P=60,Q=61,U=62,V=63,W=64,X=65,Y=66,Z=67,.=68,/=69
选择不同配置
网格布局具有灵活性,可以:
- 重新排列各位置的字母
- 选择不同的空白位置(例如用 3 和 7 代替 2 和 6)
- 针对非英语文本使用特定语言的字母频率
- 添加数字或其他特殊字符
每种唯一的网格配置实际上都创建了一个不同的密钥。
加密教程
下面使用上述 VIC 密码网格,对消息 "ATTACK AT DAWN" 进行加密。
首先去掉空格:ATTACKATDAWN(12 个字母)。
逐一在网格中查找每个字母的编码:
| 字母 | 位置 | 编码 |
|---|---|---|
| A | 标题行,第 8 列 | 8 |
| T | 标题行,第 3 列 | 3 |
| T | 标题行,第 3 列 | 3 |
| A | 标题行,第 8 列 | 8 |
| C | 第 2 行,第 1 列 | 21 |
| K | 第 2 行,第 7 列 | 27 |
| A | 标题行,第 8 列 | 8 |
| T | 标题行,第 3 列 | 3 |
| D | 第 2 行,第 2 列 | 22 |
| A | 标题行,第 8 列 | 8 |
| W | 第 6 行,第 4 列 | 64 |
| N | 标题行,第 5 列 | 5 |
拼接编码: 8 3 3 8 21 27 8 3 22 8 64 5
最终密文: 833821278322 8645
不带空格:8338212783228645
注意其特性:
- 8 个标题行字母(A、T、T、A、A、T、A、N)各产生 1 位数字 = 8 位
- 4 个扩展行字母(C、K、D、W)各产生 2 位数字 = 8 位
- 合计:12 个字母共 16 位数字(平均每字母 1.33 位)
- 同样 12 个字母使用 Polybius 方格将产生 24 位数字
全数字输出在历史上具有重要意义,因为纯数字消息可以通过电报发送而不引起怀疑——它们看起来像普通的商业或财务往来信息。
解密过程
解密时,从左到右扫描数字流,利用已知的行指示符进行判断。
密文: 8338212783228645
行指示符: 2 和 6
解密步骤:
| 步骤 | 当前数字 | 是否行指示符? | 操作 | 结果 |
|---|---|---|---|---|
| 1 | 8 | 否 | 查标题行第 8 列 | A |
| 2 | 3 | 否 | 查标题行第 3 列 | T |
| 3 | 3 | 否 | 查标题行第 3 列 | T |
| 4 | 8 | 否 | 查标题行第 8 列 | A |
| 5 | 2 | 是(第 2 行) | 读下一位:1 → 第 2 行第 1 列 | C |
| 6 | 2 | 是(第 2 行) | 读下一位:7 → 第 2 行第 7 列 | K |
| 7 | 8 | 否 | 查标题行第 8 列 | A |
| 8 | 3 | 否 | 查标题行第 3 列 | T |
| 9 | 2 | 是(第 2 行) | 读下一位:2 → 第 2 行第 2 列 | D |
| 10 | 8 | 否 | 查标题行第 8 列 | A |
| 11 | 6 | 是(第 6 行) | 读下一位:4 → 第 6 行第 4 列 | W |
| 12 | 5 | 否 | 查标题行第 5 列 | N |
解密结果: ATTACKATDAWN
解密过程完全无歧义。在每一步,解码者都能准确判断应读取一位还是两位数字,因为行指示符是不与标题行字母编码重叠的特定数值。这种确定性解析是该密码设计的关键特性。
VIC 密码的故事
跨行棋盘密码最著名的应用是作为 VIC 密码的第一层,被苏联情报机构在冷战最激烈时期使用。VIC 密码的故事读来如同间谍惊悚小说——因为它确实就是。
Reino Häyhänen 与空心镍币案
Reino Häyhänen(代号 VIKTOR,VIC 密码的名称即源于此)是一位芬兰裔 KGB 官员,于 1952 年抵达美国。他的任务是协助资深间谍 Rudolf Abel(真名 Vilyam Genrikhovich Fisher)——后者在布鲁克林的一间工作室公寓里运营着苏联间谍网络。
VIC 密码是 Häyhänen 向莫斯科中心加密情报报告的主要工具。这是一种多步骤手工密码,复杂程度令人惊叹:
- 跨行棋盘密码 — 将明文转换为数字
- 链式加法 — 使用由助记短语和日期派生的数字密钥进行模运算
- 列置换 — 使用置换密钥重排数字序列
- 最终格式化 — 将数字分组以便发送
每一步都增加了一层加密,解密时必须按正确顺序逐层还原。整个过程只需纸和笔即可完成——无需密码机。
空心镍币的发现
1953 年 6 月,送报员 Jimmy Bozart 收到一枚五分硬币作为小费。他不小心将其掉落,硬币裂开,露出内藏的一张微型胶片。Bozart 将其展示给朋友,随后这枚硬币辗转到达 FBI 手中。
胶片上是一列列数字——一条 VIC 密码信息。FBI 最优秀的密码分析师对这条信息研究了整整四年,却毫无突破。跨行棋盘编码、链式加法和置换的三重组合,击败了他们尝试的每一种攻击手段。
Häyhänen 的叛逃
突破口并非来自密码分析,而是来自人力情报。Häyhänen 已经嗜酒成性,表现每况愈下。1957 年,KGB 将他召回莫斯科——很可能是为了惩处他。Häyhänen 却走进了美国驻巴黎大使馆,向美方投诚。
Häyhänen 提供的情报中包括完整的 VIC 密码系统,涵盖跨行棋盘密码网格配置、链式加法程序、置换密钥生成方法以及用于密钥推导的助记短语。凭借这些信息,FBI 终于破解了空心镍币中的信息——内容是对一名即将抵达美国的新特工的指令。
Häyhänen 的叛逃还导致 Rudolf Abel 于 1957 年 6 月被识别并逮捕。Abel 被判间谍罪,获刑 30 年监禁。1962 年,他在柏林格利尼克大桥的一次戏剧性交换中,被换回被俘的美国 U-2 飞行员 Francis Gary Powers。
为何 NSA 无法破解
VIC 密码通过纵深防御实现了卓越的安全性:
- 跨行棋盘密码以可变长度编码将字母转换为数字,破坏了频率分析
- 链式加法(对数字流进行模运算)分散了统计规律
- 列置换重排了数字,打破了任何残留的序列关系
- 从助记短语推导密钥,意味着密钥从不被书写或传输
每一层单独使用都存在漏洞,但多层组合彻底击败了 NSA 最优秀的密码分析师。密码学史上最权威的历史学家 David Kahn 写道,VIC 密码"可能是任何间谍使用过的最复杂密码",并且"充分展示了一个精心设计的手工密码有多难破解"。
历史时间线
跨行棋盘密码有着跨越五个世纪的历史:
1555 年——梵蒂冈起源:Argenti 家族曾担任教皇国的密码秘书,为教皇外交通信开发了早期单元—双元编码系统。这些文艺复兴时代的密码遵循相同的基本原则:为常用字母分配比罕见字母更少的符号。Argenti 系统被用于保护罗马与驻欧洲各地大使之间的往来信函。
1890 年代至 1900 年代——形式化:密码学家将单元—双元编码的网格方法正式化。三行十列的网格格式在这一时期成型,形成我们今天所认识的现代跨行棋盘密码。
1937 年——瑞典共产党人:一批瑞典共产党人被发现使用跨行棋盘密码进行秘密通信。瑞典信号情报机构(FRA)成功破解了该系统,这是跨行棋盘密码最早有记录的密码分析攻击之一。该事件既展示了这一密码对秘密行动的实用价值,也揭示了其作为单独系统使用时的脆弱性。
1940 年代末——苏联情报采用:KGB 将跨行棋盘密码纳入 VIC 密码系统,将其与链式加法和置换相结合,构建了一种前所未有、安全性极高的多层手工密码。
1953 年——空心镍币:著名的空心镍币在纽约布鲁克林被发现,内藏一条 VIC 密码信息。
1957 年——Häyhänen 叛逃:Reino Häyhänen 向西方投诚,揭露了 VIC 密码系统,并导致 Rudolf Abel 被捕。
1962 年——Abel 与 Powers 交换:Rudolf Abel 与 U-2 飞行员 Francis Gary Powers 完成交换,冷战最著名的间谍案件之一就此落幕。
当今:跨行棋盘密码至今仍是密码学教育中的重要课题,展示了可变长度编码、分组化以及多层加密组合的强大威力。
跨行棋盘密码与 Polybius 方格的对比
Polybius 方格和跨行棋盘密码都使用网格将字母转换为数字,但它们代表着根本不同的设计理念。
Polybius 方格由古希腊历史学家 Polybius 在公元前 2 世纪描述。它使用 5×5 网格(将 I 和 J 合并),每个字母始终编码为表示其行列坐标的一对数字,例如 A 可能是"11",B 是"12",以此类推。输出长度始终是明文的两倍。
跨行棋盘密码出现得晚得多(16 至 20 世纪),使用可变长度编码。其输出通常比 Polybius 方格编码同一消息短 30%—35%。
| 属性 | Polybius 方格 | 跨行棋盘密码 |
|---|---|---|
| 网格尺寸 | 5 × 5 | 3 × 10 |
| 字母容量 | 25 个字母(I=J) | 26 个字母及更多 |
| 每字母位数 | 始终为 2 | 1 或 2(可变) |
| 平均输出比 | 每字母 2.0 位 | 每字母约 1.35 位 |
| 字母边界可见性 | 始终已知(每 2 位) | 模糊(边界可变) |
| 频率分析难度 | 中等 | 更高 |
| 历史年代 | 古希腊(公元前 200 年) | 文艺复兴至冷战(1555—1957 年) |
Polybius 方格的简洁性使其成为几种重要密码系统的基础:ADFGX 密码(一战德军密码)将数字 1—5 替换为字母 A、D、F、G、X,然后应用列置换;ADFGVX 密码将其扩展为包含数字的 6×6 网格。两种系统都证明,Polybius 原理通过与置换结合可以大幅增强安全性——这与 VIC 密码对跨行棋盘密码所采用的策略相同。
与 ADFGX/ADFGVX 密码的关联
跨行棋盘密码与第一次世界大战中德国军队使用的 ADFGX 和 ADFGVX 密码在概念上存在渊源关系。
两种系统都使用分组化技术——即将每个字母分解为可以独立重排的更小单元(数字)。在 ADFGX 密码中,每个字母被拆分为类 Polybius 网格中的两个坐标。生成的坐标流随后经过列置换,将不同字母的片段混合在一起。这使密码比单独使用替换或置换更难以通过频率分析破解。
VIC 密码遵循同样的原理:跨行棋盘密码将字母分解为数字,随后的置换步骤对这些数字片段进行重排。如果某个置换后的单个数字原本是两位编码的行指示符,它现在与其列编码伙伴相距甚远——使得在没有密钥的情况下重建原文极为困难。
关键区别在于:ADFGX 系统使用固定长度分组化(每个字母始终变为 2 个符号),而跨行棋盘密码使用可变长度分组化。这一可变长度特性为密码分析者增加了额外难度,因为他们无法在置换输出中轻易确定字母边界。
常见问题
跨行棋盘密码可以被破解吗?
单独使用(不结合置换或叠加加密)时,跨行棋盘密码容易受到频率分析攻击,尽管分析比简单替换密码更为复杂。单位数编码对应高频字母,因此其在密文中的频率会暴露网格信息。但可变长度编码意味着分析者必须首先确定行指示符,才能进行标准频率分析。与置换结合使用时(如 VIC 密码),系统的安全性会显著提高。
如何选择最佳的空白位置?
两个空白位置应选择能使扩展行分布均衡的位置。常见选择是位置 2 和 6,或 3 和 7。边缘位置(0 和 9)效果也不错,因为它们在网格中形成清晰的视觉分隔。具体选择会影响两位数编码的分布,但对整体安全性影响不大。最重要的是发送方和接收方使用完全相同的配置。
跨行棋盘密码可以加密数字吗?
在标准 26 字母配置中,数字必须拼写出来(例如用"THREE"代替"3"),或者可以使用修改后的网格。一些历史实现采用了带有额外行指示符的四行棋盘,允许将数字 0—9 作为可编码字符。另一种方法是在网格中放置数字切换指示符——遇到该指示符时,后续数字被解释为原始数字,直到遇到字母切换指示符。
叠加加密如何与跨行棋盘密码配合使用?
叠加加密在跨行棋盘密码输出之上再添加一层加密。最常见的方法是模加法:将棋盘密码输出的每位数字与密钥流(通常是一次性密码本)中对应数字相加(模 10)。例如,若棋盘输出为"833821",密钥流为"729456",则叠加加密输出为"552277"(8+7=15→5,3+2=5,3+9=12→2,以此类推)。这一步骤消除了棋盘编码后残留的任何频率信息。
跨行棋盘密码与摩斯密码有关联吗?
在概念上有关联。两者都是可变长度编码系统,为更常用的符号分配更短的编码。在摩斯密码中,字母 E(英语中最常见)只是一个点,而 Z 需要四个符号。跨行棋盘密码将同样的压缩原则应用于数字编码:E 占一位数字,而 Z 占两位。这种相似并非偶然——两种系统都针对自然语言消息的高效传输进行了优化。
VIC 密码今天还能安全使用吗?
VIC 密码的设计原则仍然合理,但该系统无法达到现代安全标准。现代计算机每秒可以测试数十亿种密钥组合,使针对 VIC 密码相对较小密钥空间的暴力攻击变得可行。此外,链式加法步骤使用的模运算在计算上极易逆推。对于现代安全通信,AES-256 等算法以更简单的密钥管理提供了远超 VIC 密码的安全性。VIC 密码的历史价值在于展示了纸笔方法所能达到的最高安全水平。