密钥密码学(一)(3)

简介: 密钥密码学(一)

密钥密码学(一)(2)https://developer.aliyun.com/article/1508650

5.3 代号书

从 15 世纪到 18 世纪,替代密码的国王是代号书,被国王、教皇、外交官和间谍们广泛使用。每个代号书都有数百甚至数千个项目的列表,单个字母、数字、双字母、音节、单词和名称,为每个提供多达 25 个替代品。代号书更像是代码而不是密码,因此不在本书的范围之内。

5.4 多字母替换

解决简单替换的技术涉及字母频率和字母接触。如果要设计一个密码来抵御这种攻击,一个好的起点是破坏字母频率和字母接触。

假设不是使用相同的字母表对每个字母进行加密,而是使用两个不同的字母表。使用第一个字母表对奇数位置的字母进行加密,并使用第二个字母表对偶数位置的字母进行加密。也就是说,第一个字母表将加密消息中的第一个、第三、第五…个字母,而第二个字母表用于加密第二、第四、第六…个字母。

现在,密文字母的频率一半来自第一个字母表,一半来自第二个字母表。它们是两组频率的平均值。一个密文字母只有在它同时代表两个字母表中的高频字母时才会有高频率。例如,密文K可能代表第一个字母表中的 E,代表第二个字母表中的 A,因此其频率将介于正常文本中 E 的频率和 A 的频率之间。

相反,密文中的一个字母只有在它同时代表两个字母表中的低频字母时才会有低频率,比如第一个字母表中的 K 和第二个字母表中的 V。因此,密文中的高频字母和低频字母会比正常文本少。如果你制作一个字母频率的柱状图,或者直方图,峰值会更低,谷值会更浅。因此,使用两个字母表会使频率计数变得更平坦。

联系频率也会发生同样的情况。任何常见的二字母组合,比如 TH,大约一半时间会在消息中的奇数位置开始,另一半时间会在偶数位置开始。一半时间,T 会与第一个字母表一起加密,而 H 会与第二个字母表一起加密,另一半时间则相反。因此,联系频率也会变得更平坦。

使用的字母表越多,频率就变得越平坦。实际上,从大约美国内战到第一次世界大战期间,使用大约 20 个字母表是很典型的。有一个统计测试可以测量字母频率的平坦度,并使用它来估计字母表的数量,但它不太准确,特别是对于超过 10 个字母表的情况。更好的方法在 5.6 和 5.7 节中描述。

让我们来看看多表密码的历史发展。多表密码的早期形式由利昂·巴蒂斯塔·阿尔贝蒂(Leon Battista Alberti)于 1467 年和约翰内斯·特里西米乌斯(Johannes Trithemius)于 1499 年开发(但直到 1606 年才发表)。多表密码在 1553 年出版的La cifra del Sig. Giovan Battista Belaso一书中开始采用现代形式。

5.5 贝拉索密码

由乔凡·巴蒂斯塔·贝拉索(Giovan Battista Belaso)于 1553 年发明的贝拉索密码使用了 26 个不同的字母表,每个字母表只是标准字母表移位了一定数量的位置。这 26 个密码字母表可以显示为一个表格,其中每个水平行包含一个移位后的字母表,就像这样:


每行的第一个字母标识字母表,所以顶行是 A 字母表,第二行是 B 字母表,依此类推。Belaso 是第一个使用密钥选择消息中哪个字母使用哪个字母表的人。(相比之下,Argenti 家族使用关键字来混合字母表。)Belaso 会水平书写消息。在明文字母的上方,他会重复写入所需次数的密钥。要加密一个字母,他会在表格的顶行找到该字母,使用密钥字母选择表格的行,并将明文字母替换为所选行中直接位于它下面的密文字母。以下是如何使用密钥字母 C 对明文字母 S 进行加密的示例:


我们在表格的顶行找到了字母 S。它的密钥是 C,因此使用表格的第三行进行加密。在第三行,直接在 S 下面,我们找到了字母 U。所以 S 被替换为U

使用前述表格,使用密钥 CAB 对单词 SAMPLE 进行加密,S 被替换为U


消息中的下一个字母是 A,使用 A 作为密钥,所以 A 使用顶行进行加密。它被加密成A。样本中的 M 使用密钥 B,它使用第二行加密,变成了N,依此类推。最终的密文是UANRLF

与使用表格不同,可以使用St. Cyr slide进行加密,该幻灯片以法国圣西尔军校命名。幻灯片在 M 位置显示。


你可以用木头、硬纸板或塑料制作自己的幻灯片。顶部的双宽行固定在原位,而单宽底行滑动。橡皮筋可以使其保持紧绷并处于正确位置。两个字母表中的一个或两个都可以混合。

Belaso 密码是对称的,因为使用密钥 K 加密字母 X 与使用密钥 X 加密字母 K 完全相同。基于将密钥添加到明文或使用异或运算密钥和明文的密码在这个意义上倾向于是对称的。

由于我无法理解的原因,Belaso 密码现在被称为Vigenère Cipher,而由 Blaise de Vigenère 发明的密码,描述在 5.8.2 节中,现在称为Autokey密码。为了给予应有的认可,我将继续称由 Belaso 发明,使用标准字母表的密码为 Belaso 密码。使用混合字母表的密码我将称之为 Vigenère 密码。我将由 Vigenère 发明的自密钥密码称为Vigenère Autokey

将 Belaso 密码归因于维吉尼亚密码是斯蒂格勒命名法则的一个例子,斯蒂芬·M·斯蒂格勒认为,没有重要的科学发现是以其发现者命名的。一些密码学的例子包括由查尔斯·韦斯顿发明的 Playfair 密码和由阿尔弗雷德·维尔发明的摩尔斯电码。斯蒂格勒法则本身是由罗伯特·K·默顿提出的,他将其命名为马太效应,以纪念圣马太。

5.6 卡西斯基方法

300 多年来,Belaso 密码被认为是无法破解的。法国人称之为Le Chiffre Indéchiffrable,即无法破译的密码。转折点出现在 1863 年,当时普鲁士步兵军官弗里德里希·W·卡西斯基少校出版了一本详细介绍如何确定多表密码周期的书。这就是现在所称的卡西斯基方法卡西斯基测试。有证据表明查尔斯·巴贝奇可能在 1846 年使用了这种方法,但没有公开发表。丹麦技术大学的奥勒·伊曼纽尔·弗兰克森,他对巴贝奇及其差分机写了大量文章,写了一本名为巴贝奇先生的秘密的书,提出了这一说法。

这个想法是在密文中寻找重复的字母序列。一些序列可能是偶然发生的,尤其是双字母组,但大多数重复序列将是由明文中相同字母被密钥的相同部分加密产生的。重复序列越长,发生偶然性的概率就越低。如果同一密钥部分用于加密两个重复的字母序列,那么它们之间的距离必须是密钥长度的倍数。距离是从一个出现的第一个字符到另一个出现的第一个字符的距离。考虑使用关键词 EXAMPLE 的密码片段。


密文三字母组PTR出现了 3 次,分别在位置 5、12 和 33。所有这三次出现都是由明文 AIN 用密钥字符 PLE 加密产生的。也就是说,它们都是由相同的明文三字母组用密钥的相同部分加密产生的。

明文三字母组 AIN,从位置 21 开始,产生了不同的密文三字母组EMK,因为它是由不同部分的密钥 EEX 加密的。同样,明文三字母组 THE,在位置 1 和 29 出现,以及明文三字母组 INS,在位置 8 和 13 出现,不会产生重复的密文三字母组,因为它们是用密钥的不同部分加密的。

在这个片段中,重复的三字母组之间的距离为 12-5 = 7,33-5 = 28 和 33-12 = 21。这些距离,7、21 和 28,都是 7 的倍数,而 7 是关键词 EXAMPLE 的长度。卡西斯基展示了如何利用这些重复来揭示加密的周期。

让我们看另一个例子,一个密码。


这是一段普通英语文本的贝拉索加密。在搜索重复的字母序列时,我们发现EK位于位置 10、64 和 90,RYR位于位置 17 和 53,等等。重复字母序列的完整列表是:


我们立即注意到两个重复的四元组YHCIYXYR。重复的四元组几乎不会出现偶然。两个YHCI出现之间的距离是 79-43 = 36,而两个YXYR出现之间的距离是 69-57 = 12。距离 12 和 36 暗示着密钥长度为 4、6 或 12。我们可以通过查看一些其他重复序列来缩小范围。

RYR的距离为 36,ZHZ的距离为 6。另外两个重复的三元组HCIXYR只是两个重复的四元组YHCIYXYR的一部分,所以它们不提供额外的信息。这个密码的最可能周期是 6。

好吧,这太容易了。让我们看看在更困难的情况下会发生什么。其他书籍推荐的一种方法是取所有重复序列之间的距离,并找出它们的所有因数。他们声称,最频繁的因子将是周期。例如,如果距离是 36,那么因子是 1、2、3、4、6、9、12、18 和 36。这可能会以几种方式误导你。

首先,你可能会错误地得出周期是其实际值的两倍。这是因为大约一半的距离仅仅是偶然的。有效距离的一半,即由重复的明文序列引起的距离,将是周期的偶数倍。对于某些消息来说,这些周期的偶数倍将超过那些周期的奇数倍的距离。同样,一半的偶然重复的密文序列将有偶数的距离。可能会出现许多偶然的距离。同样,1/3 的距离会偶然成为 3 的倍数。

当你计算距离的因数数量时,你应该将因子 2 出现的次数减少 1/2,将因子 3 出现的次数减少 1/3,依此类推。这样会给你一个更准确的比较。例如,如果距离 3 出现了 6 次,那么将其减少 1/3 到 4 次,因为这 6 次中有 2 次很可能是纯粹的偶然。

