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 等)標示。每個部分的第一個五字母組是區分組,它指明所用金鑰,不屬於正文;下面的字母數不含區分組。
| 編號 | 日期 | 路由 | 字母數 | 區分組 |
|---|---|---|---|---|
| A115 | 1942年6月16日 | SQF 莫吉廖夫(HSSPF Russland Mitte)→ ALQ,經 DQH 柏林 | 223 | ARTTN |
| D33 | 1942年2月27日 | SRS1 羅夫諾 → DQH 柏林 | 74 | KFWOJ |
| D34 | 1942年2月27日 | SQF 莫吉廖夫 → DSO,Kommandostab RFSS | 160 + 86 | DNOSX / DRANR |
| E72 | 1942年2月27日 | SRS3 Proskurov → SRS1、SRS2 佈列斯特 | 178 + 144 | SBWYY / LENRA |
| D67 | 1942年2月27日 | SRS3 Proskurov → SRS1、SRS2 | 170 + 158 | OWQWJ / WNSXO |
| C43 | 日期為1943年2月28日 | SRS 基輔 → SRS1 | 138 | SRXOS |
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 條:
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日的七個部分恰好用了四個:
| 區分組 | 部分 |
|---|---|
| WOJ | D33(KFWOJ);D67 第 1 部分(OWQWJ,讀作 OWOWJ) |
| OSX | D34 第 1 部分(DNOSX);D67 第 2 部分(WNSXO) |
| ANR | D34 第 2 部分(DRANR);E72 第 2 部分(LENRA) |
| WYY | E72 第 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 是其簡化的單輪近親,已經僅憑存世電報的密文被破譯。但沒有任何已發表的攻擊能破解透過同一組方格的兩輪加密。這裡的合成實驗顯示了難點所在。
- 真金鑰是最優解,但很窄。在單字母得分下,真金鑰是最佳金鑰(−1.221)。它的盆地只有大約八到十次交換寬。在四字母組得分下還要更窄:從距真金鑰四次交換處開始的模擬退火爬不回去。
- 盆地之外無坡可爬。隨機起點停滯在 −1.39 到 −1.42。它們到達的區域性最優解與真方格沒有任何共同的行列結構:以其行列分組相對於金鑰的精確率來衡量,得分約為六分之一,即偶然水平。
- 問題不在規模。把方格 A 與方格 B 之間真實的格子置換告訴求解器,只剩字母標記待求,也無濟於事:仍然停滯在 −1.42。難點在於經由一個隨機格子置換的共軛(第 04 節)。可能的機制是:部分正確的金鑰會給出錯誤的中間字母,第二輪又把它們送進不相干的格子,所以部分正確換不來任何得分。
已知明文改變了這一點,因為它把第二輪從評分中去掉了。 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 資料來源
- Frode Weierud,German Police Doppelkastenschlüssel Messages,Crypto Cellar Research,2020年8月5日,取自 NARA, RG 457, HCC, Box 1386(NR. 4417)和 Box 202(NR. 976),含電傳副本、第 51 和第 43 號站的紅色表格,以及布萊切利園關於報頭的註記。
- Klaus Schmeh,“Can you solve these double-box messages from WW2?”,Cipherbrain,2020年8月30日。
- OKH,Schlüsselanleitung zum Doppelkastenschlüssel(草案,1940年12月2日),以及 OKW,Vorläufige Schlüsselanleitung zum Doppelkastenschlüssel(1941年12月),均據 cryptocellar.org 上的掃描件。
- Robert J. Hanyok,Eavesdropping on Hell: Historical Guide to Western Communications Intelligence and the Holocaust, 1939–1945(NSA Center for Cryptologic History,2005):A115 的截獲件、紅色表格和解密件,以及1941年秋警察改用雙重 Playfair 一事。
- “WWII German Army Field Cipher”,NSA Cryptologic Quarterly,經由 Wayback Machine:陸軍 NI 變體及其示例。
- Modern Cryptanalysis of the Truppenschlüssel(2021年10月22日):陸軍簡化的單輪近親,以及兩份手冊的來源。
所有內容都在專案倉庫的 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,其中有這次嘗試的完整記錄。