运行密钥密码

流动密钥密码:基于书本的多表替换加密

流动密钥密码完整指南——一种以书本段落作为密钥的多表替换密码。学习加密、解密、拖拽破解攻击,并了解它与维吉尼亚密码和书本密码的异同。

发布于 2026年3月19日
14 分钟阅读
密码学指南

引言

流动密钥密码在密码学历史上占据着一个耐人寻味的交汇点。它沿用了维吉尼亚密码熟悉的加密机制——tabula recta、模运算加法、多表替换——并解决了前者最明显的弱点:重复密钥。通过将短关键词替换为一段完整的书本文字,流动密钥密码消除了使标准维吉尼亚密码易于破解的周期性规律。

然而,流动密钥密码并非牢不可破。它的精妙之处与弱点恰恰来源于同一根源:将自然语言作为密钥材料。一段书本文字足够长,可以避免密钥重复,但它并非随机文本。英语的统计特性——字母频率、常见双字母组合、可预测的词汇模式——仍存在于密钥文本中,并泄露了关于明文的信息。这使得流动密钥密码成为一个极具研究价值的案例,揭示了当随机性被结构所取代时安全性是如何下降的。

本指南涵盖从基本加密机制到高级拖拽破解攻击的全部内容。无论你是密码学学生、谜题爱好者,还是冷战情报的历史研究者,都能在这里找到对这一最优雅经典密码之一的深入阐述。

试用我们的免费流动密钥密码编码器与解码器,边阅读本指南边动手实践。


什么是流动密钥密码

流动密钥密码是一种多表替换密码,它使用一段长文本——通常是书本中的一个段落——作为加密密钥。明文中的每个字母与密钥文本中对应位置的字母通过 tabula recta(一张 26×26 的凯撒移位字母表)组合,从而产生密文。

流动密钥密码的核心特性在于密钥长度至少与消息等长。与维吉尼亚密码使用"SECRET"这类短关键词循环重复不同,流动密钥在单条消息中从不重复。这消除了使维吉尼亚密码容易遭受卡西斯基检验和重合指数测试的周期性结构。

"流动密钥"这一名称源于密钥逐字符地与明文"并行流动",持续从源文本中提取。历史上,通信双方会约定特定的书籍、版本、页码和起始行。书本充当双方都能独立访问的共享密钥库——无需传递密钥本身。

流动密钥密码有时会与"书本密码"混淆,但两者本质上是完全不同的系统。流动密钥密码是一种通过数学运算逐字母变换的替换密码;书本密码则是一种代码系统,通过词位引用(页码-行号-词号)来直接表示明文单词。本文稍后将详细探讨这一区别。

数学基础

加密公式与维吉尼亚密码完全相同:

加密: C[i] = (P[i] + K[i]) mod 26

解密: P[i] = (C[i] - K[i] + 26) mod 26

其中:

  • P[i] 是位置 i 处的明文字母,映射为 0-25(A=0, B=1, ..., Z=25)
  • K[i] 是位置 i 处的密钥字母
  • C[i] 是位置 i 处的密文字母

解密公式中的"+26"确保模运算前结果不为负数。


逐步加密教程

我们以布莱恩·柯尼汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)所著《C 程序设计语言》中的一段文字作为密钥,加密消息"SEND MORE TROOPS"。我们使用第一章的开篇文字:

密钥来源: "A TUTORIAL INTRODUCTION TO THE C PROGRAMMING LANGUAGE"

去除空格并转换为大写后,密钥为:ATUTORIALINTRODUCTIONTOTHECPROGRAMMINGLANGUAGE

明文(仅字母部分): SENDMORETROOPS

密钥文本(前 14 个字母): ATUTORIALINTRO

现在逐个计算密文字母:

位置明文密钥求和mod 26密文
1S18A01818S
2E4T192323X
3N13U20337H
4D3T192222W
5M12O14260A
6O14R17315F
7R17I82525Z
8E4A044E
9T19L11304E
10R17I82525Z
11O14N13271B
12O14T19337H
13P15R17326G
14S18O14326G

结果: SENDMORETROOPS 加密为 SXHWAFZEEZBHGG

加密后的消息看起来随机,与明文或密钥均无明显关联。按照传统五字母分组,传输形式为:SXHWA FZEEZ BHGG。