第二,当重复的序列出现多次时,这些重复之间的距离可能会误导人。如果有 N 个重复,则对这些重复的成对数量为 N(N-1)/2。在示例密文中,有 4 个YR的出现,因此有 6 对,即 4×3/2 对。因此,有 6 个成对的距离,54-18 = 36,59-18 = 41,71-18 = 53,59-54 = 5,71-54 = 17 和 71-59 = 12。这些中的哪一个,如果有的话,是周期的倍数?假设密文XYZ出现了 5 次,其中有 3 次重复是由相同的明文造成的。将会有 10 个距离,其中只有 3 个是由重复的明文造成的,而其他 7 个是虚假的。

你不想因为无法区分有效重复和偶然重复而将其抛弃。你可以做以下事情。假设你有一个周期候选者。例如,假设你怀疑周期是 6。将重复序列出现的位置减去 6 的模数。(还记得模数算术吗?如果不记得,再看一下第 3.5 节。)

让我们尝试一下模数法。再次看看YR的 4 次出现,并将它们的位置减去 5、减去 6 和减去 7,看看会发生什么。


所有 4 个模 7 余数都不同。如果周期是 7,那么YR的所有重复都是偶然的。模 5 余数只有 2 个相等。如果周期是 5,那么 4 次出现中只有 2 次来自重复的明文。但是如果周期是 6,那么我们现在看到YR的 4 次出现来自明文中的 2 个不同的重复双字母组,一个双字母组在明文的位置 18 和 54 处,距离为 36,另一个双字母组在明文的位置 59 和 71 处,距离为 12。

那是怎么发生的?回顾一下重复序列的列表。你可以看到重复的双字母组YR在重复的三字母组RYR和重复的四字母组YXYR中出现。每个重复都贡献了一个重复。

让我们看看第二种确定多表密码周期的方法。如果重复序列的证据不足以得出结论,那么有备用计划是很好的。

5.7 巧合指数

巧合指数由美国密码分析专家威廉·F·弗里德曼于 1922 年发明。这个想法非常简单,但其重要性深远。想象一下,使用多表密码编写了两条消息,但使用了不同的密钥,可能还有不同的周期。如果逐字比较两个密文,两个对应字母相同的概率是 26 分之 1,约为 0.0385。如果两条消息都是 52 个字符长,你期望有 52/26=2 对相应字母相等。在这里,我使用密钥分别为火星和金星的 Belaso 密码编写了 52 字母的明文“春日少年的幻想变成了棒球”。两个相同的字母已经被突出显示。(两对相同字母都是 F 纯属偶然。)


现在想象一下两条消息被同一个密钥加密。每对相应的字母都被相同的密钥字符加密,所以如果明文字母相同,那么密文字母也将相同。A 的频率约为 0.08,所以明文字母都是 A 的概率为 0.08²,约为 0.0064。它们都是 B 的概率约为 0.015² = 0.000225,依此类推通过字母表。所有 26 个字母的总和约为 0.0645 到 0.0675,约为 1/15,取决于你使用的字母频率表。当使用相同密钥时,两个相应的密码文字母相等的机会大约是 1/15,比不同密钥时的 1/26 机会高出约 73%。

这个事实可以被利用来确定多表密码的密钥长度。让我们给密文中的字符编号为 C[1]、C[2]、C[3],…,并且让密钥的长度为 L。我们可以将密文中的字符与同一字符移动了一定数量的位置后的字符进行比较,比如移动了 S 个位置。也就是说,我们将 C[1] 与 C[1+S]、C[2] 与 C[2+S]、C[3] 与 C[3+S] 进行比较,依此类推。

当移位 S 是 L 的倍数时,对于每个位置 i,C[i] 就会被与 C[i+S] 相同的字母表进行加密,因此两个相应的密码文字符相等的机会是 1/15。如果移位不是 L 的倍数,则相应的字符将不会被相同的字母表进行加密,它们相等的机会只有 1/26。当 S = L,S = 2L 时,相等字符的数量应该最多。尝试几种不同的移位应该能够清晰地显示这种模式。产生最多匹配的移位通常会是周期的倍数。

尝试许多不同的移位听起来像是计算机的工作,但实际上可以手动完成而不需要太多的努力。将密码文写在两张长条纸上。然后将一条纸滑动到另一条上,并计算每次移位时相等字符的数量。你需要均匀地间隔字母以便正确对齐。这很容易通过使用格子纸或者在写字时在每条纸旁边放置尺子来实现。


相关性指数还有另一种用途,对于密码分析师来说非常有价值。它可以检测出两条消息是否使用相同的密钥进行了加密。想象一下,艾米莉正在使用一个机器密码,它生成一个具有非常长周期的多表密码,比如说 100,000。作为对比,德国军队在第二次世界大战中使用的恩尼格玛机的周期是 26×25×26 = 16,900。假设你有数千条拦截到的消息。每条消息都使用了这个长密钥的一部分进行了加密。将每条消息与其他消息进行比较,并使用相关性指数和重复的密码文序列,你可以检测出被同一密钥部分加密的不同消息段落。

当你找到足够多重叠的密钥片段时,你可以开始将这些片段拼接在一起,以获得更长的片段。一旦找到足够多使用相同密钥片段加密的消息,你就可以开始通过通常的方法解读这些消息,比如字母频率、字母组合频率、识别常见词等。

5.8 再次关于巧合指数

还有另一种估算多表密码周期的方法,也称为巧合指数,同样由威廉·F·弗里德曼提出。这种方法计算了当有 2 个字母表、3 个字母表等时,两个字母相等的概率。这些概率提前计算并保存在表中。其思想是计算给定消息的相同统计数据,并将该数字与表格进行比较。最接近的匹配应该是密码的周期。在实践中,这种方法通常很接近,但通常会偏离 1、2 或 3。当周期超过 10 时,该方法无效。这种方法不比随机猜测好多少,因此没有必要解释细节。

Belaso 和 Vigenère 密码在 1880 年代仍然被广泛使用。随着 Kasiski 方法的知名度逐渐增加,它们的使用减少了,并且在巧合指数发布后基本消失了。然而,直到今天,它仍然是最受欢迎的业余密码之一。有好几次,当我告诉人们我正在写一本关于密码学的书时,他们会告诉我他们知道一种无法破解的密码。这总是指 Belaso 密码,他们称之为 Vigenère。然后我不得不证明它是可以被破解的,通过解读他们编造的密码。这些密码被搞得一团糟,以至于我不得不创建一个网页 mastersoftware.biz/vigenere.htm 来确保密码的正确性。

5.9 解密多表密码

一旦你使用 Kasiski 方法或巧合指数法找到周期,下一步就是解读各个字母。首先让我们看一下最简单的情况,即 Belaso 密码。

5.9.1 解密 Belaso 密码

使用 Belaso 密码,所有替换字母表都只是标准字母表按一定数量的位移。确定这个数量,你就解开了密码。第一步是将使用每个密钥字母加密的字符分开。让我们再次看一下第 5.5 节中的示例。由于我们已经确定周期是 6,让我们将密文写成 6 个一组。


这些组中的每个字母的第一个字母都已经用密钥的第一个字母加密,每个组中的第二个字母都由密钥的第二个字母加密,依此类推。如果我们将密文垂直地写在 6 列中,就像这样


那么第一列字母将用密钥的第一个字母加密,第二列字母将用第二个密钥字母加密,依此类推。

分别考虑每个字母列。每列都将具有正常的英文字母频率,但根据其密钥字母进行了偏移。如果我们能够确定偏移量,那么我们就解密了密码。我将描述两种方法,一种是手工解决方案,一种是计算机解决方案。我们先看看纸和铅笔的方法。

对于每一列,我们可以进行频率统计。这将给我们 26 个数字。对于纸和铅笔解决方案,最好将频率显示为直方图(条形图)。密文的第一列直方图将是


只有 18 个字母,这相当稀疏,但已足够。让我们将其与标准英文字母频率的直方图进行比较,接下来显示,并尝试找出偏移量。


这个频率分布的一些视觉特征是(1)E 是远远最高的峰值;(2)有三个均匀间隔为 4 列的峰,即 A,E,I,其中 I 有伴随 H;(3)在 N,O 有双峰;(4)在 R,S,T 有三重峰。

让我们尝试将这个直方图与密文直方图匹配。我们首先寻找一个可能代表 E 的高峰。有两个高峰,RY,分别对应密钥字母 N 和 U。也就是说,如果 E 被 N 加密,则结果是 R,如果 E 被 U 加密,则结果是 Y

接下来,让我们寻找间隔为 4 个空格的 3 个峰。有两个候选者,G,K,ON,R,V,分别对应密钥字母 G 和 N。双峰呢?可能的候选者是 N,OY,Z,分别对应密钥字母 A 和 L。三重峰呢?只有一个选择,X,Y,Z 的三重峰。这对应于密钥字母 G。

第一列最可能的密钥是 G,它产生A,E,I峰和R,S,T三重峰。第二可能的密钥是 N,它使得 E 成为最常见的字母,并且有N,O双峰。

让我们把注意力转向密文的第二列。字母频率直方图是


这次密文字母 S 引起了我们的注意。如果 S 代表明文 E,则密钥必须是 O。让我们通过比较密文直方图和偏移字母表来检查这一点。


你可以看到密文中所有高频字母,即 CGHS,分别对应于高频明文字母,即 O,S,T 和 E。这是一个很好的匹配,第二个密钥字母很可能是 O。关键词以 GO 开始。

另外 4 个关键字母的确定方式相同。关键词是 GOVERN,明文是 THE LEGISLATURE SHALL BE DIVIDED INTO TWO CHAMBERS THE UPPER CALLED THE SENATE AND THE LOWER IS THE HOUSE OF REPRESENTATIVES。

