PXSXH IHVGD OLIXA DYZZT
RFBLQ XPLPN MSLSB ZZSFP
… Rovno to Berlin, 27 February 1942

Mogilev, Rovno, Proskurov → Berlin · Doppelkastenschlüssel, two boxes, two passes · February and June 1942 · not solved

German police double-box radiograms, 1942

Six radio messages of the Ordnungspolizei on the Eastern Front, intercepted at Beaumanor, kept in NSA’s Historic Cryptographic Collection at NARA, and published by Frode Weierud (CryptoCellar, 5 August 2020); Klaus Schmeh posted them as unsolved on 30 August 2020. One of them has a Bletchley decrypt; the other five do not.

The five messages of 27 February 1942 are one key, 970 letters. No ciphertext-only attack tried here breaks them, and none breaks synthetic text of the same size either. A known-plaintext solver would, from about 80 pairs.

Daniel Bourdeau · attempted

Summary. In 1942 the German Order Police enciphered their radio traffic in the Army’s double-box system: two 5×5 boxes, each letter pair enciphered twice through the same boxes. Weierud published six intercepts. The message of 16 June 1942 from Mogilev has a plaintext, the Bletchley decrypt reproduced by Hanyok in Eavesdropping on Hell: sixteen men of Police Battalion 51 killed on the Bobruisk–Mogilev road, and the village of Borki razed and its inhabitants “liquidated”. The five messages of 27 February 1942 have none. Their discriminator groups show that all five, seven parts and 970 letters, are enciphered in one daily key. Every ciphertext-only attack tried here fails on them: single encipherment is excluded outright, and for the double encipherment annealing, staged scoring, tempering, relaxation and EM all fail on a synthetic 970-letter text with a known key as well, so the failure on the real text says nothing about the plaintext. The failure is measured: the true key sits in a basin eight to ten swaps wide, and the second pass leaves the search nothing to climb outside it. A known-plaintext solver recovers the boxes from about 80 plaintext–ciphertext pairs. The obvious source of pairs, Bletchley’s text of the June message, does not align with its ciphertext under any spelling, layout or length tried, so the words enciphered were not the words in the decrypt. Status: not solved. What would finish it is about 80 known pairs for one key: Bletchley’s decrypts of the 27 February traffic (TNA HW 16/17, not online), or the exact German wording of the June message.

01 The messages

Weierud’s paper, German Police Doppelkastenschlüssel Messages, transcribes six messages and reproduces the teleprinter copies and W/T Red Forms from NARA, RG 457, Historic Cryptographic Collection, Box 1386 (NR. 4417, “German WWII Police and SS Traffic”) and Box 202 (NR. 976, “Study of German Police Traffic”). Each is labelled here by its Beaumanor serial (BMR A115, D33 and so on). The first five-letter group of each part is the discriminator, which names the key and is not part of the text; the letter counts below are without it.

W/T Red Form from intercept station 51, 16 June: Police, from SQF to DQH, 3742 kHz, preamble SQF NR 14 2325 228 ALQ, and the first cipher groups ARTTN FMXBW OIYSU OGILL
The Red Form from intercept station No. 51 for the message of 16 June 1942: from SQF (Mogilev) to DQH (Berlin) on 3742 kHz, preamble NR 14 2325 228 ALQ, then the discriminator ARTTN and the text. NARA, RG 457, HCC, Box 202, as reproduced by Weierud (CryptoCellar, 2020).
serialdateroutelettersdiscriminator
A11516 June 1942SQF Mogilev (HSSPF Russland Mitte) → ALQ via DQH Berlin223ARTTN
D3327 Feb 1942SRS1 Rovno → DQH Berlin74KFWOJ
D3427 Feb 1942SQF Mogilev → DSO, Kommandostab RFSS160 + 86DNOSX / DRANR
E7227 Feb 1942SRS3 Proskurov → SRS1, SRS2 Brest178 + 144SBWYY / LENRA
D6727 Feb 1942SRS3 Proskurov → SRS1, SRS2170 + 158OWQWJ / WNSXO
C43dated 28 Feb 1943SRS Kiev → SRS1138SRXOS

The second part of C43 was lost to interference (“2TL SWAMPED QRM”). Two groups of E72 part 2 are partly illegible. Weierud warns that O and Q are hard to tell apart on the copies. In D67 the second group of line 2 is taken as ZAVGO, following the operator’s own check line (“CTN 2/6 ZAVGO”). The transcriptions used are in msgs.txt.

02 A115 and its Bletchley decrypt