注意几个重要细节:

  • 第一个字母 S 加密后仍为 S,因为密钥字母 A 的值为 0(无位移)。这是一个已知弱点:密钥中的 A 会使明文保持不变。
  • 密文中字母 E 和 Z 多次出现,但每次代表不同的明文字母——这是多表替换密码的典型特征。

解密过程

解密时,接收方需要完全相同的密钥文本,并应用解密公式:P[i] = (C[i] - K[i] + 26) mod 26。

密文: SXHWAFZEEZBHGG

密钥文本: ATUTORIALINTRO

位置密文密钥C - K + 26mod 26明文
1S18A04418S
2X23T19304E
3H7U201313N
4W22T19293D
5A0O141212M
6F5R171414O
7Z25I84317R
8E4A0304E
9E4L111919T
10Z25I84317R
11B1N131414O
12H7T191414O
13G6R171515P
14G6O141818S

还原明文: SENDMORETROOPS

通信双方不仅须就书本达成一致,还须约定如何提取密钥字符:是否包含空格、标点、数字,还是只取字母字符。任何提取方式上的差异都会导致解密结果乱码。


流动密钥密码与书本密码

流动密钥密码与书本密码常被混淆,但两者在原理上截然不同:

流动密钥密码 — 一种替换密码。书本文字作为密钥,通过 tabula recta 对每个明文字母进行变换,输出为字母串。每个字符均遵从数学关系 C = (P + K) mod 26。书本文字与明文等长,加密以字母为单位逐一进行。

书本密码 — 一种代码系统。书本充当密码本,明文中的每个词通过其在书中的位置表示:页码、行号和词号。输出为一系列数字三元组(例如,"42-7-3"表示第 42 页第 7 行第 3 个词)。其中不涉及任何数学变换——书本是整词的查找表。

方面流动密钥密码书本密码
加密单位单个字母完整单词
输出格式字母(或 0-25 的数字)位置引用(页-行-词)
数学运算通过 tabula recta 进行模运算加法无数学运算——位置查找
密钥用法书本文字作为逐字符密钥书本作为词位密码本
弱点基于语言统计的拖拽破解攻击识别正确的书本版本
输出长度与明文相同(仅字母部分)可变(取决于词的位置)

一个实际后果:书本密码只能编码源书中出现的词汇。专有名词、技术术语或生僻词汇可能无法编码。流动密钥密码则无此限制——它对单个字母进行操作,可以加密任何字母文本。


流动密钥密码、维吉尼亚密码与自动密钥密码的比较

流动密钥密码属于多表替换密码家族,这一家族均使用 tabula recta 机制,但在密钥流的生成方式上各有不同。

维吉尼亚密码:使用一个短关键词(如"LEMON")循环重复。若密钥为 5 个字母、消息为 50 个字母,密钥重复 10 次。这种重复会产生周期性规律,卡西斯基检验和弗里德曼测试能够检测到,从而揭示密钥长度。一旦密钥长度已知,每个位置都可以通过频率分析当作简单的凯撒密码来求解。

自动密钥密码:使用一个初始关键词,然后将明文本身追加到密钥中。例如,以"QUEEN"为关键词、"ATTACKATDAWN"为明文,完整密钥变为"QUEENATTACKA"。密钥不再重复,但自动密钥有其自身的弱点:由于密钥部分由明文构成,对任意部分的已知明文攻击会同时揭露后续明文和密钥。

流动密钥密码:使用外部文本来源(书本段落)作为密钥。密钥永不重复且与明文无关。然而,明文和密钥都是具有相似统计特性的自然语言,这使得拖拽破解攻击成为可能。

特性维吉尼亚密码自动密钥密码流动密钥密码
密钥来源短关键词关键词 + 明文书本段落
密钥会重复吗?
卡西斯基攻击有效吗?
拖拽破解攻击有效吗?不需要可能有效主要攻击方式
密钥分发共享一个词共享一个词约定书本与起始位置
相对安全性最低中等中等偏高

如需动手对比,可同时试用我们的维吉尼亚密码工具自动密钥密码工具与流动密钥密码进行比较。


密码分析:拖拽破解攻击

拖拽破解攻击是破解流动密钥密码的主要方法。它利用的是明文和密钥均为自然语言文本、具有可预测统计特性这一事实。

拖拽破解的原理

攻击者猜测一个可能的明文词汇(即"拖拽词")——例如"THE"、"AND"、"THAT",或在军事背景下的"ATTACK"等领域专用词。然后将该拖拽词在密文的每个位置上"拖拽",利用解密公式逐一从密文中减去它。