这就是手动方法:通过使用直方图使频率分布可视化,然后通过目视匹配分布。对于计算机解决方案,我们需要一种数值方法来目测分布以找到匹配项。在每本讨论多字母密码的书籍中都可以找到的标准方法是使用相关系数,具体来说是 Pearson 积差相关系数,以 Karl Pearson,现代统计学的创始人命名。

如果你懂统计学,这会很熟悉。毫无疑问,你已经有一个带有此功能的统计软件包。好好使用它。对于其他人,我将向你展示一种更简单、更快速——而且准确无误的方法。

当我们通过目视将两个频率分布进行匹配时,我们试图将一个直方图中最高的峰与另一个直方图中最高的峰进行匹配。如果我们将它们的高度相乘,我们试图获得最大的乘积。如果你沿着字母表向下走,并添加 26 个乘积,那么当高峰与另一个高峰对齐时,总和将最高,当最高峰与最低谷对齐时,总和将最低。

这就是想法。尝试 26 种可能的移位。将密文的字母频率与标准英语的移位频率对齐,并加总 26 个乘积。最高总和将指示最有可能的移位。这告诉你最可能的关键字母。第二高的总和是第二可能的移位,依此类推。我称这种技术为Tall Peaks方法。

Belaso 密码评级为 Two。

5.9.2 解密 Vigenère 密码

在 Belaso 之后大约 30 年,Blaise de Vigenère 对 Belaso 密码进行了两项改进。第一个是在表格的外部添加指南。这样做的效果是产生了一个混合字母表,而不需要混合表格。以下是一个示例,使用水平指南中的关键词 FIRST LOVE,以及垂直指南中的关键词 YOUTH。第二项改进,自动关键字,请参阅第 5.10 节。


要使用关键字 U 加密字母 B,找到左边或右边的行中的关键字 U,在列的顶部或底部的字母指南中找到明文字母 B。密文字母是 U 行和 B 列中的字母,即M。要解密,使用关键字找到行,找到该行上的密文字母,并从顶部或底部的字母指南中获取明文。

如果你是手动加密,我建议每 4 或 5 行和列绘制水平和垂直规则。或者,使用透明的塑料 L 型工具精确找到交点。

这是使用这种形式的维吉尼亚密码加密的样本消息。其周期为 5。


这种密码有一个严重的弱点。由于表中的每一行都是标准字母表移位了一些位置,因此每个密码字母表将与所有其他密码字母表移位了一些位置相同。您无法将密码字母表与标准字母表有用地比较,因为它们是按混合顺序排列的,但是,您可以通过直接比较密码字母表或使用 Tall Peaks 方法来确定移位。

下图显示了 5 个密码字母表的直方图,将它们移位以匹配它们的峰值和谷值。第一列(阴影)中的所有密文字母代表相同的明文字母。这意味着第一个字母表中的 S,第二个字母表中的 C 和第四个字母表中的 L 都代表相同的字母。将所有这些替换为 A。第二列中没有字母。在第三列中,第三个字母表中的 M 和第五个字母表中的 T 代表相同的明文字母。将所有这些替换为 C,依此类推。第 26 列中的密文字母将全部替换为 Z。


这将把密文转换为一个简单的替换,现在可以使用第 5.1 节的方法解决。维吉尼亚密码的评级为 Two。

5.9.3 解决一般多表密码

也可以使用表格来完成一般的多表密码。表格的行可以根据任何方案混合,彼此独立地进行。值得注意的是,行数不必与列数相同。对于计算机密码,将表格宽度设置为 256 个字符,深度设置为 512 行,以便每个密文字符在每列中出现两次。这将使已获得密文及其相应明文的对手难以确定密钥。以下是 100 行表格的部分示例:


该表将与数值键一起使用,其中 2 位小数将用于选择用于加密的行。20 位数字键将产生周期为 10 的多表密码。

解决一般多表密码与解决单表密码非常相似。您首先进行频率统计,并为每一列制作一个接触表。在这种情况下,列 C 的联系将在 C-1 和 C+1 列中,必要时从最右边的列绕到第一列。每列中的每个字母的出现次数会减少,因此您需要从较少的数据中进行推断。这需要很多经验来自的灵感猜测。

让我们从这个多表密码开始。


快速检查此密文显示两个长重复序列,位置分别为 13 和 93 的YSUZONSOO,以及位置分别为 39 和 124 的SNZYYZK。在这两种情况下,两次出现之间的距离是 5 的倍数,证实了周期为 5。这些长重复可能代表常见的单词或短语,或者是与消息主题相关的单词。

每个 5 个关键字母的联系图表如下。为了更容易解释推断,我将使用数字标记每个密文字母,指定其字母编号。所以C1表示字母C在字母表 1 中的密文字母(即使用密钥的第一个字母进行加密),H3表示字母H在字母表 3 中的密文字母(使用密钥的第三个字母),依此类推。

请记住,两边有许多不同接触的字母倾向于是元音,而具有较少不同接触的字母倾向于是辅音。


根据这些联系,我们可以暂时将G2K2O2P2H3K5识别为元音,将R1Z1K3N3D4S4O5识别为辅音。基于其高频率,S4可能代表明文 T。

您的操作步骤与简单替换一样。您更新联系图表以显示已被识别为元音和辅音的字母,并且还将带有标记的元音和辅音的密文写下。您使用这个来完善和修复元音/辅音的识别,并识别单个字母。

我不会重复 5.1 节中所采取的所有步骤。逻辑是相同的,但增量步骤更小,更多,需要更多的回溯。一般的多字母密码评定为三。

5.10 自动关键字

您可能还记得我在 5.9.2 节中提到维吉尼亚对贝拉索密码进行了两项改进。第一个改进是将指南放在表的边缘以产生混合字母表。第二个改进是自动关键字

自动关键字使用消息的明文作为密钥来加密消息的其余部分。早期版本是由意大利医生/数学家/占星家吉罗拉莫·卡尔达诺发明的。在卡尔达诺的系统中,每个字母都使用自身作为密钥进行加密。这仅在您拥有具有奇数字母的字母表时才有效。使用 26 个字母的英文字母表,A 会产生一个A,而 N 也会产生一个A,所以受信者必须弄清楚哪一个是指的。即使使用了奇数大小的字母表,卡尔达诺自动关键字也仅仅产生了简单的替换。

Vigenère 通过使用滞后改进了 Cardano 方法。Vigenère 使用一个字母密钥来加密第一个字母,使用第一个明文字母来加密第二个字母,使用第二个明文字母来加密第三个字母,依此类推。在现代实践中,使用关键词来加密第一组字母,然后使用该组明文字母来加密第二组字母,依此类推。这个例子使用了关键词 SAMPLE 和 Belaso 表,即未混合的字母表。


使用未混合的字母表,解密是直接的。在第 5.7 节中描述的重合指数可以用来确定关键词的长度。当密文偏移了密钥长度的倍数时,指数通常会显著增加,就像这样:


假设你已经发现关键词有 6 个字母。尝试字母表中的每个字母作为密钥的第一个字母。从 A 开始。由于第一个密文字母是 L,第一个明文字母也必须是 L。这也将是消息第 7 个字母的密钥。由于第 7 个密文字母是 X,第 7 个明文字母必须是 M。

按照这种方式进行,对于第一个密钥字母的每个猜测都会给出明文的第 1、7、13、19、25 和 31 个字符。也就是说,它会给出每 6 个明文字母。有 26 组字母,每个可能的密钥字母对应一组。这些 6 个字母的一些组会有正常的英文字母频率,一些则不太可能。对第二个密钥字母重复这个过程。对于第二个密钥字母的每个猜测都会给出明文的第 2、8、14、20、26 和 32 个字符。

现在,取出第 1、7、13 等 5 个字母的最有可能的选择,并将它们与第 2、8、14 等 5 个字母的最有可能的选择配对。这将给出 25 组双字母组合。其中一些可能性很高,一些则不太可能。取出其中最合理的 10 组,并将它们与第三个密钥字母的 5 个最可能的选择配对。这将给出 50 组三字母组合。选择其中最合理的 10 组,并将它们与第四个密钥字母的 5 个最佳选择配对。到这一步,一些明文单词将开始出现,正确的密钥字母选择将变得明显。

如果你是通过计算机进行这个过程,请跳过双字母组合。直接尝试前 3 个密钥字母的所有 26³种组合,然后直接进入三字母组合。然后对第 2、3 和 4 个密钥字母重复这个过程。前 3 个密钥字母和后 3 个密钥字母的最可能选择会有重叠。第三组和第四组密钥字母也会发生同样的情况。这将迅速缩小到正确的关键词。

使用标准字母表的 Vigenère 自动密钥被评为 Three。

5.11 运行密钥

运行密钥类似于自动密钥,但是不是使用一个简短的关键词或短语,而是使用一个密钥文本,它可能和消息本身一样长。运行密钥从未在实践中被广泛使用,因为它要求双方都完全正确地获得密钥文本。如果一方记住或复制了密钥为“MINE EYES HAVE SEEN THE GLORY OF THE COMING OF THE LORD”,而另一方记住了“MY EYES HAVE SEEN THE GLORY OF THE COMING OF THE LORD”,那么他们将无法进行通信。解决这个问题的一种方法是使用双方都有的印刷书籍中的密钥文本,尽管他们必须随身携带这本书。对于计算机通信来说,这不是问题,因为计算机可以存储成千上万本书籍。

假设使用标准的英文字母表构成的贝拉索表,运行密钥的解密方法虽然直截了当,但也很费力。有一种技巧,适用于自动密钥和运行密钥,就是猜测文本中可能出现的一个合适的单词。这个单词可能出现在密钥文本中,也可能出现在明文中。密码学家稍后需要解开这个谜。这个可能的单词,或者暗语,可能是一个常见的英文单词,比如 THE 或 AND,也可能是与疑似主题相关的词。例如,如果消息涉及贸易谈判,那么可能的单词可能是 TARIFF、SHIPPING、REPRESENTATIVE、BARGAINING 等。