A115 is Nr. 14 from Mogilev, callsign SQF, the station at the headquarters of the Higher SS and Police Leader Russia Centre, handed in at 2325 on 16 June 1942 by its preamble and taken down at Beaumanor on 3742 kHz; stations 51 and 43 both copied it. Hanyok’s Eavesdropping on Hell (NSA, 2005) follows this one message from intercept to decrypt, and reproduces Bletchley’s decrypt as entry 21 of that day’s German police decrypts:

Typed decrypt: 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.
Bletchley’s decrypt of A115, entry 21. NARA, RG 457, HCC, Box 1386, as reproduced in 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.

To the Reichsführer SS and the Chief of the Order Police: in a fight with partisans on the Bobruisk–Mogilev road, sixteen men of Police Battalion 51 were killed; the village of Borki, where weapons and ammunition had been found, was levelled; the inhabitants were liquidated. From the Higher SS and Police Leader Russia Centre. Hanyok notes that several villages named Borki exist in present-day Belarus and does not locate this one. The decrypt is what makes this group of messages “partially solved” in Schmeh’s 2021 list of unsolved Second World War ciphers.

An odd count

The message is 228 letters in both intercepts and in the German preamble. Without the discriminator that leaves 223, but the cipher works on pairs and every enciphered text has an even length. The German clerk therefore added or dropped a letter, or a letter was lost in transmission. Where it went can be measured. A double-box cipher is deterministic on pairs, so a repeated plaintext pair in the same position of the layout gives a repeated cipher pair, and the pairs only show their repeats when they are counted from the right starting point. Counted from the end, A115 has 25 repeated digraphs of 19 types. Counted from the start it has 8, which is chance level. So the stray letter lies among the first nine or so, and the rest of the text pairs up normally.

03 One key for 27 February

Weierud reads the discriminator as the last three letters of the group, in any order, and cites the Bletchley note that four discriminators were issued with each daily key. Read that way, with the O/Q confusion allowed for in one group, the seven parts of 27 February use exactly four:

discriminatorparts
WOJD33 (KFWOJ); D67 part 1 (OWQWJ, read OWOWJ)
OSXD34 part 1 (DNOSX); D67 part 2 (WNSXO)
ANRD34 part 2 (DRANR); E72 part 2 (LENRA)
WYYE72 part 1 (SBWYY)

Two parts of one message carry different discriminators, and the Mogilev and Proskurov traffic shares them. The four are therefore four names for one key, and all seven parts, 970 letters, can be attacked together. C43’s XOS is also OSX, which suggests either that it is misdated by a year or that a key ran for more than one day; Weierud already noticed the shared indicator. C43 was kept out of the pooled text.

04 The system

Two manuals survive and both were read here: the OKH draft Schlüsselanleitung zum Doppelkastenschlüssel of 2 December 1940 and the OKW issue of December 1941. They agree. There are two 5×5 boxes. The plaintext is written in double lines of 17 letters, and the pairs are the letters that stand one under the other; a remainder too short for a double line is split in half. Each pair is enciphered twice with the same boxes. When the two letters of a pair fall in the same row, each cipher letter is taken from the right. The spelling rules are CH → Q, ß → SZ, and the hyphen written STRIQ. The reference implementation, dk.py, enciphers both manuals’ worked examples letter for letter (the 1941 manual prints tylhu on p. 5 for the tvlhu it has correctly on p. 6).

The Army’s “NI” field cipher, as NSA’s Cryptologic Quarterly describes it, is the same scheme with 21-letter lines and the left neighbour for same-row pairs; its worked examples (EU → VR → QZ, en → FL → NC, ea → HK → TT) also reproduce exactly. Which variant the police used is not documented, so every attack here was run under both. That February 1942 is the double-box period at all rests on Hanyok: the police changed from double transposition to double Playfair between September and early November 1941, and Bletchley found the new system easier to read.

The cross-row identity

The double pass is what matters. After the first pass the first letter of a pair has been taken from box B, but the second pass looks it up in box A. So each letter is used by its position in both boxes. Write each letter as four coordinates: its row and column in A and its row and column in B. Deciphering a cipher pair (c1, c2) in the cross-row case gives the intermediate pair

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

and the plaintext pair

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

Every step mixes an A-coordinate with a B-coordinate. Between the two passes sits the map from each letter’s cell in box A to its cell in box B, a random permutation of the 25 cells. Section 06 shows why that permutation, rather than the size of the key, is what stops the attacks.

05 What was tried

A failed search proves nothing without a control, so each attack on the double encipherment was first run on synthetic text: 970 letters of German text enciphered twice with random boxes by mksyn.py and dk.py, in parts of the same lengths as the real ones. Scores are quadgram log-probabilities per letter from 25-letter German tables (build_lm.py); German text scores about −3.9 and random letters about −6.

