中文译本 · 原作 Daniel Bourdeau《Unsolved Historical Ciphers》 以 CC BY 4.0 发布,本页由 JIC 翻译,非原作者官方版本,译文如有出入以英文原页为准 · 查看英文原页 ↗
PXSXH IHVGD OLIXA DYZZT
RFBLQ XPLPN MSLSB ZZSFP
… 罗夫诺致柏林,1942年2月27日

莫吉廖夫、罗夫诺、Proskurov → 柏林 · Doppelkastenschlüssel,两个方格,两轮加密 · 1942年2月和6月

德国警察双方格无线电报,1942年

东线 Ordnungspolizei(秩序警察)的六条无线电报,在 Beaumanor 被截获,保存于 NARA 的 NSA Historic Cryptographic Collection,由 Frode Weierud 公布(CryptoCellar,2020年8月5日);Klaus Schmeh 于2020年8月30日把它们作为挑战题发布。其中一条有布莱切利园的解密件;其余五条没有已知解密件。

未能复原密钥。1942年2月27日的五条电报用的是同一密钥,共 970 个字母。这里尝试过的唯密文攻击都没能复原它,对同样长度的合成文本也都复原不了密钥。已知明文求解器则能做到,大约需要 80 对;而唯一的解密件(六月那条电报的)无法与其密文对齐,提供不了这些明密对。

Daniel Bourdeau · 发布于 · 更新于

方法:未破解 · 程度:未获得文本

摘要。1942年,德国秩序警察用陆军的双方格系统加密无线电通信:两个 5×5 方格,每个字母对通过同一组方格加密两次。Weierud 公布了六条截获电报。1942年6月16日从莫吉廖夫发出的那条有明文,即 Hanyok 在 Eavesdropping on Hell 中翻印的布莱切利园解密件:第 51 警察营有十六人在博布鲁伊斯克—莫吉廖夫公路上阵亡,Borki 村被夷平,村民被“liquidated”(清除)。1942年2月27日的五条电报则没有明文。它们的区分组表明,这五条共七个部分、970 个字母,都用同一个日密钥加密。这里尝试的唯密文攻击在它们身上全部失败:单次加密被直接排除;对于两次加密,模拟退火、分阶段评分、回火、松弛和 EM 在一份已知密钥、长 970 个字母的合成文本上同样全部失败,因此在真实文本上的失败说明不了明文的任何情况。失败的原因已经测出来了:真密钥位于一个只有八到十次交换宽的盆地里,而第二轮加密让搜索在盆地之外无坡可爬。已知明文求解器凭大约 80 对明密文就能复原方格。最显而易见的明密对来源——布莱切利园对六月那条电报的解密文本——无论试哪种拼写、布局或长度,都与其密文对不齐,所以实际加密的词句并不是解密件里的词句。尚未复原任何密钥。需要的是同一密钥下大约 80 对已知明密对:布莱切利园对2月27日通信的解密件(TNA HW 16/17,未上网),或者六月那条电报确切的德语原文。

01 电报

Weierud 的论文 German Police Doppelkastenschlüssel Messages 转录了六条电报,并翻印了 NARA, RG 457, Historic Cryptographic Collection, Box 1386(NR. 4417,“German WWII Police and SS Traffic”)和 Box 202(NR. 976,“Study of German Police Traffic”)中的电传副本和 W/T 红色表格。这里每条电报都用其 Beaumanor 编号(BMR A115、D33 等)标示。每个部分的第一个五字母组是区分组,它指明所用密钥,不属于正文;下面的字母数不含区分组。

第 51 号截听站6月16日的 W/T 红色表格:警察,由 SQF 发往 DQH,3742 kHz,报头 SQF NR 14 2325 228 ALQ,以及开头的几个密码组 ARTTN FMXBW OIYSU OGILL
第 51 号截听站为1942年6月16日电报填写的红色表格:由 SQF(莫吉廖夫)发往 DQH(柏林),频率 3742 kHz,报头 NR 14 2325 228 ALQ,其后是区分组 ARTTN 和正文。图像:NARA, RG 457, HCC, Box 202,据 F. Weierud 在 CryptoCellar(2020)中的翻印。
编号日期路由字母数区分组
A1151942年6月16日SQF 莫吉廖夫(HSSPF Russland Mitte)→ ALQ,经 DQH 柏林223ARTTN
D331942年2月27日SRS1 罗夫诺 → DQH 柏林74KFWOJ
D341942年2月27日SQF 莫吉廖夫 → DSO,Kommandostab RFSS160 + 86DNOSX / DRANR
E721942年2月27日SRS3 Proskurov → SRS1、SRS2 布列斯特178 + 144SBWYY / LENRA
D671942年2月27日SRS3 Proskurov → SRS1、SRS2170 + 158OWQWJ / WNSXO
C43日期为1943年2月28日SRS 基辅 → SRS1138SRXOS