如果拖拽词在某个位置上猜测正确,相减的结果就是对应的密钥文本片段。由于密钥也是英语文本,结果应该是可辨认的英语片段。若结果是乱码,则拖拽词在该位置猜测有误。

操作示例

假设我们截获了密文:SXHWAFZEEZBHGG

分析员在位置 1 尝试拖拽词"THE":

  • S (18) - T (19) + 26 = 25 → Z
  • X (23) - H (7) + 26 = 42 → mod 26 = 16 → Q
  • H (7) - E (4) + 26 = 29 → mod 26 = 3 → D

结果:"ZQD"——无法识别为英语,继续尝试。

在位置 5 尝试"THE":

  • A (0) - T (19) + 26 = 7 → H
  • F (5) - H (7) + 26 = 24 → Y
  • Z (25) - E (4) + 26 = 47 → mod 26 = 21 → V

结果:"HYV"——也不是英语。

在位置 1 尝试"SEND":

  • S (18) - S (18) + 26 = 26 → mod 26 = 0 → A
  • X (23) - E (4) + 26 = 45 → mod 26 = 19 → T
  • H (7) - N (13) + 26 = 20 → U
  • W (22) - D (3) + 26 = 45 → mod 26 = 19 → T

结果:"ATUT"——看起来像是"A TUTORIAL"的开头!拖拽词很可能正确。

分析员随即扩展假设。若密钥以"ATUTORIAL..."开头,他们可以解密更多位置,并验证明文是否继续有意义。这种在明文与密钥文本之间反复推演的过程最终能同时还原出两条信息流。

攻击奏效的原因

该攻击能够成功,是因为存在一个根本性的不对称性:能同时在明文和密钥两个流中产生可读英语的有效解密只有唯一一种。随机的拖拽词位置组合在密钥流中只会产生乱码。自然语言的统计独特性——字母频率分布、TH 和 HE 等常见双字母组合以及词汇结构规律——使得有效解密与无效解密之间易于区分。

这正是流动密钥密码无法达到一次性密码本安全水平的原因:一次性密码本使用真正的随机密钥,这意味着每个可能的明文出现的概率相等。拖拽破解攻击对随机密钥无从下手。


与一次性密码本的关联

流动密钥密码与一次性密码本共用同一数学公式,唯一的区别在于密钥的来源:

  • 流动密钥密码:密钥是来自书本的自然语言文本
  • 一次性密码本:密钥是真正随机的字符序列

正是这一差异,将一个可被破解的密码(流动密钥密码)与一个数学上被证明无法破解的密码(一次性密码本)区分开来。克劳德·香农(Claude Shannon)于 1949 年证明,若密钥真正随机、长度至少与消息等长且从不重复使用,密码可达到"完美保密性"——密文完全不透露任何关于明文的信息。

流动密钥密码未能实现完美保密性,因为书本文字并非随机。英语文本的熵约为每字符 1.0-1.5 比特,而真正随机的 26 字母字母表的熵为每字符 4.7 比特。密钥实际熵与理论最大值之间的差距,正是拖拽破解攻击所利用的信息量。

从历史角度来看,流动密钥密码可以理解为一种实用的折中方案。对于大多数 19 世纪和 20 世纪初的通信者而言,生成和分发足够长度的真随机密钥在后勤上并不可行。书本文字提供了一种"足够好"的近似:足够长、不重复,且双方无需传递密钥即可独立获取。代价是安全性有所降低,但密钥管理则大大简化。

如需探索一次性密码本的概念,欢迎试用我们的 Vernam 密码工具,它实现了一次性密码本的二进制异或(XOR)版本。


历史背景

早期发展

多表替换的概念可追溯至 15 至 16 世纪。约翰内斯·特里特米乌斯(Johannes Trithemius)于 1508 年在其著作《Polygraphia》中描述了 tabula recta。布莱兹·德·维吉尼亚(Blaise de Vigenère)于 1586 年在《Traicté des Chiffres》中进一步发展了这些思想。然而,将长段文本系统性地用作流动密钥的做法,则是数百年后才出现的。

法国数学家**阿瑟·约瑟夫·赫尔曼(Arthur Joseph Hermann)**于 1892 年正式提出了流动密钥密码的概念,描述了如何将已出版的文本作为不重复的多表替换密钥。他的工作同时认识到这种方法的优势(消除密钥重复)与局限性(密钥中的自然语言统计特性)。