思路是在消息中尝试可能的单词的所有可能位置。这被称为词拖拽。知道明文单词和相应的密文可以给你一个密钥的片段。如果单词放置正确,那么这个片段看起来就像正常的英语。可能的单词越长,你就越有信心它是正确的。一旦找到一个单词,你就尝试猜测字母,然后是文本中在它之前或之后的单词,以扩大漏洞。

还有一种技术,适用于计算机求解。这需要一个新的数学概念,叫做条件概率。这是事件 A 在事件 B 发生时发生的概率。单个事件 A 的概率用 P(A)表示,给定事件 B 发生的条件下事件 A 的条件概率用 P(A|B)表示。如果 AB 表示事件“A 和 B”,那么给定 B 的条件下 A 的条件概率是 P(A|B) = P(AB)/P(B)。这意味着 P(AB) = P(A|B)P(B)。

举个例子来帮助澄清这个问题。如果你掷两个标准骰子,掷出 12 的概率是 1/36。然而,如果你掷第一个骰子,结果是 6,那么掷出 12 的机会变成了 1/6。令 A 表示“掷出 12”,B 表示“第一次掷出 6”。那么 P(A) = 1/36,P(B) = 1/6。P(AB) 意味着第一次掷出 6 时掷出 12。P(AB) 也是 1/36,因为如果你掷出 12,第一次掷出的一定是 6。使用条件概率符号,P(A|B) = P(AB)/P(B) = (1/36)/(1/6) = 1/6。因此,当第一次掷出 6 时掷出 12 的条件概率是 1/6。

让我们使用条件概率来解密一个流动密钥密码。所需的工具是单个字母、二字母和三字母概率表。这些可以通过统计大量文本中的字母、二字母和三字母来编制。你可以在古腾堡计划网站 www.gutenberg.org 上找到许多这样的文本。选择明文选项。你也可以在互联网上找到一些统计表。

你需要为每个可能的二字母和三字母分配一个概率,而不仅仅是在那个文本中找到的。对于二字母组,这是显而易见的。如果 AB 是一个没有出现在计数中的二字母组,你可以设置 P(AB) = P(A)P(B),然而,我建议将其设置得更低,简单地因为 AB 从未被发现。我使用 P(AB) = P(A)P(B)/3。一旦你有了完整的二字母组概率集合,你可以通过将 P(ABC) 设置为 P(A)P(BC) 和 P(AB)P© 中较大的一个来扩展到三字母组。同样,我建议将它们设置得更低,因为三字母组 ABC 从未出现过。例如,将 P(ABC) 设置为 P(A)P(BC)/3 和 P(AB)P©/3 中较大的一个。这些人为的概率意味着所有二字母组和所有三字母组的总概率都大于 1。数学上来说这是无意义的,但它没有实际影响。

现在我们有了必要的工具,可以解决一个流动密钥密码。选择消息中的一个起始位置,比如 s,并尝试位置为 s,s+1,s+2 的所有可能的关键三字母组。查看相应的明文三字母组。将关键三字母组和文本三字母组的概率相乘以获得该位置的概率。保留这些位置中的前 10000 个,并丢弃其余的。对于每个选择的三字母组,尝试 s+3 位置的所有可能的关键字母,并查看相应的明文字母是什么。假设关键三字母组是 JKL,下一个关键字母是 M,相应的明文四字母组是 ABCD。您可以使用条件概率 P(KLM|KL) 来估计关键四字母组 JKLM 的概率,这是 M 跟在 KL 后面的概率。这是根据三字母组的概率计算出来的,如 P(KLM)/P(KL),这是三字母组 KLM 的概率除以二字母组 KL 的概率。因此,四字母组的概率被估计为 P(JKL)P(KLM|KL)。这对于关键四字母组和明文四字母组都是如此。

通过将关键四字母组和明文四字母组的概率相乘来估计这个位置的概率。同样,保留前 10,000 个,丢弃其余的。一直持续到解决方案变得明显为止。所有这些都可以由计算机完成,无需任何人的监督。

使用标准字母表的维吉尼亚运行密钥评为四级。

*5.12 模拟转子机

多表密码的必不可少之物是从 20 世纪 20 年代开始使用的电机械转子机。这些机器的周期可以达到数十亿或数万亿,或者如果转子的运动取决于明文或密文字符,则根本没有周期。从大约 1915 年到二战后,至少生产了 70 种不同类型的机器。有几个网站有这些机器的图片和描述。

每台机器都有一个或多个转子,通常为 3 到 6 个,但有时多达 10 个。每个转子执行简单的替换。在每个字母被加密后,一些转子会转动,以便下一个字母使用不同的替换。各种齿轮、凸缘、凸轮、杠杆和棘轮的系统使得转子以不可预测的方式转动。也就是说,对于你的对手来说是不可预测的。


如果我们用数字替换字母表中的字母,描述转子机器会更容易。对于机械转子机器,每个转子有 26 个位置对应于字母表的 26 个字母,我们用数字代替 A 为 0,B 为 1,C 为 2,直到 Z,其被 25 代替。换句话说,我们使用经典的数字系统减去 1。对于计算机模拟,我们使用 8 位字节,并用一些标准化系统(如 UTF-8 编码)中的数字代码替换字符。在这个系统中,A 是 65,B 是 66,C 是 67,直到 Z,其为 90。其他字符,如小写字母、数字和标点符号,也被它们的 UTF-8 字符代码替换。

既然我们在处理数字,我们可以对它们进行算术运算,例如加法和取模 26 或 256 的余数,视情况而定。如果你想复习模数算术,请参考第 3.6 节。

生产了多达 16 个转子的密码机。这是俄罗斯制造的菲阿尔卡机器的 10 个转子组件,它从 1956 年直到 1990 年代被华沙条约国家使用。照片由保罗·哈德森提供,并根据 CC BY 2.0 许可证授权。


5.12.1 单转子机

让我们从一个单独的机械转子开始。转子执行简单的替换,因此可以通过替换表 S 进行模拟。表 S 只是一个乱序的字母表,就像一个表的一行。列表中的条目从 0 到 25 编号,对应于字母表的 26 个字母。替换表中的第 N 个条目,表示为 S(N),是字母表的第 N 个字母的替换。因此,S(0) 是 A 的替换,S(1) 是 B 的替换,依此类推。

当转子转动时,它们会改变位置。位置可以用一个数字 P 来表示,它的范围是从 0 到 25。当一个转子转动了 26 个位置时,它会回到起始位置,即位置 0。当转子处于位置 P 时,第 N 个字母的替代是 S(N+P)。因此,当转子处于位置 5 时,S(5) 是 A 的替代,S(6) 是 B 的替代,依此类推。我们理解 N+P 会循环,所以 S(26) 和 S(0) 是相同的,S(27) 和 S(1) 是相同的,依此类推。换句话说,N+P 实际上是 (N+P) mod 26 的简写。

在机械转子机器中,每个字母加密后,转子的转动量不同。这种不规则的运动可以通过使用一个 步数序列 来模拟,比如 (a,b,c,d,e)。在第一个周期,转子向前推进 a 个位置。在第二个周期,它向前推进 b 个位置,依此类推。第六个周期序列重复。因此,如果转子从位置 P 开始,经过一个周期后,它将处于位置 P+a。经过两个周期后,它将处于位置 P+a+b。经过 5 个周期后,它将处于位置 P+a+b+c+d+e。经过 6 个周期后,转子将处于位置 P+2a+b+c+d+e。在机械设备中,每个转子通常只转动几个位置,通常是 0 或 1 个位置,具体取决于特定凸轮的位置是上还是下。在计算机模拟中,我们没有这样的限制。在模拟机械转子时,步数可以是从 0 到 25 个位置,或者使用 8 位字节来表示字符时,可以是从 0 到 255 个位置。

由于我们选择了 5 步的密钥,这台单转子机器将在 5×26 = 130 个周期后重复。当 a+b+c+d+e 是偶数时,机器将在 65 个周期后重复,如果 a+b+c+d+e 是 13 的倍数,机器将在仅 10 个周期后重复。显然,一个转子不能提供太多安全性。单转子机器密码被评为 Three。

5.12.2 三转子机器

让我们来看看如何模拟一种更实用的转子机器。这台机器有 3 个转子,使用 8 位 UTF-8 代码。三个转子需要 3 个替换表,S[1]、S[2] 和 S[3]。当转子处于位置 P[1]、P[2] 和 P[3] 时,字母表的第 N 个字母被加密为 S3+P[2])+P[3])。

每个 3 个替换表都有自己的步骤列表:假设 S[1] 有步骤 (a[1],a[2],a[3],…,a[i]),S[2] 有步骤 (b[1],b[2],b[3],…,b[j]),而 S[3] 有步骤 (c[1],c[2],c[3],…,c[k])。如果每个转子的步数之和是奇数,并且 i、j 和 k 是互质的,那么该机器的周期是 256ijk。例如,如果 i = 10,j = 11,k = 13,则 ijk 为 1430,周期为 1430×256 = 366,080。效果就像是有一个多表代换密码,其表格有 366,080 行,每个周期只使用一次每行。

假设已知三个替换表和步骤序列,例如,假设它们已经在一个大型网络上标准化。一个可能想象的是,艾米丽只需要尝试 256³ = 1.67×10⁷个初始转子设置就能破解每个消息。这可能在当前的个人电脑上只需要几秒钟。这是误导性的。

考虑机器的两种不同状态。两个状态的转子处于相同的位置,但它们处于步进序列的不同部分。从这两个状态开始加密将会产生不同的密码字母序列,因此相同的消息将会被加密成不同的样子。通过穷举搜索来破解此密码将需要尝试所有可能的转子设置和步骤序列中的所有可能位置,总共为 256³×1430,或 2.40×10¹⁰个情况。这仍然可以使用个人电脑来完成,但需要几个小时,而不是几秒钟。