C43 的第二部分因干扰丢失(“2TL SWAMPED QRM”)。E72 第 2 部分有两个组部分难以辨认。Weierud 提醒,副本上的 O 和 Q 很难区分。D67 第 2 行的第二组按报务员自己的核对行(“CTN 2/6 ZAVGO”)读作 ZAVGO。所用的转录见 msgs.txt.

02 A115 及其布莱切利园解密件

A115 是莫吉廖夫发出的第 14 号电报,呼号 SQF,即俄罗斯中部党卫队及警察高级领袖司令部所在的电台;据报头,它于1942年6月16日 2325 时交发,Beaumanor 在 3742 kHz 上抄收,第 51 和第 43 号截听站都抄录了它。Hanyok 的 Eavesdropping on Hell(NSA,2005)追踪了这一条电报从截获到解密的全过程,并翻印了布莱切利园的解密件,即当天德国警察解密件中的第 21 条:

打字解密件:21. DQH de SQF, SQF Nr 14 2325 228. An Rf SS und Chef Orpo. An Strasse Bobruisk-Mogilew, Partisanenkampf: 16 Mann von Pol. Batl. 51 gefallen. Das Dorf Borki, in dem Waffen und Munition gefunden wurden, wurde dem Erdboden gleichgemacht. Die Einwohnerschaft liquidiert. Von Hoeheren SS und Pol.fuehrer Russland Mitte.
布莱切利园对 A115 的解密件,第 21 条。图像:NARA, RG 457, HCC, Box 1386,据 R. J. Hanyok, Eavesdropping on Hell (NSA, 2005) 中的翻印。
An Rf SS und Chef Orpo. An Strasse BOBRUISK–MOGILEW, Partisanenkampf: 16 Mann von Pol. Batl. 51 gefallen. Das Dorf BORKI, in dem Waffen und Munition gefunden wurden, wurde dem Erdboden gleichgemacht. Die Einwohnerschaft liquidiert. Von Höheren SS und Pol.führer Russland Mitte.

致党卫队全国领袖兼秩序警察总长:在博布鲁伊斯克—莫吉廖夫公路上与游击队作战,第 51 警察营十六人阵亡;在其中发现武器弹药的 Borki 村已被夷平;居民已被清除。发自俄罗斯中部党卫队及警察高级领袖。Hanyok 指出今白俄罗斯境内有好几个叫 Borki 的村子,没有确定是哪一个,但这个地方其实很有名:它是莫吉廖夫州基洛夫斯克区的 Borki,1942年6月15日与周围的定居点(Zakrinichye、Krasny Pakhar、Dzerzhinsky、Proletary、Dolgoe Pole、Khvatovka)一同被毁。行动是在游击队袭击莫吉廖夫—博布鲁伊斯克公路之后,由迪勒万格党卫队特别营会同第 8 特别行动队和警察部队实施的;迪勒万格本人的报告称死亡 2,027 人,原址现立有纪念碑。Zhukov 所著迪勒万格部队史引用的第 51 警察营阵亡十六人,与解密件相同,因此6月16日这条电报就是党卫队及警察高级领袖关于 Borki 屠杀的报告。(由读者 Ilya 于2026年9月认定:Zhukov、莫吉廖夫州执行委员会、partizany.by。)由于有这份解密件,Schmeh 2021年的二战密码清单把这组电报标为“partially solved”(部分破解)。

奇数长度

在两份截获件和德方报头中,这条电报都是 228 个字母。去掉区分组剩 223 个,但这种密码按字母对运作,每份加密文本的长度都是偶数。所以德方的文书要么多加了、要么漏掉了一个字母,或者传输中丢了一个字母。它在哪里是可以测出来的。双方格密码对字母对是确定性的,因此布局中同一位置上重复的明文字母对会产生重复的密文字母对,而只有从正确的起点开始配对,这些重复才会显现。从末尾开始配对,A115 有 19 种共 25 个重复双字母;从开头配对只有 8 个,属于偶然水平。因此那个多余或缺失的字母位于前九个左右之中,其余文本配对正常。