hypothesis or methodresultverdict
Single encipherment, all seven parts pooled, line length 1–30, pairs in written and reversed orderbest −5.91 per letter against about −3.9 for Germanexcluded
Single encipherment per part and per discriminator group, line lengths 1, 17 and 21, both pair orders−5.0 to −5.6, the level at which short texts overfit noiseexcluded
Double encipherment, simulated annealing on quadgrams (dksolve2.cs)on the synthetic 970-letter text it never leaves noise (−6.0); started four swaps from the true key, it does not climb backfails on its control
Staged unigram → bigram → quadgram scoring; steepest-ascent iterated local search; parallel tempering; relabelling moves; a row/column product score; Sinkhorn relaxation on GPU (relax.py); hard EM with the plaintext as a variable (emsolve.cs)all fail on the synthetic text. Random starts stall at unigram score −1.39 to −1.42, where the true key scores −1.221fails on its control
The same, with the true A-cell → B-cell permutation given and only the letter labelling searchedstill stalls at −1.42fails on its control
SAT solving (z3) with 20 to 37 known pairsno answer within 15 minutes for any caseinconclusive
Known plaintext, meet-in-the-middle score (kpsolve.cs): encipher the plaintext pair once, decipher the cipher pair once, and score row-by-row and column-by-column agreement of the two intermediatesfrom random starts, recovers the boxes from 111 synthetic pairs in about a minute (111 of 111 consistent); 80 pairs nearly (68 of 80); fails at 60 or fewer, or with 10% of the pairs wrongworks on its control
Key-free alignment of Bletchley’s A115 text to its ciphertext (align115c.py, align115h.py): repeated cipher pairs must match repeated plaintext pairs; exact backtracking over spellings, X separators, numbers written out, address and signature placement, Borki / Mohilew / Bobruiisk variants, 222 or 224 letters, line lengths 1–24no consistent alignment. The same search recovers a synthetic spelling in 35 secondsno alignment

The single-encipherment results exclude that hypothesis: the pooled text is 970 letters, far more than a single-pass double box needs, and the best key found is nowhere near German. The double-encipherment results exclude nothing about the plaintext, because the same methods fail on text where the answer is known. They measure the attacks, not the messages.

The alignment result does say something. A115’s repeated cipher pairs are real (section 02), and the aligner, given a synthetic text spelled in one of the ways it tries, finds it. On A115 no combination of spellings, separators, numbers, layout and length makes every repeated cipher pair fall on a repeated plaintext pair. Either the words enciphered differ from Bletchley’s rendering, through abbreviation, order or extra matter such as a longer address, or the police layout differs from both manuals.

06 Why the second pass defeats local search

This matches the public record. Hill-climbing solvers by Lasry, Norbert and others break single-pass double-box texts of 100 to 150 letters, and the Army’s Truppenschlüssel, a simplified one-pass relative, has been broken ciphertext-only from surviving messages. No published attack breaks a double pass through the same boxes. The synthetic runs here show where the difficulty lies.

Known plaintext changes this, because it removes the second pass from the scoring. kpsolve.cs enciphers each known plaintext pair once forward, deciphers its cipher pair once backward, and asks the two intermediates to agree row by row and column by column. Each half is a single pass, which gives the local search a gradient; on the synthetic controls about 80 pairs are enough.

07 What would finish it

not solved  Closed on the ciphertext alone. Two routes would reopen it.

whatwhy it would work
About 80 plaintext–ciphertext pairs for one keykpsolve.exe then recovers the boxes, and the key reads all seven parts of 27 February. The source would be Bletchley’s own decrypts of that day’s traffic, which should be in TNA HW 16/17 (verbatim German police decrypts; HW 16/18 is May–June 1942), not online; or a long stereotyped preamble or address common to the messages. For A115 the pairs need the exact German wording that was enciphered.
A115 alignedIt would also settle the police layout, lines of 17 or 21 and the left or right neighbour, and show whether police boxes were random or built from a keyword. Keyword-built boxes would open a keyword search on 27 February.
A new ciphertext-only idea for a second pass through the same boxesNothing tried here provides one, and nothing published does.

08 Sources

Everything is in orpo1942/ in the project repository: msgs.txt (the ciphertexts, discriminators removed), dk.py (reference implementation, verified on both manuals), build_lm.py (25-letter German n-gram tables), mksyn.py (synthetic test sets), dksolve2.cs (annealing, iterated local search and tempering with staged scoring), kpsolve.cs (the known-plaintext solver), emsolve.cs and relax.py (failed attacks, kept for the record), align115c.py and align115h.py (the A115 aligners), the source PDFs, and NOTES.md, which holds the full record of the attempt.