对于已知转子和已知步骤序列,这个三转子密码的等级是 Four。

如果转子和步骤序列是保密的,那么艾米丽必须回到一般多表密码的技术上,即收集大量拦截并将它们匹配起来找出使用相同设置加密的部分。为了区分真实匹配和偶然匹配,需要对长重叠进行重合指数测试(第 5.7 节)。建议至少 200 个字符。匹配应仅尝试长于 200 个字符的消息。对于长度为 L 个字符的消息,其中 L ≥ 200,可匹配位置的数量为 L-199。当所有拦截消息的可匹配位置的组合总数 M 超过√2.40×10¹⁰ = 1.55×10⁵时,可以开始检测文本部分的匹配。

这似乎不算什么,但是检测这些重叠的工作是按 M²量级的。此外,单个重叠远远不够。你需要足够的重叠,以便开始区分高频字母,并将元音与辅音分开。这将需要一台大型机和一些有才华的密码分析员。未知转子和未知步骤序列的三转子机的等级是 Six。

5.12.3 八转子机器

三个转子是一个很好的开始。为了真正提高模拟转子机的强度,让我们将转子的数量从 3 增加到 8。让转子的步数为 11、13、17、19、23、25、27 和 31,按某种顺序,并且使每个转子的步数总和为奇数。这台机器的周期约为 5.69×10¹²。

如果这是一个硬件设备,转子的内部布线和步骤序列可能已经内置。即使是这种情况,也不可能像我们在 3 转子版本中那样匹配消息。这是因为现在有 256⁸ = 1.84×10¹⁹个 8 个转子的可能初始位置。由于周期为 5.69×10¹²,机器的总状态数变为(1.84×10¹⁹)×(5.69×10¹²) = 1.05×10³²。当转子和步进序列无法更改时,这个 8 转子机器被评为九级。

让我们再深入一点。假设我们有 16 个可能的转子供应。对于每个消息,我们以某种顺序选择其中的 8 个转子。有 5.19×10⁸种这样的排列。对于每种排列,有 1.84×10¹⁹个可能的初始转子位置和 5.69×10¹²个步进序列位置,总共有 5.43×10⁴⁰个状态。

即使艾米丽以某种方式知道所有 16 个转子的替换表和步进序列,使用这台机器加密的消息也不可能被破解,即使使用世界上最大最快的超级计算机也不行。(目前世界上最快的超级计算机是 Summit 计算机,最高可达 200 petaflops。)这个 8 转子密码被评为十级。

如果替换表和步进序列的内容保密,或者经常更改,这个具有 8 个可互换转子的转子密码应该在未来 10、20 或甚至 30 年内仍远远超出最大超级计算机的能力范围。

由于这是一个转子机器的软件模拟,转子可以随意更改。可以通过使用密钥来混合每个 8 个转子字母表,为每个消息更换转子,而不是固定的 16 个转子集合。这将大大增加安全性,但需要为每个消息进行单独的设置阶段。中等安全级别是使用 16 个转子集合中的 7 个标准转子,以及为每个消息独立生成字母表的 1 个转子。这将减少 87%的设置时间。

即使这个密码已经获得了十级评价,你可能仍希望加强它。你可能不相信我的评价,或者你认为你的对手拥有惊人的计算能力。一种方法是使用一些转子的输出来修改操作。我建议在加密过程中的中途取第四个转子的输出,并使用该字符来推进第一个转子。可以直接使用字符,也可以对字符进行简单的替换以获得推进第一个转子的位置数。除了消息中的第一个字符外,第一个转子被推进两次,一次来自其步进序列,一次使用第四个转子的反馈。

这种双步进不会影响当前字符的加密。使用这种修改后的设置对下一个消息字符进行加密。在硬件转子机器上实现双步进可能会很困难,但在模拟机器上可以很容易地完成,因为转子是依次模拟的。

顺便说一下,使用第八转子的输出似乎会更强大,但这是不正确的。第八转子的输出是密文字符,这对窃听者是已知的。中间两个转子的输出,即第四和第五转子,对窃听者的获取是最困难的,因此最安全。

第四转子的反馈使得模拟的 8 转子机器是非周期性的。无论发送多少消息,埃米莉都永远找不到具有相同转子设置序列的两条消息。

第六章:对策

本章内容包括

  • 双重加密
  • 空字符和空位
  • 同音字
  • 在图像或计算机文件中隐藏消息

总结第 5.9 节,多表密码可以通过两步过程解决。首先,使用 Kasiski 方法或 Coincidence 指数确定周期或密钥长度。这将把密文分成几个较小的文本,每个文本只有一个字母的密钥。其次,使用标准的简单替换密码方法对这些单独的文本进行解密,包括频率和接触。

让我们把它反过来。密码分析者可以采取哪些措施来防止多表密码被这两个步骤破解?我们将看几种对策。

6.1 双重加密

如果一条消息使用一个周期为 P 的多表密码加密,然后使用周期为 Q 的第二个多表密码加密结果中间文本,那么结果等同于一个周期为 P 和 Q 的最小公倍数的多表密码,表示为lcm(P,Q)。也就是说,周期是 P 和 Q 的最小整数倍数。例如,如果 P 为 10,Q 为 11,那么双重加密将具有 110 的周期,但如果 P 为 10,Q 为 12,那么双重加密将具有 60 的周期,因为 60 是 10 和 12 的倍数。

双重加密中的每个个体字母都是第一次和第二次加密中的两个字母的组合,如第 11.7.4 节所述。如果这些是移位标准字母表,那么结果也是移位标准字母表。如果这些是混合字母表,那么结果很可能是更彻底混合的字母表。

尽管双重加密仍然是多表加密,但它可能比单个多表加密更强,因为周期更长,每个密钥字符将加密的字母更少。这种类型的双重加密评为三级。

如果两个多表加密是自动键、流动密钥或一个键,双重加密将是流动密钥加密。然而,密钥不会是英文文本,所以第 5.11 节的单词拖拽技术无法使用。那节的概率技术,尽管如此,可以用于两个流动密钥。

如果加密使用直接字母表,即使用 Belaso 表,那么加密顺序并不重要。用流动密钥 R 加密消息 M,然后用流动密钥 S 重新加密与用流动密钥 S 加密流动密钥 R 以获取新的复合流动密钥 C,然后用该复合流动密钥 C 加密消息 M 是相同的。

通过用一个流动密钥对另一个流动密钥进行加密而派生的密钥并不是随机的。它们具有自己的特征字母频率和接触频率。有常见的序列,比如 THE 被 THE 加密,或者 AND 被 THE 加密。所有这些都可以列成表。如果将长短语(如 UNITED STATES OF AMERICA 或 NEGOTIATING STRATEGY)拖过文本,您可以寻找符合此分布的流动密钥部分。因此,双流动密钥加密可以通过计算机解决。

使用未混合字母表,两个自动密钥和/或流动密钥加密的组合被评为四。使用混合良好的密钥字母表,该组合被评为六。

6.2 空字符

空字符是阻止敌人破译代码的一种历史悠久的方法。它们至少可以追溯到 15 世纪的阿根提家族。空字符是插入到消息中以迷惑敌方密码分析员的无意义字符。它们最常与代码一起使用。对于多表密码,它们可以污染频率计数并破坏卡西斯基或重合指数分析。

空字符可以有几种使用方式。最直接的方法是向字母表中添加一个空字符。这通常表示为一个星号。然后可以将此字符散布到明文中。应该适度使用,以免显眼和明显。约 3%至 6%的空字符是合理的。使用空字符的一个有用方法是将它们插入高频词中以迷惑卡西斯基攻击。这应该是随机的。如果您将每个* THE 更改为 THE,则正在通过提供 4 个字符重复来帮助 Emily。最好一半时间使用 THE,四分之一时间使用 THE,四分之一时间使用 THE。使用THE 或 THE*并不有益,因为 THE 三字母组保持完整。

加密表将变为 27 列宽,并且星号将出现在密文中。您可能会认为这将透露正在使用空字符,但有一种称为三重密码的密码,描述在第 9.9 节中,它利用了一个 27 字符的字母表。Emily 可能会认为您的多表密码是三重密码(不要与约翰·温德姆 1951 年小说《三脚怪植物的末日》中的三条腿怪物植物混淆)。

以这种方式使用空字符相当薄弱。它不会显著改变字母频率,并且不会对卡西斯基或重合指数产生不良影响。该方法被评为三。

使用空字符的第二种方法是在明文中插入一些特定的空字母序列。这些序列需要容易识别。我建议从一小部分中频字母(如 C、D 和 P)形成空序列。双字母组 CC、DD 和 PP 可以用来表示字母 C、D 和 P,这些字母的其他 6 个双字母组合将成为空字符。这种方法也被评为三。

6.3 中断密钥

使用空字符的更强大的方法是将空字符插入到密文中,以打破重复周期。这样做的简单方法首先是以正常方式使用多表密码加密消息。然后每次在密文中发生某些触发事件,例如某个选择的字母或双字母时,在其后插入一个空字符。空字符可以是任何字母,甚至是双字母。触发器的存在标记它为一个空字符。

这种空字符插入类型可能相当复杂。你可以插入一个空字符

  • 在密文中每个 W 之后的 4 个字符,例如密文NPGWSOVKLEWPIDF可能变为NPGWSOVTKLEWPIDCF
  • 在密文中每第二个 H 之后,
  • 在密文中每个跟随 Q 的第一个 A 之后,
  • 第一个 V 之后的 1 个位置,然后下一个 B 之后的 2 个位置,下一个 L 之后的 3 个位置,然后重复 V、B、L、V、B、L、…,
  • 在密文中每个双字母之后,或在连续 3 个元音之后,或在字母表中按升序或降序连续 4 个字母之后,