03 2月27日的统一密钥

Weierud 把区分组读作该组的后三个字母(顺序不限),并引用布莱切利园的一条注记,说每个日密钥配发四个区分组。照此理解,并允许其中一组有 O/Q 混淆,2月27日的七个部分恰好用了四个:

区分组部分
WOJD33(KFWOJ);D67 第 1 部分(OWQWJ,读作 OWOWJ)
OSXD34 第 1 部分(DNOSX);D67 第 2 部分(WNSXO)
ANRD34 第 2 部分(DRANR);E72 第 2 部分(LENRA)
WYYE72 第 1 部分(SBWYY)

同一条电报的两个部分带有不同的区分组,而莫吉廖夫和 Proskurov 的通信又共用它们。因此这四个区分组是同一密钥的四个名称,全部七个部分、970 个字母可以合在一起攻击。C43 的 XOS 也就是 OSX,这说明它要么日期错了一年,要么某个密钥使用了不止一天;Weierud 已经注意到这个共用的指示组。C43 没有并入合并文本。

04 系统

有两份手册存世,这里都查阅了:1940年12月2日 OKH 的草案 Schlüsselanleitung zum Doppelkastenschlüssel,以及1941年12月 OKW 下发的版本。两者一致。有两个 5×5 方格。明文写成每行 17 个字母的双行,上下对齐的两个字母组成一对;不足一个双行的剩余部分对半分开。每一对都用同一组方格加密两次。当一对中的两个字母落在同一行时,各自取其右邻作为密文字母。拼写规则是 CH → Q、ß → SZ,连字符写作 STRIQ。参考实现 dk.py能逐字母重现两份手册的示例(1941年的手册在第 5 页印作 tylhu,第 6 页则正确地印作 tvlhu)。

据 NSA 的 Cryptologic Quarterly 描述,陆军的“NI”野战密码是同一方案,只是每行 21 个字母,同行字母对取左邻;它的示例(EU → VR → QZ、en → FL → NC、ea → HK → TT)也能精确重现。警察用的是哪种变体没有文献记载,所以这里每种攻击都在两种变体下各跑了一遍。1942年2月属于双方格时期,这一点本身依据的是 Hanyok:警察在1941年9月至11月初之间从双重换位改为双重 Playfair,而布莱切利园发现新系统更容易解密。

跨行恒等式

关键在于两次加密。第一轮之后,一对中的第一个字母已经取自方格 B,但第二轮却在方格 A 中查它。因此每个字母都同时按它在两个方格中的位置被使用。把每个字母写成四个坐标:它在 A 中的行和列,以及在 B 中的行和列。在跨行情形下解密一个密文字母对 (c1, c2),得到中间字母对

v1 = A[ B-row of c1 ][ A-col of c2 ]      v2 = B[ A-row of c2 ][ B-col of c1 ]

和明文字母对

p1 = A[ B-row of v1 ][ A-col of v2 ]      p2 = B[ A-row of v2 ][ B-col of v1 ]

每一步都把一个 A 坐标和一个 B 坐标混在一起。两轮之间夹着一个映射:从每个字母在方格 A 中的格子到它在方格 B 中的格子,即 25 个格子的一个随机置换。第 06 节表明,挡住攻击的是这个置换,而不是密钥的规模。

05 尝试过的方法

没有对照,失败的搜索什么也证明不了,所以每种针对两次加密的攻击都先在合成文本上运行:970 个字母的德语文本,用随机方格加密两次,所用工具为 mksyn.py 和 dk.py,各部分长度与真实电报相同。得分是基于 25 字母德语表的每字母四字母组对数概率(build_lm.py);德语文本约为 −3.9,随机字母约为 −6。

