Op 27 november 1918 stuurde een Duitse zender een radiobericht de ether in. Honderdzeventig tekens, en allemaal uit een alfabet van zes letters: A, D, F, G, V en X. Het werd onderschept, genoteerd en gearchiveerd. En daarna heeft niemand het nog open gekregen. Honderdacht jaar lang.
Tot vorige week. Een ontwikkelaar die online Prinz heet, schreef op 17 september een blogpost waarin hij beweert dat GPT-6 Astra, het nieuwste model van OpenAI, het bericht gekraakt heeft. En het leuke zit niet in het kraken zelf. Het zit in waarom het zo lang duurde.
Hoe ADFGVX werkt
Het Duitse leger gebruikte ADFGVX vanaf juni 1918. Daarvoor bestond al een versie met vijf letters, ADFGX, maar met die extra V kwam er plaats voor het volledige alfabet én de cijfers van 0 tot 9. Die zes letters zijn niet willekeurig gekozen: in morse klinken ze duidelijk verschillend, zodat een radio-operator ze moeilijk door elkaar haalt.
Het systeem werkt in twee stappen.
- Je zet alle letters en cijfers in een raster van zes op zes. Elke rij en elke kolom krijgt een van de zes letters als label. Elk teken van je bericht wordt zo een paar: de letter van de rij plus de letter van de kolom.
- Die lange reeks paren schrijf je rij per rij onder een sleutelwoord. Dan sorteer je de kolommen volgens de alfabetische volgorde van de letters in dat woord, en je leest ze kolom per kolom uit.
Resultaat: je hebt de tekens eerst vervangen en daarna door elkaar geschud. Om terug te gaan heb je zowel het raster als het sleutelwoord nodig, en de Duitsers wisselden die dagelijks.
Vondst. De Fransman Georges Painvin brak ADFGVX-berichten al in 1918 zelf, tijdens de oorlog, met potlood en papier. Hackaday merkte droogjes op dat ze daar eigenlijk meer van onder de indruk waren. Ik snap dat wel.
De sleutel stond gewoon in een boek
Honderden van die Duitse radioberichten zijn intussen ontcijferd, onder meer door codebreker George Lasry. Maar een dozijn bleef weerstand bieden, en dit was er een van.
Het bericht staat op pagina 217 van een oud manuscript van J. Rives Childs over Duitse militaire cijfers uit de Eerste Wereldoorlog. Op pagina 214 en 215 van datzelfde manuscript staat een lijst met gekende sleutelwoorden. Eén daarvan: TRUPPENVERSCHIEBUNG. Troepenverschuiving. Negentien letters.
Astra probeerde dat woord op het bericht. Honderdzeventig tekens onder een sleutel van negentien letters geeft achttien kolommen van negen tekens en één van acht. Kolommen terugzetten in de juiste volgorde, paren omzetten via het raster, en daar stond het:
EIN ENGLISCHER KREUZER EINLIEG X SEWASTOPOL X S4STEN X EIN GESCHWADER DER X ALLIIERTEN FOLGT 26STEN X
Een Engelse kruiser is aangekomen in Sebastopol op de …4de. Een geallieerd eskader volgt op de 26ste. De X’en zijn scheidingstekens. Het eerste cijfer van die eerste datum is verminkt, waarschijnlijk een fout bij het doorseinen.
Twaalf dagen
Waarom had niemand dat woord ooit geprobeerd, als het gewoon in de lijst stond? Astra’s hypothese: volgens de bronnen gebruikten de Duitsers TRUPPENVERSCHIEBUNG pas vanaf 9 december 1918. Dit bericht is van 27 november. Twaalf dagen te vroeg.
En dat vind ik het schoonste deel van het hele verhaal. Wie een oud bericht probeert te kraken, begint logischerwijs met de sleutels die rond die datum in gebruik waren. Dat is geen luiheid, dat is gezond verstand. Alleen heeft net dat gezond verstand de oplossing honderd jaar verstopt. Het antwoord lag niet diep weg. Het lag net buiten de filter.
Een taalmodel heeft minder last van zo’n redelijke aanname, of probeert gewoon meer dingen tegelijk. Welke van de twee het hier was, weet ik niet. Prinz ook niet, lijkt me.
En dan zelf nakijken
Een ontcijfering die vlot Duits oplevert, is al een goed teken. Onzin-tekst krijg je niet toevallig in grammaticaal Duits. Maar volgens Prinz ging het model nog een stap verder en zocht het de inhoud zelf op. De scheepslogs van HMS Canterbury, een Britse kruiser, vermelden de aankomst in Sebastopol op 24 november 1918. Dat past op die verminkte “?4”. En in hetzelfde log staat dat er op 26 november een geallieerd eskader binnenliep. Precies de dag uit het bericht.
Cryptografie, archiefwerk en historische controle, in één werkproces. Dat laatste stuk is voor mij het interessantste. Ik werk dagelijks met AI, en het verschil tussen een antwoord dat klinkt als een antwoord en een antwoord waar je op kan bouwen, zit bijna altijd in die controlestap. Hier deed het model die, als je Prinz mag geloven, uit zichzelf, tegen een bron die het niet zelf verzonnen had.
Let op. Dit is voorlopig de claim van één ontwikkelaar op zijn eigen blog. Niet van OpenAI, niet nagelezen door cryptografen, en uit expertkringen kwam er voorlopig weinig reactie. Critici wijzen er ook op dat de sleutel al gekend was, waardoor dit meer op opzoeken dan op echt kraakwerk lijkt. Dat klopt half. Het opzoeken is pas eenvoudig als je weet dat je buiten de datum moet zoeken.
Historisch verandert er weinig. Dat de geallieerde vloot eind november 1918 Sebastopol binnenvoer, wisten we al. Wat nieuw is, als de ontcijfering standhoudt, is dat kleine detail: de Duitsers gebruikten die sleutel minstens twaalf dagen vroeger dan de bronnen zeggen. Honderdacht jaar oud nieuws, over twaalf dagen.