或者这些的组合。唯一的限制是你的想象力。只是不要让它变得太复杂,以至于桑德拉和里瓦无法快速准确地加密和解密。如果桑德拉应该在每第二个 K 之后插入一个空字符,以及每第三个 M 之后,而她错过了一个,或者在第四个 M 之后放置了空字符,那么里瓦可能无法解密消息。

这种插入空字符的方法使用标准字母评为四,使用混合字母评为五,前提是,如常,混合字母保密。

还有几种打破关键周期重复的方法。一种方法是在明文中发生某些触发器时重新启动关键。这比前一种方法更安全,因为触发器在密文中,艾米丽可以看到密文,但看不到明文。另一方面,对于合法的接收者来说更困难。当触发器在密文中时,里瓦只需扫描并通过眼睛删除空字符。当触发器在明文中时,里瓦必须逐个解密字符,注意触发器。

触发器可以类似于刚才提到的密文触发器,只不过在明文中,而不是在密文中。触发器发生后所采取的行动可能是

  • 跳过关键中特定数量的字符,或
  • 重复关键中特定数量的字符,或
  • 从第一个字符重新启动关键,或
  • 切换方向,通过关键向后走。

这里是使用关键 SAMPLE 和触发字母 A 的这 4 种类型的关键中断的示例:


这种形式的关键中断使用直接字母评为五,使用混合字母评为六。关键不应该经常重新启动,否则关键的第一个字符将被过度使用,而关键的最后一个字符可能会被忽略。

更强的关键中断形式是使用两个不同长度的密钥。当密钥长度互质时,此密码最强。当触发器发生时,您从一个密钥切换到另一个密钥。当混合字母表混合良好时,此方法评为六。这是一个使用密钥 FIRST 和 SECOND 以及触发器 A 的示例:


此密码会跟踪上次使用的密钥字母。当你切换到另一个字母表时,加密将继续使用密钥的下一个字母。例如,明文 MA 使用密钥字母 FI 进行加密,因此下一个密钥字母是 R。在使用第二个密钥 SECO 加密 RYHA 后,加密将在第一个密钥 RS 的密钥字母中继续。

这样,每个密钥中的所有字母大致相同的次数。

6.4 同音字替换

同音字替换,介绍在 4.2 节中,为了平坦化字母频率,为每个明文字母提供几个替代字。最常见的方法是扩大密文字母表以提供额外的替代字。由于经典的多字母密码使用固定的 26 个字母表,至少对于英语来说,它们通常不使用同音字替换。

对于使用 8 位字节的计算机实现,同音字替换很容易实现。一个字节有 256 个可能的值。26 个大写字母,26 个小写字母,10 个数字,以及可能的 32 个标点符号只使用了 256 个值中的 94 个。如果包括制表符、退格、换行和回车,就有 98 个。这样就留下了 158 个字符,可以用于空字符、双字母组合和三字母组合以及关键中断。

让我们看看如何使用纸和笔以及正常的 26×26 混合表进行同音字替换。如果您将一个字母保留为触发字母,那么该字母的频率将非常高,很容易被发现。同样,使用 2 个触发字母也是可能的。我建议使用 3 个触发字母,每个字母的频率都低于 4%。让我们称这个密码为Trig3。字母 BCDFGJKLMPQUVWXYZ 是合适的。假设您选择了 B、C 和 D。以这 3 个字母开头的双字母组合有 78 个,即 3×26。您不会使用包含高频字母 AEINORST 的双字母组合,因为那会增加它们的频率,这与平坦化字母频率的目标相悖。这样就留下了 54 个可以用作空字符、同音词和关键中断的双字母组合。这里是一组可能的双字母组合:


这里的**-**代表空字符,所以明文 BD、BL、CC 等都是空的。Codes +1、+2 和+3 是关键中断符,意思是跳过 1 个、跳过 2 个和跳过 3 个关键字母。同音词集包括 6 个双字母组合,AN、ER、IN、ON、RE 和 TH 以及单个字母。

保持平衡很重要。如果你过度使用这些替代字符,那么字母 B、C 和 D 的频率就会过高,很容易被发现作为触发器。如果你使用得太少,那么它们就不会有任何有用的影响。大约 10%是正确的,使用 B、C 和 D 的双字母组合频率大致相等,每个约为 3%。记住,使用这种密码时不能单独使用字母 B、C 和 D,必须使用它们的替代品 DM、CD 和 CG。

如果正确使用,使用混合得很好的键入字母表,Trig3 密码的评级为五。

6.4.1 密码 5858

在转向双字母组合替换之前,让我再介绍一个密码。我称之为Cipher 5858。这是一个使用 5 位字符的计算机密码。五位字符给出 32 个字符的字母表,足够 26 个字母、3 个空字符和 3 个同音字使用。(1)明文被写成一个混合字母的 5 位字符序列。(2)插入空字符和同音字,每个约占明文的 3%,总共占明文的 18%。最好是以随意的方式使用它们,而不是以系统化的方式。(3)明文被填充,使其长度成为 8 的倍数,如果需要,添加一个空字符,并最多添加 4 个随机位。(4)填充后的消息被视为 8 位字节的字符串,并进行混合替换。例如,如果消息包含 80 个 5 位字符,则将按顺序取 400 位,作为 50 个 8 位字节。(5)将消息再次视为 5 位字符的字符串。选择其中的三个字符作为键中断器+1、+2 和+3,就像 Trig3 密码一样。(6)使用一个通用的多表多字母密码和一个混合得很好的 32×32 的 5 位字符表对消息进行加密。(7)5 位字符的字符串然后重新分组成 8 位字节,并进行第二次 8 位替换。

总之,密码 5858 使用 4 个替换步骤,一个初始的 5 位替换,一个 8 位替换,一个带有键中断的 5 位通用多字母替换,以及最后一个 8 位替换。这个密码的评级为七。

6.5 双字母组合和三字母组合替换

防止 Emily 使用字母和联系频率破解您的密码的另一种方法是对双字母组合甚至三字母组合进行替换。最简单的方法是使用一个表格。对于双字母组合,您可以使用一个 26×26 的表格,其中每个条目都是一个双字母组合。以下是这样一个表格的开头:


AA 的替代品将是BL,AB 的替代品将是TC,依此类推。对于三字母组合替换,您可以使用一个小册子,其中包含 26 个这样的表格,每个表格对应三字母组合的第一个字母。

这种替换方法可以单独使用,也可以与另一种方法结合使用,例如多表替换。单独使用时,二元替换评为三,三元替换评为四。二元替换后跟着使用混合良好的秘密字母表的多表替换评为五,三元替换后跟着使用混合良好的秘密字母表的多表替换评为六。

*6.6 在图像中隐藏消息

一个有趣的想法,可以追溯到大约 1999 年,是将消息隐藏在计算机上各种类型的数据文件中。这是隐写术(第 2.2 节)的现代版本。让我们看看其中一种方法,将消息隐藏在位图或 BMP 文件中。位图是以像素为单位存储的图像。最常见的位图格式通过 3 个字节表示每个像素,指定图像上单个点的蓝色、绿色和红色色深度。 (这是微软位图图像标准中的设备无关顺序。如果你记不住顺序,注意蓝色、绿色和红色按字母顺序排列。)例如,0,0,0 表示没有颜色,因此是纯黑色,255,255,255 表示所有 3 种颜色的最大深度,因此是白色,255,0,0 将是纯蓝色。

像素通常用十六进制表示,因此纯蓝色将是 FF0000。在一些计算机语言中,这样写$FF0000 或 X’FF0000’甚至 0xFF0000,因为十进制 255 在十六进制中是 FF。在一些语言中,颜色组件的顺序是相反的。例如,在 HTML 中,纯蓝色将是#0000FF。

整个图像可能包含数百或数千行像素,每行包含数百或数千个像素。一个位图包含 3000 行,每行包含 4000 个像素并不罕见。这样的图像将有 12,000,000 个像素,并且需要 36,000,000 字节的存储空间,再加上 54 字节的头部信息。这就是为什么许多高分辨率图像会迅速填满计算机的内存。

诀窍是使用像素的每个组件中的低阶位来携带一位消息。这可能不会被察觉,因为 FF0000 和 FE0000 甚至 FE0101 之间的差异对肉眼几乎是不可察觉的。在大图像的单个像素中,这将在视觉上是不可察觉的。此外,一半的位不会改变值。在图像中隐藏消息时,关键是传输包含图像的文件时必须完全准确。图像不得放大、缩小、裁剪、旋转、倾斜、压缩或转换为另一种图像格式。

消息可以用任何方法加密。但是,如果 Emily 怀疑你是以这种方式隐藏消息,那么它不会增加任何额外的安全性。你将为每个消息位传输 8 位数据而不获得任何相应的好处。如果你简单地依次取每个像素的低阶位,评级将与你选择的加密方法相同。

从这种方案中获得额外安全性的一种方法是不使用所有位,而是以某种循环顺序从每个像素中选择特定位。为此,您可以使用一串八进制数字(请参阅第 3.1 节中的表)作为选择消息位的密钥,例如 1,3,7,4,6。这可以称为选择密钥。它有 5 个八进制数字,因此有 15 个选择位。从图像的第一个像素和选择密钥的第一个数字开始。如果该数字的第一个位为 1,则将消息的一位放入像素的蓝色分量的低阶位,否则将低阶位随机设置为 0 或 1。如果第二个密钥位为 1,则对绿色分量执行相同操作,如果第三位为 1,则对红色分量执行相同操作。然后对第二个像素和选择密钥的第二个数字重复此操作。依此类推。

有人可能会认为,当密钥位为 0 时,最好保持图像对应位不变。这样会导致图像失真较小,并且使得 Emily 更难检测到其中包含隐藏消息。没错,但如果 Emily 怀疑你在使用这种方法,那么就可能确定选择密钥。