假设或方法结果结论
单次加密,七个部分合并,行长 1–30,字母对按书写顺序和倒序最好 −5.91 每字母,而德语约为 −3.9排除
单次加密,按部分和按区分组分别处理,行长 1、17 和 21,两种字母对顺序−5.0 到 −5.6,正是短文本对噪声过拟合的水平排除
两次加密,基于四字母组的模拟退火(dksolve2.cs)在 970 个字母的合成文本上始终停留在噪声水平(−6.0);从距真密钥四次交换处出发,也爬不回去在对照上失败
分阶段的单字母 → 双字母 → 四字母组评分;最速上升迭代局部搜索;并行回火;重标记移动;行/列乘积得分;GPU 上的 Sinkhorn 松弛(relax.py);把明文当作变量的硬 EM(emsolve.cs)在合成文本上全部失败。随机起点停滞在单字母得分 −1.39 到 −1.42,而真密钥的得分是 −1.221在对照上失败
同上,但给定真实的 A 格 → B 格置换,只搜索字母标记仍停滞在 −1.42在对照上失败
用 20 到 37 对已知明密对做 SAT 求解(z3)任何情形下 15 分钟内都没有结果无定论
已知明文,中间相遇得分(kpsolve.cs):把明文字母对加密一次,把密文字母对解密一次,按两组中间结果逐行、逐列的吻合程度评分从随机起点出发,用 111 对合成明密对约一分钟即可复原方格(111 对全部一致);80 对接近成功(80 对中 68 对一致);60 对或更少,或有 10% 的明密对有误时失败在对照上有效
不依赖密钥,把布莱切利园的 A115 文本与其密文对齐(align115c.py, align115h.py):重复的密文字母对必须对应重复的明文字母对;对拼写、X 分隔符、数字拼写、地址和署名位置、Borki / Mohilew / Bobruiisk 等变体、222 或 224 个字母、行长 1–24 做精确回溯没有一致的对齐。同样的搜索能在 35 秒内找回一份合成拼写无法对齐

单次加密的结果排除了这一假设:合并文本有 970 个字母,远多于单轮双方格所需,而找到的最佳密钥离德语还差得远。两次加密的结果则对明文什么也排除不了,因为同样的方法在已知答案的文本上也会失败。它们衡量的只是攻击方法本身。

对齐的结果则有信息量。A115 中重复的密文字母对是真实存在的(第 02 节),而给对齐器一份按它所尝试的某种方式拼写的合成文本,它能找出来。在 A115 上,没有任何拼写、分隔符、数字、布局和长度的组合能让每个重复密文字母对都落在重复明文字母对上。要么实际加密的词句与布莱切利园的译本不同(缩写、语序,或额外内容如更长的地址),要么警察的布局与两份手册都不一样。

06 第二轮加密为何能挫败局部搜索

这与公开记录相符。Lasry、Norbert 等人的爬山法求解器能破译 100 到 150 个字母的单轮双方格文本;陆军的 Truppenschlüssel 是其简化的单轮近亲,已经仅凭存世电报的密文被破译。但没有任何已发表的攻击能破解通过同一组方格的两轮加密。这里的合成实验显示了难点所在。

已知明文改变了这一点,因为它把第二轮从评分中去掉了。 kpsolve.cs 把每个已知明文字母对正向加密一次,把对应的密文字母对反向解密一次,要求两组中间结果逐行、逐列吻合。每一半都只是单轮,这就给了局部搜索一个梯度;在合成对照上,大约 80 对就够了。

07 怎样才能完成

未破解 已结项;唯密文攻击失败。有两条路可以重新开启。

什么为何可行
同一密钥下约 80 对明密对kpsolve.exe 随后就能复原方格,用这个密钥即可读出2月27日的全部七个部分。来源可以是布莱切利园自己对当天通信的解密件,应在 TNA HW 16/17 中(德国警察解密件原文;HW 16/18 为1942年5–6月),未上网;或者是这些电报共有的一段较长的固定格式报头或地址。对 A115 而言,这些明密对需要当时实际加密的确切德语措辞。
A115 对齐这还能确定警察所用的布局——每行 17 还是 21 个字母、取左邻还是右邻——并显示警察的方格是随机的还是由关键词构造的。如果是由关键词构造的,就可以对2月27日的电报做关键词搜索。
针对同一组方格两轮加密的全新唯密文思路这里尝试过的方法都提供不了,已发表的方法也没有。

08 资料来源

所有内容都在项目仓库的 targets/orpo1942/ 在项目代码库中: msgs.txt (密文,已去掉区分组), dk.py (参考实现,已在两份手册上验证), build_lm.py (25 字母德语 n 元组表), mksyn.py (合成测试集), dksolve2.cs (模拟退火、迭代局部搜索以及带分阶段评分的回火), kpsolve.cs (已知明文求解器), emsolve.cs 和 relax.py (失败的攻击,留档备查), align115c.py 和 align115h.py (A115 对齐器)、原始 PDF,以及 NOTES.md,其中有这次尝试的完整记录。