01 電報
Weierud の論文 German Police Doppelkastenschlüssel Messages は6通の電報を転写し、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 など)で呼ぶ。各部分の最初の5文字群は識別群で、鍵を示し、本文には含まれない。以下の文字数はそれを除いたものである。
| 通し番号 | 日付 | 経路 | 文字数 | 識別群 |
|---|---|---|---|---|
| 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 プロスクロフ → SRS1、SRS2 ブレスト | 178 + 144 | SBWYY / LENRA |
| D67 | 1942年2月27日 | SRS3 プロスクロフ → SRS1、SRS2 | 170 + 158 | OWQWJ / WNSXO |
| C43 | 1943年2月28日付 | SRS キエフ → SRS1 | 138 | SRXOS |
C43 の第2部分は混信で失われた(“2TL SWAMPED QRM”)。E72 第2部分の2つの文字群は一部判読できない。Weierud は、写しでは O と Q の区別が難しいと注意している。D67 では2行目の2番目の文字群を、通信士自身の確認行(“CTN 2/6 ZAVGO”)に従って ZAVGO とした。使用した転写は msgs.txt.
02 A115 とブレッチリーの解読文
A115 はモギリョフからの Nr. 14 で、呼出符号は SQF、中央ロシア親衛隊・警察高級指導者の司令部にある局である。前文によれば1942年6月16日2325時に発信され、Beaumanor で 3742 kHz で受信された。第51局と第43局の両方がこれを書き取っている。Hanyok の Eavesdropping on Hell(NSA、2005年)は、この1通の電報を傍受から解読まで追い、ブレッチリーの解読文をその日のドイツ警察解読文の第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警察大隊の16人が戦死した。武器と弾薬が発見された Borki 村は破壊された。住民は抹殺された。中央ロシア親衛隊・警察高級指導者より。Hanyok は、現在のベラルーシには Borki という名の村がいくつもあると記し、この村を特定していないが、場所はよく知られている。モギリョフ州キロフスク地区の Borki で、1942年6月15日に周辺の集落(Zakrinichye、Krasny Pakhar、Dzerzhinsky、Proletary、Dolgoe Pole、Khvatovka)とともに破壊された。作戦は、モギリョフ–ボブルイスク道路へのパルチザン攻撃のあと、Dirlewanger の親衛隊特別大隊が特別行動隊第8隊(Einsatzkommando 8)および警察部隊とともに実行した。Dirlewanger 自身の報告は死者を2,027人と数えており、現地には現在記念碑が建っている。Dirlewanger 部隊に関する Zhukov の歴史書は、解読文と同じ第51警察大隊の戦死者16人を挙げている。したがって6月16日の電報は、親衛隊・警察高級指導者による Borki 虐殺の報告である。(読者 Ilya による同定、2026年9月:Zhukov、モギリョフ州執行委員会、partizany.by。)この解読文があるため、Schmeh の2021年の第二次世界大戦の暗号一覧は、この電報群を「部分的に解読」としている。
奇数の文字数
この電報は両方の傍受でもドイツ側の前文でも228文字である。識別群を除くと223文字になるが、この暗号はペア単位で働き、暗号化されたテキストはすべて偶数長になる。したがってドイツの事務員が1文字足したか落としたか、送信中に1文字失われたかである。その位置は計測できる。二重ボックス暗号はペアに対して決定論的なので、配置の同じ位置にある繰り返しの平文ペアは繰り返しの暗号ペアを生み、ペアは正しい開始点から数えたときにだけ繰り返しを示す。末尾から数えると、A115 には19種類25個の繰り返し二字組がある。先頭から数えると8個で、これは偶然の水準である。したがって余分な1文字は最初の9文字ほどの中にあり、残りのテキストは正常にペアになる。
03 2月27日の1つの鍵
Weierud は識別群を、その文字群の最後の3文字を順不同で読んだものとし、各日次鍵とともに4つの識別群が発行されたというブレッチリーのメモを引いている。そう解釈し、1つの文字群で O/Q の混同を考慮すると、2月27日の7つの部分はちょうど4つの識別群を使っている。
| 識別群 | 部分 |
|---|---|
| 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) |
1通の電報の2つの部分が異なる識別群を持ち、モギリョフとプロスクロフの通信がそれらを共有している。したがって4つは1つの鍵の4つの名前であり、7つの部分、970文字すべてをまとめて攻撃できる。C43 の XOS も OSX であり、日付が1年ずれているか、鍵が1日より長く使われたかを示唆する。Weierud はすでにこの共通の標識に気づいていた。C43 はまとめたテキストから外した。
04 方式
2つのマニュアルが現存し、ここでは両方を参照した。1940年12月2日の OKH 草案 Schlüsselanleitung zum Doppelkastenschlüssel と、1941年12月の OKW 版である。両者は一致している。5×5のボックスが2つある。平文は17文字の二重行に書かれ、上下に並ぶ文字がペアになる。二重行に足りない残りは半分に分ける。各ペアは同じボックスで2回暗号化される。ペアの2文字が同じ行にあるときは、各暗号文字を右隣から取る。綴りの規則は CH → Q、ß → SZ で、ハイフンは STRIQ と書く。参照実装 dk.pyは、両マニュアルの例題を1文字ずつ正確に暗号化する(1941年のマニュアルは p. 6 では正しく tvlhu としているものを、p. 5 では tylhu と印刷している)。
NSA の Cryptologic Quarterly が記述する陸軍の「NI」野戦暗号は、21文字の行を使い、同じ行のペアでは左隣を取る点を除いて同じ方式である。その例題(EU → VR → QZ、en → FL → NC、ea → HK → TT)も正確に再現できる。警察がどちらの変種を使ったかは記録がないので、ここでの攻撃はすべて両方で実行した。そもそも1942年2月が二重ボックスの時期だということは Hanyok に依拠している。警察は1941年9月から11月初めのあいだに二重転置から二重プレイフェアに切り替え、ブレッチリーは新しい方式のほうが解読しやすいと見た。
行をまたぐ恒等式
重要なのは二重の処理である。1回目の処理のあと、ペアの最初の文字はボックス B から取られているが、2回目の処理ではそれをボックス A で引く。したがって各文字は両方のボックスにおける位置によって使われる。各文字を4つの座標、すなわち 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 座標を混ぜる。2回の処理のあいだには、各文字のボックス A のセルからボックス B のセルへの写像、つまり25セルのランダムな置換がある。06節で示すように、攻撃を止めるのはこの置換であって、鍵の大きさではない。
05 試したこと
対照実験のない探索の失敗は何も証明しないので、二重暗号化に対する各攻撃はまず合成テキストで実行した。970文字のドイツ語テキストを mksyn.py と dk.pyでランダムなボックスにより2回暗号化し、実際のものと同じ長さの部分に分けた。スコアは25文字ドイツ語表(build_lm.py)による1文字あたりの4-gram 対数確率である。ドイツ語テキストは約 −3.9、ランダムな文字は約 −6 になる。
| 仮説または手法 | 結果 | 判定 |
|---|---|---|
| 単一暗号化、7つの部分すべてをまとめる、行の長さ1–30、ペアは書かれた順と逆順 | 最良で1文字あたり −5.91、ドイツ語は約 −3.9 | 除外 |
| 単一暗号化、部分ごとおよび識別群のグループごと、行の長さ1、17、21、両方のペア順 | −5.0 から −5.6、短いテキストがノイズに過剰適合する水準 | 除外 |
二重暗号化、4-gram に対する焼きなまし法(dksolve2.cs) | 970文字の合成テキストではノイズの水準(−6.0)から抜け出さない。真の鍵から4回の入れ替えの位置から始めても、登って戻れない | 対照実験で失敗 |
段階的な unigram → bigram → 4-gram 採点、最急上昇の反復局所探索、パラレルテンパリング、ラベル付け替えの手、行/列積スコア、GPU 上の Sinkhorn 緩和(relax.py)、平文を変数とするハード EM(emsolve.cs) | いずれも合成テキストで失敗。ランダムな開始点は unigram スコア −1.39 から −1.42 で停滞し、真の鍵は −1.221 | 対照実験で失敗 |
| 同じ条件で、A セル → B セルの真の置換を与え、文字のラベル付けだけを探索 | それでも −1.42 で停滞 | 対照実験で失敗 |
| 既知ペア20–37組での SAT ソルバー(z3) | どの場合も15分以内に答えが出ない | 決定不能 |
既知平文、中間一致スコア(kpsolve.cs):平文ペアを1回暗号化し、暗号ペアを1回復号して、2つの中間値の行ごと・列ごとの一致を採点する | ランダムな開始点から、111組の合成ペアで約1分でボックスを復元(111組中111組が整合)。80組ではほぼ復元(80組中68組)。60組以下、またはペアの10%が誤っていると失敗 | 対照実験で成功 |
ブレッチリーの A115 テキストと暗号文との鍵なしの対応づけ(align115c.py, align115h.py):繰り返しの暗号ペアは繰り返しの平文ペアに一致しなければならない。綴り、X 区切り、数の綴り書き、宛名と署名の位置、Borki / Mohilew / Bobruiisk の変種、222文字または224文字、行の長さ1–24 にわたる厳密なバックトラッキング | 整合する対応づけはない。同じ探索は合成の綴りを35秒で復元する | 対応づけ不可 |
単一暗号化の結果はその仮説を除外する。まとめたテキストは970文字で、1回処理の二重ボックスに必要な量をはるかに超えており、見つかった最良の鍵はドイツ語には程遠い。二重暗号化の結果は平文について何も除外しない。同じ手法が答えの分かっているテキストで失敗するからである。測っているのは攻撃のほうだけである。
対応づけの結果には情報がある。A115 の繰り返し暗号ペアは本物であり(02節)、対応づけツールは、試す綴りの1つで書かれた合成テキストを与えられれば、それを見つける。A115 では、綴り、区切り、数、配置、長さのどんな組み合わせでも、すべての繰り返し暗号ペアを繰り返し平文ペアに当てはめることはできない。暗号化された語が、省略、語順、あるいはより長い宛名などの追加事項によってブレッチリーの訳文と異なるか、警察の配置が両マニュアルと異なるかのどちらかである。
06 2回目の処理が局所探索を阻む理由
これは公開された記録と一致する。Lasry、Norbert らによる山登り法のソルバーは、100–150文字の1回処理の二重ボックステキストを解読し、陸軍の Truppenschlüssel(1回処理の簡略化された親戚)は、現存する電報から暗号文のみで解読されている。同じボックスによる二重の処理を解読した公刊の攻撃はない。ここでの合成実験は、困難がどこにあるかを示す。
- 真の鍵は最適解だが、狭い最適解である。unigram スコアでは真の鍵が最良の鍵である(−1.221)。その盆地は入れ替え8–10回ほどの幅しかない。4-gram スコアではさらに狭く、真の鍵から4回の入れ替えの位置から始めた焼きなまし法は登って戻れない。
- 盆地の外には登るべきものがない。ランダムな開始点は −1.39 から −1.42 で停滞する。そこで到達する局所最適解は、真のボックスと行や列の構造を何も共有していない。行と列のグループ分けの精度を鍵に対して測ると約6分の1で、これは偶然の水準である。
- 大きさは問題ではない。ボックス A とボックス B のあいだのセルの真の置換をソルバーに与え、文字のラベル付けだけを探させても役に立たない。やはり −1.42 で停滞する。困難は、ランダムなセル置換による共役(04節)にある。考えられるメカニズムはこうである。部分的に正しい鍵は誤った中間文字を生み、2回目の処理がそれを無関係なセルに送るので、部分的な正しさがスコアにならない。
既知平文はこれを変える。採点から2回目の処理を取り除くからである。 kpsolve.cs は、既知の平文ペアを1回だけ順方向に暗号化し、その暗号ペアを1回だけ逆方向に復号して、2つの中間値が行ごと・列ごとに一致することを求める。どちらの半分も1回の処理なので、局所探索に勾配が生まれる。合成の対照実験では約80組で十分である。
07 完成させるには何が必要か
未解読 終了。暗号文のみの攻撃は失敗した。再開できる道が2つある。
| 何か | それが有効な理由 |
|---|---|
| 1つの鍵について約80組の平文–暗号文ペア | kpsolve.exe でボックスが復元でき、その鍵で2月27日の7つの部分すべてが読める。供給源は、その日の通信のブレッチリー自身の解読文で、TNA HW 16/17(ドイツ警察解読文の逐語版。HW 16/18 は1942年5–6月)にあるはずだが、オンラインでは公開されていない。あるいは電報に共通する長い定型の前文や宛名である。A115 については、暗号化された正確なドイツ語の文面がペアに必要である。 |
| A115 の対応づけ | 警察の配置(17文字か21文字の行、左隣か右隣か)も決着し、警察のボックスがランダムだったのかキーワードから作られたのかもわかる。キーワードから作られたボックスなら、2月27日についてキーワード探索が可能になる。 |
| 同じボックスによる2回目の処理に対する、暗号文のみからの新しい着想 | ここで試したものはどれもそれを与えず、公刊されたものもない。 |
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年秋の警察の二重プレイフェアへの切り替え。
- “WWII German Army Field Cipher”, NSA Cryptologic Quarterly、Wayback Machine 経由:陸軍の NI 変種とその例題。
- Modern Cryptanalysis of the Truppenschlüssel(2021年10月22日):陸軍の簡略化された1回処理の親戚、および2つのマニュアルの来歴。
すべてはプロジェクトのリポジトリの targets/orpo1942/ プロジェクトのリポジトリ内: msgs.txt (暗号文、識別群を除去)、 dk.py (参照実装、両マニュアルで検証済み)、 build_lm.py (25文字ドイツ語 n-gram 表)、 mksyn.py (合成テストセット)、 dksolve2.cs (段階的採点による焼きなまし法、反復局所探索、テンパリング)、 kpsolve.cs (既知平文ソルバー)、 emsolve.cs と relax.py (失敗した攻撃、記録として保存)、 align115c.py と align115h.py (A115 の対応づけツール)、元の PDF、そして NOTES.md。ここに試行の完全な記録がある。