假设情况如此。Emily 拦截了包含位图图像的消息。进一步假设 Emily 在互联网上进行了图像搜索,并找到了原始图像。Emily 可以逐像素和颜色分量地将两个图像进行匹配。这使得 Emily 能够制作出两个图像版本之间差异的地图。在低阶位匹配的地方,Emily 可以在地图中标记一个 X,而在不匹配的地方,Emily 可以标记一个 |。然后,Emily 可以尝试每个可能的选择密钥长度。当选择正确长度 L,并且标记以 L 像素间隔对齐时,那么每一列选择位为 0 的地方将包含所有的 X,而选择位为 1 的列将包含一半的 X 和一半的 |。例如,再次使用选择密钥 1,3,7,4,6,你可能会看到


对于每一列包含 | 的情况,选择密钥的对应位必须为 1。选择密钥的所有其他位可能为 0。随着差异图中行数的增加,概率会变得更高。

因此,无论选择位是 0 还是 1,颜色分量的低阶位都应该随机设置。使用循环选择密钥,隐藏消息的这种方法在底层密码的评级为 1 到 4 时添加 2,或者在评级为 5 到 8 时添加 1。

选择密钥也可以使用第 4.5 节的链式数字伪随机生成器生成,使用 7、9 或 10 位数的合格种子。使用从 0 到 7 生成的数字作为选择数字。如果生成的数字是 8 或 9,则丢弃它并生成下一个数字。这里不重要伪随机数字是否具有统计随机性。重要的性质是生成的数字序列比消息更长,以比特为单位衡量,这样艾米丽就不能匹配具有相同选择密钥的密文部分。

使用链式数字选择密钥,如果底层密码的评级为一到四,则此隐藏消息的方法添加 3,如果评级为五到七,则添加 2,如果评级为八,则添加 1。

6.7 添加空位

将消息的位与空位的这种混合思想也可以在不嵌入消息于图像或其他文件中的情况下实现,并且可以手工完成。首先使用简单替换法或您选择的任何方法对消息进行加密。将这个初步的密文写成二进制形式,比如 5 位二进制。简单替换和转换为二进制可以一步完成。您可以只是按一些混合顺序替换字母表的 26 个字母为 5 位二进制数,就像这样:


注意,除了字母表的 26 个字母外,还有 6 个十进制数字。省略了数字 0、1、2 和 5,以防止手写时与字母 O、I、Z 和 S 混淆。这给了您将 5 位数转换回符号以进行传输所需的 32 个字符。

现在,消息以位串的形式给出,可以添加空位了。选择密钥用于指定插入空位的位置。选择密钥的形式是 m1,n1,m2,n2,m3,n3,…,表示取 m[1] 位消息并插入 n1 个空位,再取 m2 位消息并添加 n2 个空位,再取 m3 位消息并添加 n3 个空位,依此类推。以下是使用选择密钥 2,1,3,1,4,2,3,2 的示例。


使用此方案,消息被加密为Q9JIF PGUFF F。四个空位(阴影部分)被附加以完成最后一组 5 位。这称为填充空填充

选择密钥也可以以二进制形式给出,比如 110111011110011100。密钥中的每个 1 位表示取下一个消息位,而每个 0 位表示插入一个空位。

当使用两个不同的字母表来将字母转换为比特和将比特转换回字母时,此方案更加强大。使用可变长度的替代品,如第 10.4 节中描述的哈夫曼编码,也可以提高强度。为此,代码的长度不需要与字母的频率相对应,但它们仍然必须具有前缀属性,以便里瓦能够解密消息。

你可以通过两种方式避免在第二次替换时添加额外字符,即从比特到字母的替换。 (1) 你可以每次取 4 个比特,并且只使用字母表的 16 个字母,或者使用 16 个十六进制数字,或者 (2) 你可以使用一个具有六个 4 比特代码组和二十个 5 比特代码组的可变长度编码。同样,这些代码组必须具有前缀属性。以下是一个示例:


注意,我为 6 个最高频率的字母使用了 4 比特的替代物。这将使这 6 个字母在密文中的频率大约是其他 20 个字母的两倍。这可能会使一个不警惕的对手认为这是一种完全不同类型的密码。

添加空位适用于许多类型的加密。由于空位和其他任何比特都无法区分,因此添加空位比添加空字符更强大。它可以使密码的评级提高高达三分。

让我们看一个具体的例子。称之为Cipher Null5。和之前一样,有 3 个步骤,将字母转换为比特,添加空位,然后将比特转换回字母。字母被转换为比特,使用从字母到 5 比特组的同音替换。为每个字母 E、T、A、O、I、N 提供了两个替代物。空位通过使用选择密钥插入,如第 6.6 节所示。比特通过类似于上表的 4 比特/5 比特替换转换回字母。

Cipher Null5 的评级为六。

6.8 合并多个消息

二进制形式的密钥也可以作为合并密钥来合并两个消息。也就是说,两个消息的比特会交错以形成单个消息。基数为 3 或 4 的合并密钥可以用来合并 3 或 4 个消息。基数为 4 的合并密钥同样可以合并 3 个消息加空位。

合并多个消息的两个优点是,你不会像使用空位一样增加太多额外长度,而且可以使用更简单、更快速的加密。如果你使用一个长的合并密钥交替四个消息,并且对每个消息使用不同的简单替换,那么单单这一步就能获得五分的评价。如果你对合并的消息再进行一次简单替换,评价就会提升到八分。

合并消息的密钥可以采用两种形式,一种是比特计数形式,一种是选择形式。在比特计数形式中,消息会轮流被取出。密钥的每一位指定了从每个连续消息中取出多少比特。在选择形式中,消息可以按任意顺序被取出,但每次只取出一个比特。密钥的每一位指定了从哪个消息中取出下一个比特。以下示例展示了如何通过比特计数方法使用密钥 123123 合并消息 010101111010001101011 和 11101010011011100110,以及如何通过选择方法使用密钥 12122112 合并消息。


合并多条消息时,如果这些消息长度不同可能会显得混乱。除了最长的消息外,其他消息都需要有一个消息结束标记。另一种处理长度不匹配的方法是平衡合并。首先,将所有消息依次写在一起,用某个预留的字符或字符序列分隔开。然后简单地将这个长字符串分成相等的部分。例如,如果消息长度分别为 50、60、70 和 80 个字符,总共是 260 个字符,再加上 3 个分隔符共 263 个字符。你可以将它分成 4 条长度分别为 66、66、66 和 65 个字符的子串。如果使用的是 8 位字节,你可以将 263×8 = 2104 位分成 4 条每条 526 位的子串。不需要在比特字符串上按照偶数字节边界进行分割,但是你应该选择从每条子串中取相等位数的密钥。

顺便说一下,消息数和子串数是独立的。可以只有一条消息,也可以有多条消息,子串数从 2 开始。例如,一条消息可以分成 3 个子串,也可以有 3 条消息分成 2 个子串。

平衡是解决方案的一半。另一半在合并过程接近尾声时出现。最终,你将会合并来自其中一条字符串的所有比特,而其他字符串还剩下一些比特。如果合并密钥指定了另一条没有剩余比特的字符串的另一个比特,则跳到下一个比特选择。

让我们把所有内容汇总成一个密码,称为 Merge8。Merge8 密码作用于一个或多个连接在一起的消息。在基于 26 进制的版本中,26 个字母使用类似于第 6.7 节中的 4 比特/5 比特编码转换为二进制。消息分隔符可以是一串字母,如 XXX 或 END。在基于 256 进制的版本中,对 ASCII 码应用混合良好的简单置换。生成的比特字符串被分成 8 个长度相等的比特串。使用 32 个八进制数字的密钥来合并这 8 条比特串。每个 8 进制值在密钥中出现 4 次,因此有 32!/(4!)⁸ = 2.39×10²⁴ 种可能的合并密钥。对生成的字符串执行第二个简单的置换。基于 26 进制和基于 256 进制的版本都使用 8 比特置换。Merge8 评级为六。

6.9 在文件中嵌入消息

当将消息隐藏在图片文件中时,每个消息比特至少有 7 个图像比特。这相当低效。如果不试图让它看起来像其他东西,你可以在文件中隐藏更多的消息比特。它是密文,就让它看起来像密文。有数十种方法可以在文件中隐藏明文消息。我将简单列举一些选项。与第 6.6 节一样,对于文件的每个字节,一定数量的明文比特被隐藏在其中的 8 比特中。

  • 每次取固定数量的明文比特或可变数量的明文比特。
  • 每个字节内的位可以放置在固定的位位置或可变的位位置。
  • 位按顺序放置,或者重新排列。
  • 明文位可以原样插入,也可以轻微加密,例如通过简单的替换。
  • 密文位可以原样保留,也可以轻微加密,例如通过简单替换。

位的数量、位的位置和位的顺序可以由周期性密钥或某些随机序列控制。根据所选择的选项,这一类密码的评级可以从一到十不等。

这是一个这样密码的例子。 (1) 对消息执行混合良好的密钥简单替换。(2) 使用具有大内部状态的伪随机数生成器,在每个字节中选择 2 到 6 位位置。按顺序将消息的下一个 2 到 6 位放置到这些 2 到 6 位位置中。将剩余位位置设置为随机值。(3) 执行第二次混合良好的密钥简单替换。

这种称为EmbedBits的方法极其快速简单。缺点是密文长度约为明文的两倍。EmbedBits 被评为八分。要将评级提升到十分,可以将简单替换替换为双字母替换,例如 Two Square。

第七章:置换

本章涵盖

  • 路径和列置换
  • 随机数置换
  • 密钥置换
  • 多重变位词

