Vaak zegt een beeld meer dan duizend woorden. Dat is letterlijk het geval voor deze foto.
William Frederick Friedman1 — vader van de moderne Amerikaanse cryptologie — was dol op een geheimschrift2 dat bedacht was door Francis Bacon3. Het is zo vernuftig dat je er onopvallend geheime boodschappen mee kunt verbergen in foto's, tekeningen, stukken bladmuziek of een andere alledaagse dingen. Bacon omschreef het zelf als "anything can be made to signify anything".
In 1918 gebruikte Friedman (rechts in de groep van 5 zwart geklede personen centraal op de foto) het om een geheime boodschap te verbergen in bovenstaande afstudeerfoto van de eerste codekrakersklas die hij samen met zijn vrouw Elizebeth (centraal in de groep van 5 zwart geklede personen centraal op de foto) had gegeven aan een groep soldaten van de U.S. Army4. Het zal je misschien niet opgevallen zijn, maar sommige studenten kijken recht naar de camera, terwijl anderen opzij kijken.
Hierdoor coderen ze Friedman's favoriete citaat van Francis Bacon: KNOWLEDGE IS POWER. Maar blijkbaar keek de eerste soldaat in de laatste W-groep de verkeerde kant op (hij had opzij moeten kijken in plaats van recht in de camera) en waren er niet genoeg personen om de R-groep te vervolledigen.
Voor de rest van zijn carrière nam deze foto een prominente plaats in op Friedman's bureau. Na zijn dood in 1969 liet Elizebeth het citaat ook op zijn grafsteen graveren, in een ontwerp dat ze zelf bedacht had:
In 2017 merkte cryptograaf Elonka Dunin5 op dat de inscriptie samengesteld is uit schreefletters en schreefloze letters6. Blijkbaar zat er in deze gravure ook een geheime boodschap verborgen die Elizebeth gebruikt had om William's initialen WFF te verbergen. Dunin noemt het "een passend eerbetoon aan het leven en werk van een koppel dat zo toegewijd was aan codes en cijferschriften."
Bij Baconversleuteling wordt elk symbool uit de klare tekst7 voorgesteld door een patroon van vijf a's en b's in de cijfertekst8. Omdat er in totaal $$2^5 = 32$$ verschillende patronen kunnen gevormd worden, kunnen er dus 32 symbolen gecodeerd worden. Die sleutel van het geheimschrift leggen we vast in een tekstbestand met 32 regels. Elke regel van het bestand bestaat uit één symbool (één karakter), gevolgd door een tab en het unieke patroon waardoor het symbool gecodeerd wordt. Zo'n tekstbestand ziet er bijvoorbeeld als volgt uit:
A aaaaa B aaaab C aaaba D aaabb E aabaa F aabab G aabba H aabbb I abaaa K abaab … bbaba . bbabb , bbbaa ' bbbab ? bbbba ! bbbbb
Om de klare tekst KNOWLEDGEISPOWER te coderen, vervangen we bij Baconversleuteling elk symbool door het corresponderende patroon:
abaab abbaa abbab babaa ababa aabaa aaabb aabba K N O W L E D G
aabaa abaaa baaab abbba abbab babaa aabaa baaaa
E I S P O W E R
Op die manier is de lengte van de cijfertekst altijd een veelvoud van vijf. Een cijfertekst kan dan gedecodeerd worden door elk patroon van vijf a's en b's te vervangen door het corresponderende symbool in de klare tekst.
Een gecodeerd bericht dat enkel uit a's en b's bestaat zou echter direct laten opvallen dat er Baconversleuting gebruikt werd. Om dat te verdoezelen, zullen we een klare tekst coderen onder de vorm van een directorystructuur met bestanden en subdirectories waarvan de namen enkel uit letters bestaan (hoofdletters en kleine letters). We hebben bijvoorbeeld met sleutel key04.txt9 de klare tekst KNOWLEDGEISPOWER gecodeerd in deze directorystructuur (dir0410):
dir04/11 ├── AeNQsmmq (103 bytes; 01001 -> K) ├── BpSJIVLc/ ├── CIclBuot (38 bytes) ├── DPMFdONC/ ├── DovmSRmN (63 bytes) ├── IEwpyPbD (212 bytes; 01100 -> N) ├── IhmfTogf (189 bytes; 01101 -> O) ├── JAOzPBzX (200 bytes; 10100 -> W) ├── JECEnLBo (252 bytes; 01010 -> L) ├── JLbPQbTn (104 bytes; 00100 -> E) ├── LEeHuHVX (47 bytes) ├── LaGvJmwN (93 bytes) ├── NGewEGZN/ ├── NLTjiQHW/ ├── NQhDngvp/ ├── NtJqIJZE (125 bytes; 00011 -> D) ├── TMvWnrlh (72 bytes) ├── TrfKQrUF (241 bytes; 00110 -> G) ├── ZIMxvXhD (161 bytes; 00100 -> E) ├── cApuGyKg (170 bytes; 01000 -> I) ├── dlaqOkaX (99 bytes) ├── gTPoCHRT (227 bytes; 10001 -> S) ├── hJpNGJZg/ ├── kMTTyJqo/ ├── loGwFIkp (100 bytes; 01110 -> P) ├── lxwwCCGK/ ├── nTpJiHGV (74 bytes) ├── wCGPtGXs (200 bytes; 01101 -> O) ├── xMajMVIa (100 bytes; 10100 -> W) ├── xoLVHdHu (157 bytes; 00100 -> E) ├── yIYmcZpf (90 bytes) └── zIoRIKgH (205 bytes; 10000 -> R)
Om het gecodeerd bericht in deze directorystructuur te ontcijferen, moeten alle directories (aangeduid in rood) en hun onderliggende bestanden genegeerd worden. Verder moeten ook alle gewone bestanden waarvan de grootte minder dan 100 bytes bedraagt (aangeduid in blauw) genegeerd worden. Elk gewoon bestand met minstens 100 bytes dat rechtstreeks onder de directory dir04 staat, codeert één symbool uit de klare tekst. Die bestanden moeten in lexicografische volgorde verwerkt worden, rekening houdend met het verschil tussen hoofdletters en kleine letters. De eerste 5 bits van een bestand worden gebruikt om het symbool dat met dit bestand correspondeert te decoderen, waarbij een 0-bit correspondeert met een letter a in de patronen van de Baconversleuting en een 1-bit met de letter b. De eerste vijf bits van het gewoon bestand dir04/AeNQsmmq (met een grootte van 103 bytes) zijn bijvoorbeeld 01001. Dit correspondeert met patroon abaab dat volgens de sleutel key04.txt12 staat voor symbool K in de klare tekst.
Gevraagd wordt om een bash shell script bacon te schrijven waarmee berichten kunnen ontcijferd worden die met Baconversleuteling gecodeerd zijn onder de vorm van een directorystructuur. Aan het shell script moeten twee argumenten doorgegeven worden: i) de padnaam van de directorystructuur waarin het bericht gecodeerd zit en ii) de padnaam van een tekstbestand met de sleutel die bij de Baconversleuteling gebruikt werd. Het script moet de klare tekst van het bericht dat in de gegeven directorystructuur gecodeerd zit uitschrijven naar stdout. Daarbij mag het script ervan uitgaan dat er enkel geldige argumenten aan doorgegeven worden, zonder dat dit expliciet moet gecontroleerd worden.
Gebruik het commando xxd met optie -b om de binaire voostelling van een bestand te genereren. Daarmee kan je rechtstreeks de eerste 5 bits van het bestand bepalen.
Onderstaande voorbeeldsessie toont hoe het shell script bacon moet kunnen gebruikt worden. Hierbij gaan we ervan uit dat de huidige directory de bestanden uit het ZIP-bestand bacon.zip13 bevat.
$ bacon data/dir01/14 keys/key01.txt15
F
$ bacon data/dir02/16 keys/key02.txt17
W
$ bacon data/dir03/18 keys/key03.txt19
WFF
$ bacon data/dir04/20 keys/key04.txt21
KNOWLEDGEISPOWER
$ bacon data/dir05/22 keys/key05.txt23
KNOWLEDGE IS POWER
William Friedman (1891–1969) studeerde genetica aan Cornell University24 voor hij bij de U.S. Army aan de slag ging als cryptoloog. Het mag dan ook niet verbazen dat hij een tekening van een zonnebloem gebruikte om te illustreren hoe je woorden kunt verbergen met Baconversleuteling.
Het wordt nog ingewikkelder als we naar deze afbeelding van een kasteel kijken.
Dit is niet makkelijk te ontcijferen, zelfs als je weet dat er een gecodeerd bericht in verstopt zit. De stenen met en zonder schaduw coderen deze tekst:
My business is to write prescriptions
And then to see my doses staken
But now I find I spend my time
Endeavoring to out-Bacon Bacon
Tot slot geeft het bijschrift aan de onderkant van deze muziekpartituur weg dat er een geheime boodschap in verstopt zit die met behulp van Baconversleuteling kan ontcijferd worden.
Deze keer gaf Friedman geen tips weg. Zodra je echter doorhebt dat sommige muzieknoten een intact stokje hebben (klasse $$a$$) en andere een onderbroken stokje (klasse $$b$$), duurt het niet lang om de geheime boodschap te ontcijferen: ENEMY ADVANCING RIGHT / WE MARCH AT DAYBREAK.
Dunin E (2017). Cipher on the William and Elizebeth Friedman tombstone at Arlington National Cemetery is solved. 25
Goldman IL (2017). William Friedman, Geneticist Turned Cryptographer. Genetics 206(1), 1–8. 26
NSA Center for Cryptologic History (2006). The Friedman Legacy: A Tribute to William and Elizebeth Friedman. 27