威廉·弗里德曼的密码分析

威廉·弗里德曼(William Friedman)(1891—1969),被誉为美国密码分析学之父,在 20 世纪 20 至 30 年代就职于美国陆军信号情报局期间,系统地发展了攻击流动密钥密码的方法。

弗里德曼的方法将可能词汇测试与高频双字母组合分析相结合。他认识到,当明文和密钥均为英语时,所得密文的字母频率分布会以可预测的方式偏离均匀分布。他利用这些偏差的技术为现代计算密码分析奠定了基础。

弗里德曼对流动密钥密码的研究,直接推动了人们对随机性对于安全加密不可或缺这一原理的理论认识——这一原理后来由克劳德·香农在其 1949 年的里程碑式论文《保密系统的通信理论》中从数学上正式确立。

二战与冷战时期

第二次世界大战期间,由于已有更安全的替代方案可用,流动密钥密码在军事领域的使用十分有限:德国使用恩尼格玛机,美国使用 SIGABA,各方还有多种一次性密码本系统。然而,情报人员和地下抵抗网络有时会使用流动密钥密码,因为它只需要一本随处可得的书即可操作,无需任何设备。

冷战时期,流动密钥的概念影响了更复杂的手工密码系统的设计。例如,苏联的 VIC 密码使用的是记忆中的一个短语而非书本段落,但应用了相同的原理——从预先约定的文本来源中派生出一条长密钥。VIC 密码还增加了简单流动密钥密码所不具备的置换层。


常见问题

用作流动密钥的最佳书目是什么?

最佳选择是收发双方都能获取同一版本、包含连续散文(而非诗歌、表格或列表)、且不容易被对手率先测试的书籍。历史上,技术手册、行业出版物和年鉴因为不大可能出现在攻击者的候选书单上,反而比知名小说更受青睐。具体版次非常重要——不同印次的页码排版可能不同。

流动密钥密码可以使用任何文本作为密钥吗?

是的,任何文本都可以作为密钥:书籍、报纸、信件、技术文档、歌词,甚至是随机文本。但安全性因文本而异。随机文本提供最高安全性(接近一次性密码本水平),而重复性或程式化的文本(如含有反复短语的法律文书或宗教文本)由于存在可预测规律,安全性较低。密钥文本的长度必须至少与明文消息等长。

破解一条流动密钥密码需要多长时间?

利用现代计算机,若已知所使用的书目,可通过对候选文本库进行自动化拖拽破解,在几分钟到几小时内破解流动密钥密码。若不知道所用书目,则需要更长时间,但对于中等长度(50 个字符以上)的消息仍是可行的。极短的消息(不足 20 个字符)由于统计数据不足,实际上可能无法破解;而很长的消息反而更容易破解,因为它们提供了更多可供统计分析的数据。

流动密钥密码今天还在使用吗?

流动密钥密码如今不用于真正的安全通信。AES-256 和 ChaCha20 等现代加密算法在密钥管理更为简单的同时,提供了远优于前者的安全性。然而,流动密钥密码在教育、密码竞赛、地理寻宝挑战以及理解密码学历史演进方面仍具有重要价值。它为说明密钥随机性对安全性的重要意义提供了极佳的实践示范。

如果密钥文本比消息短怎么办?

若密钥文本短于消息,有两种处理方式:(1)延续到源文本的下一页、下一章或下一节来扩展密钥;(2)从头循环复用密钥。方式二实际上将流动密钥密码重新变回了一种具有超长密钥的维吉尼亚密码,重新引入了周期性弱点——不过较长的周期使得攻击难度远高于短关键词的情形。强烈推荐方式一。

流动密钥密码可以处理数字或特殊字符吗?

经典流动密钥密码仅对 26 个英文字母进行操作。数字、空格和特殊字符在加密前通常会从明文和密钥中一并去除。然而,底层模运算可以扩展到更大的字符集。如果对 256 个 ASCII 字符集应用流动密钥密码,则使用 mod 256 而非 mod 26,包含数字和标点符号的密钥文本也会完整参与加密运算。

关于本文

本文是我们综合 运行密钥密码 教程系列的一部分。继续了解古典密码学,并探索我们的交互式密码工具。

试用 运行密钥密码 工具

通过我们的交互式运行密钥密码工具,将所学知识付诸实践。

试用 运行密钥密码 工具