在第五章和第六章,我们讨论了替换密码。秘密密钥加密方法的第二大类别是置换。置换意味着改变消息中元素的顺序。这些元素可以是单词、音节、字母或代表字母的个别数字或位。在本章中,我们将主要处理字母置换,但请记住,您可以使用相同的方法处理其他元素,例如第 7.2.2 节中的单词置换。本章将涵盖许多不同类型的置换密码。大多数这些置换密码只需用铅笔和纸就可以完成。

7.1 路径置换

路径 置换 是最简单、最古老的置换密码形式。没有涉及密钥。保密性来自路径或路径选择。

路径置换是让孩子们对密码学感兴趣的好方法。这是一个适合课堂、童子军团或其他俱乐部的活动。主要注意事项是孩子们必须以直立的列均匀地写字母,否则消息会混乱。可以通过使用间距较宽的方格纸来避免这种情况。

基本思想是将消息用一条路径写入矩形中,然后用另一条路径读出。例如,如果消息有 30 个字符,那么 5×6 的矩形最合适。如果消息有 29 个字符,只需添加一个空字符。用空字符填充消息,直到它适合合适大小的矩形。在开始填写之前,画出矩形的轮廓是有帮助的。如果消息很长,将其分成方便大小的块。例如,1000 个字符的消息可以分成二十个 5×10 的块。

我们已经在第 4.3 节看到了路径置换的一个示例。消息是水平地从左到右跨行写入 5×5 网格中,然后垂直地从上到下沿列读出。水平和垂直是两种路径。以下是更完整的列表。

  • 水平方向,从左到右,从右到左,或交替左右
  • 垂直方向,从上到下,从下到上,或交替上下
  • 对角线方向,从左上到右下,从左下到右上,等等,或交替
  • 螺旋,从任何一个角向内或从中心向外,顺时针或逆时针

你可以从矩形的任何一个角开始,使用任何路径写入消息,并使用任何其他路径读出消息。这里是一个花式路径的示例:


消息将按照数字指示的顺序写入网格中,并按列读出,即 1、36、37、39、42、2、6、38,…

对于路线置换,Emily 只需要猜测您用来读取消息的路线。在 Emily 将消息填入矩形之后,可以通过检查来读取。请注意,对于 Emily 来说,您是将消息水平写入 5×6 矩形还是垂直写入 6×5 矩形都无所谓。同样,您是从顶行向下工作还是从底行向上工作也无所谓。Emily 无法区分这两者之间的差异。

路线置换评为一级。

7.2 纵列置换

纵列 置换 是置换密码的主力军。自 17 世纪以来,它一直被军队、外交官和间谍使用。该方法首次在约翰·法尔科纳(John Falconer)于 1685 年撰写的《密信解密》(Cryptomenysis Patefacta)一书中描述。1688 年的光荣革命之后,约翰·法尔科纳跟随詹姆斯二世流亡到法国,在那里去世,而第二版于 1692 年以新标题《解释和解密各种秘密写作规则》(Rules for Explaining and Decyphering all Manner of Secret Writing)出版之前已经出版。

纵列置换使用的密钥可以是混合顺序的连续数字字符串,也可以是关键字或密语,通过将字母按字母表顺序编号来将其转换为数字字符串。考虑关键字 SAMPLE。字母 A 在字母表中最早,因此编号为 1。字母 E 在字母表中次序排在第二,编号为 2。然后是 L、M、P 和 S。因此 SAMPLE 转换为字符串 6,1,4,5,3,2。如果同一字母出现多次,则按从左到右的顺序编号。例如,ANACONDA 变为 1,6,2,4,8,7,5,3。


将消息从左到右水平写入网格。列数等于密钥的大小。如果密钥是 SAMPLE,则有 6 列。如果密钥是 ANACONDA,则有 8 列。像这样在网格上方写下数字密钥:


根据数字密钥从顶部到底部垂直读取消息,从编号为 1 的列开始,EKFHE,然后是列 2,ESRAT,列 3,NROW,直至列 8,YCYI,如图所示。

合法接收者 Riva 需要做一点算术才能阅读此消息。密钥长度为 8 个字母,消息长度为 35 个字母。35 除以 8 等于 4,余数为 3。这意味着数组将包含 4 行完整的 8 个字母,加上 3 个字母的短行。Riva 应该在开始填写列之前画出此数组的轮廓,以便将正确数量的字符放入其中。

艾米莉,敌人的任务有点困难。技巧是将每列的字母垂直写在一条纸条上,然后将这些条纸对齐以确定列的顺序。她寻找那些匹配字母形成常见双字母组合的条纸对。当她找到一个好的匹配时,她尝试在这两个条纸之前或之后添加第三个条纸。一旦正确匹配了 3 或 4 个条纸,短单词就开始出现,任务变得容易起来。

艾米莉不知道关键字的长度,所以她需要猜测。她可能从 5 开始并逐渐增加。假设她已经增加到 8,正确的长度。像丽娃一样,她将 35 除以 8。她知道有 5 个由 4 个字母组成的短列,和 3 个由 5 个字母组成的长列。艾米莉的问题是在哪里开始和结束每个条纸,以便至少包含一个完整的列。

第一条纸条从密文的第一个字符开始,如果第一列读出的数组是长列,则必须是 5 个字母长。第二条纸条从密文的第五个字母开始,如果第一列是短列,则在第十个字母结束。对于第三和第四条纸条也是如此。然后,艾米莉将对其他 4 条纸条做相反的操作,从密文的最后一个字母向中心反向工作。

然后,艾米莉将匹配这些条纸,将它们相互滑动以确定正确的对齐方式。所有这些都是凭眼睛完成的,所以艾米莉必须熟记最常见的双字母组合和三字母组合的频率。这也可以通过计算机以简单直接的方式完成。

针对这种匹配程序的最常见对策是,发送者桑德拉从上到下读出一些列,从下到上读出另一些列。这意味着艾米莉需要一套读取反向的第二套条纸。然后她将有两倍多的条纸来尝试匹配。

如果数组是矩形,则所有列向下读取时,列置换评为二,如果不是,则评为三。如果网格是矩形,或者列很长并且交替方向读取时,列置换评为三,否则为四。

列置换是一种为任何类型的替换密码增加强度的经过验证的方法。列置换与混合良好的简单替换相结合评为五。当与混合良好的一般多表密码相结合时,评为七。如果两个密钥的长度互质,则组合最强。

加强柱形置换的最常见技巧是使一些行的长度不同。这样会让艾米丽难以确定条带应该从哪里开始和结束。有四种这样的想法。其中,编号(4)是最强的,因为它在中间的一个不可预测的点破坏了条带,而不是在末端。更复杂的空白模式可能在某些列中有 2 个或更多的空白。

这些变种的柱形置换评分为四,前提是艾米丽不知道模式。如果密钥很长,并且列中有可变数量的空格,那么变种(4)的评分将提高到五。法国人在一战结束时使用了这样的系统。据信德国人能够读取其中至少一部分消息,主要是因为法国人多次重复使用了他们的密钥。


对数字(3)的两个进一步变种,楼梯,是(5)当你到达右边缘时从第一列开始,形成一个斜线模式,和(6)当你到达右边缘时反向,创建一个燕尾或之字形图案。这些模式的优点是每一行的字符数除了最后一行可能不同外,其他都相同,这样瑞娃很容易计算行数。以下是这两种变体的示例。


你也可以有两个或更多不同宽度的分开的楼梯,或者在对角线和反对角线方向上有楼梯 **/

当你解密使用任何这些柱形置换变种发送的消息时,如果你有任何难以计算需要多少行,或者最后一行有多长的困难,这里有一个技巧。数一下消息中的字母,并从左到右用那么多的小点填写数组,按照桑德拉用来书写字母的相同模式。然后在点上填写字母。

例如,在变种(2)中,假设你已经同意你将始终从第一行开始使用 7 个字母。密文(2)有 38 个字母,所以你在第一行放置了 7 个点,第二行放置了 8 个点,直到你总共放置了 38 个点。然后你开始在它们的正确列中填写字母,像这样替换点:


使用有黑色方块的另一种方法是用空值填充它们。空值应该选择成为不常见的字母对,以使艾米丽更难匹配列。最好使用常见的字母而不是罕见的字母,这些字母可能很容易被识别为空值。这是一个例子。


有空格的柱形置换评为三。有固定的空格模式,评分为四。

密钥密码学(一)(4)https://developer.aliyun.com/article/1508652

相关文章
|
1月前
|
算法 数据安全/隐私保护
对称密钥加密算法和公开密钥加密算法有什么区别
【4月更文挑战第19天】对称密钥和公开密钥加密算法各有特点:对称密钥加密速度快,适用于大量数据,但密钥管理困难;公开密钥加密安全性高,密钥管理方便,但速度慢,常用于数字签名和身份验证。两者在不同场景下有不同优势。
90 6
|
1月前
|
机器学习/深度学习 算法 安全
【加密算法】RSA非对称加密算法简介
【加密算法】RSA非对称加密算法简介
|
1月前
|
存储 安全 算法
密钥密码学(一)(4)
密钥密码学(一)
24 2
|
1月前
|
存储 安全 算法
密钥密码学(一)(1)
密钥密码学(一)
14 1
|
1月前
|
存储 算法 安全
密钥密码学(一)(2)
密钥密码学(一)
21 1
|
1月前
|
开发框架 算法 .NET
密钥密码学(三)(4)
密钥密码学(三)
25 0
|
1月前
|
传感器 算法 安全
密钥密码学(三)(3)
密钥密码学(三)
11 0
|
1月前
|
存储 人工智能 安全
密钥密码学(二)(2)
密钥密码学(二)
22 0
|
1月前
|
存储 机器学习/深度学习 算法
密钥密码学(三)(1)
密钥密码学(三)
22 0
|
1月前
|
存储 安全 算法
密钥密码学(二)(3)
密钥密码学(二)
21 0