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 (sleutel.txt9):
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. Het is echter toegelaten om maximaal vier a's op het einde van de cijfertekst weg te laten. Dit is dus ook een geldige cijfertekst voor de klare tekst KNOWLEDGEISPOWER (vier a's op het einde weggelaten):
abaababbaaabbabbabaaababaaabaaaaabbaabbaaabaaabaaabaaababbbaabbabbabaaaabaab
Als de lengte van de cijfertekst geen veelvoud van vijf is, dan kan die dus achteraan aangevuld worden met één tot vier a's om tot een lengte te komen die wel een veelvoud van vijf is. Daarna kunnen we de cijfertekst terug decoderen door elk patroon van vijf a's en b's te vervangen door het corresponderende symbool in de klare tekst.
Een gecodeerd bericht dat voorgesteld wordt door een reeks die enkel uit a's en b's bestaat, zou direct laten opvallen dat er Baconversleuting gebruikt werd. Om te verdoezelen dat er een gecodeerd bericht in de voorstelling zit, kunnen $$a$$ en $$b$$ ook twee verschillende klassen voorstellen: letters die er anders uitzien (verschillende lettertypes; vette en gewone tekst), verschillende soorten muzieknoten, of personen die op een andere manier naar de camera kijken.
In deze opgave zullen we voor de klassen $$a$$ en $$b$$ werken met twee verschillende groepen karakters in de cijfertekst. Als we kleine letters gebruiken voor klasse $$a$$ en hoofdletters voor klasse $$b$$, dan kan de klare tekst KNOWLEDGEISPOWER bijvoorbeeld gecodeerd worden als:
tZsyFqBHyprHDoMVhVzkhVfGgeyVqvvjbDTfkRLmsgEgkvKforNmjiXhRLDwgSKnMFpQutrcCbeUwrzf
Als klasse $$a$$ personen voorstelt die recht naar de camera kijken (=) en klasse $$b$$ personen die naar links (<) of naar rechts (>) kijken, dan kan dezelfde klare tekst bijvoorbeeld gecodeerd worden als:
=>==>=>>===>>=>>=>===<=<===<=====<<==>>===>===>===>===<=<<<==<<=<<=<====>==<====
Definieer een klasse Bacon om codecs voor te stellen waarmee berichten kunnen gecodeerd en gedecodeerd worden volgens een Baconversleuteling met een gegeven sleutel. Bij het aanmaken van een codec (Bacon) moet de locatie (str) van een tekstbestand met de sleutel van het geheimschrift doorgegeven worden. Op een codec (Bacon) moeten minstens de volgende methoden kunnen aangroepen worden:
Een methode opvallend_coderen waaraan een klare tekst (str) moet doorgegeven worden. De methode moet de corresponderende cijfertekst teruggeven waarin elk patroon wordt voorgesteld als een reeks van vijf a's en b's.
Een methode opvallend_decoderen waaraan een cijfertekst (str) moet doorgegeven worden waarin elk patroon voorgesteld wordt als een reeks van vijf a's en b's. Op het einde van de cijfertekst mogen maximaal vier a's weggelaten zijn. De methode moet de corresponderende klare tekst teruggeven.
Een methode verborgen_coderen waaraan een klare tekst (str) moet doorgegeven worden. De methode heeft ook nog twee optionele parameters a en b die kunnen gebruikt worden om vast te leggen door welke karakters de klassen $$a$$ en $$b$$ voorgesteld worden in de cijfertekst. Aan de parameter a (resp. b) kan een string (str) doorgegeven worden met alle karakters die gebruikt worden om de klasse $$a$$ (resp. $$b$$) voor te stellen. Als er niet expliciet een waarde wordt doorgegeven aan de parameter a (resp. b), dan bestaat klasse $$a$$ (resp. $$b$$) uit alle kleine letters (resp. hoofdletters). De methode moet de corresponderende cijfertekst teruggeven waarin elk patroon wordt voorgesteld als een reeks van vijf karakters. Daarbij moet elk karakter willekeurig gekozen worden uit alle mogelijke karakters voor de klasse $$a$$ (parameter a) of de klasse $$b$$ (parameter b).
Deze klasse en al haar methoden mogen ervan uitgaan dat er enkel geldige sleutels, klare teksten, cijferteksten aan doorgegeven worden, zonder dat dit expliciet moet gecontroleerd worden.
Bij onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand sleutel.txt10 zich in de huidige directory bevindt.
>>> codec = Bacon('sleutel.txt11')
>>> codec.opvallend_coderen('F')
'aabab'
>>> codec.opvallend_coderen('W')
'babaa'
>>> codec.opvallend_coderen('WFF')
'babaaaababaabab'
>>> codec.opvallend_coderen('KNOWLEDGEISPOWER')
'abaababbaaabbabbabaaababaaabaaaaabbaabbaaabaaabaaabaaababbbaabbabbabaaaabaabaaaa'
>>> codec.opvallend_decoderen('aabab')
'F'
>>> codec.opvallend_decoderen('bab')
'W'
>>> codec.opvallend_decoderen('babaaaababaabab')
'WFF'
>>> codec.opvallend_decoderen('abaababbaaabbabbabaaababaaabaaaaabbaabbaaabaaabaaabaaababbbaabbabbabaaaabaab')
'KNOWLEDGEISPOWER'
>>> codec.verborgen_coderen('F')
'chLqM'
>>> codec.verborgen_coderen('W', a='=', b='<>')
'<=>=='
>>> codec.verborgen_coderen('WFF')
'RkUkjvvVcNuqKkE'
>>> codec.verborgen_coderen('KNOWLEDGEISPOWER')
'tZsyFqBHyprHDoMVhVzkhVfGgeyVqvvjbDTfkRLmsgEgkvKforNmjiXhRLDwgSKnMFpQutrcCbeUwrzf'
>>> codec.verborgen_coderen('KNOWLEDGEISPOWER', a='=', b='<>')
'=>==>=>>===>>=>>=>===<=<===<=====<<==>>===>===>===>===<=<<<==<<=<<=<====>==<===='
>>> codec.verborgen_decoderen('chLqM')
'F'
>>> codec.verborgen_decoderen('<=>', a='=', b='<>')
'W'
>>> codec.verborgen_decoderen('RkUkjvvVcNuqKkE')
'WFF'
>>> codec.verborgen_decoderen('tZsyFqBHyprHDoMVhVzkhVfGgeyVqvvjbDTfkRLmsgEgkvKforNmjiXhRLDwgSKnMFpQutrcCbeU')
'KNOWLEDGEISPOWER'
>>> codec.verborgen_decoderen('=>==>=>>===>>=>>=>===<=<===<=====<<==>>===>===>===>===<=<<<==<<=<==<====>==<', a='=', b='<>')
'KNOWLEDGEISPOEER'
William Friedman (1891–1969) studeerde genetica aan Cornell University12 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. 13
Goldman IL (2017). William Friedman, Geneticist Turned Cryptographer. Genetics 206(1), 1–8. 14
NSA Center for Cryptologic History (2006). The Friedman Legacy: A Tribute to William and Elizebeth Friedman. 15