In de roman Tom Tiddler's Island1 (1933) van J.J. Connington staat deze geheime boodschap:
TEIIL LFILH TCETU FDHSO OENPR YYUGO HNGOF LOVTU GCHAN NOATN AEHAT ISUWE ETFST GSCAD OFRGH PELPE HASLE GASTN HGSMR LHLAR ARNIF THRDL NITFO SSWSG NYILE EFALT ODECT IESOL NTSNT COOUE AODNT IUTAI TIOON LEANR IIGOT AHNOM RINHE YLMFD STTTS MANHH OFEII ETODD OTPCA MOTIE FMONG IMCLA TTCHB YIMNN ETROX EMCOU VSFHA ELMPN NCTAW ETRWO OAHEE IYCNA OIRBT RTXET PEIZN RSCSA TIKOH NITHT EMFNE NNRUO GOTGP ENETP SYANS Z
Wat zou die kunnen betekenen?
Er werd gebruikgemaakt van een transpositiecijfer2 om de letters van de boodschap op een systematische manier door elkaar te halen. Als je de letters terug op hun oorspronkelijke plaats zet, dan leest het bericht als:
THE FINAL LOT OF THE LAST THREE THOUSAND WAS SENT OFF ON THURSDAY AND GOT THROUGH SAFE STOP NOTHING SEEN OF NIPASGAL STOP THINK OF THROWING THEM WELL OFF THE SCENT BY USING ANOTHER PORT NEXT TIME STOP ADVISE AGAINST LANDING CHEMICALS TILL FURTHER NOTICE STOP GREY CLOUD IN OFFING STOP WILL GIVE YOU ALL CLEAR THRICE COMMA AT NINE COMMA NINE THIRTY COMMA AND TEN THIRTY COMMA ON NIGHT BEFORE I EXPECT YOU ENDS ZZ
De manier waarop deze boodschap kan ontcijferd worden, staat beschreven op pagina's 148–161 van de roman3. Omdat de geheime boodschap zoals die in het boek staat enkele fouten bevat, leggen we hieronder op een meer systematische manier uit hoe dit transpositiecijfer werkt.
Het transpositiecijfer splitst een tekst (str) op in een
reeks van
We kunnen nu een aantal (omkeerbare) bewerkingen uitvoeren die een reeks fragmenten omzetten naar een nieuwe reeks fragmenten. Nemen we bijvoorbeeld deze reeks van drie fragmenten
ABCD EFGH IJKL
dan kunnen we die halveren door alle fragmenten in twee gelijke delen te splitsen. We krijgen dan deze nieuwe reeks van zes fragmenten
AB CD EF GH IJ KL
De omgekeerde bewerking noemen we verdubbelen. Daarbij worden telkens twee opeenvolgende fragmenten samengevoegd tot één enkel fragment.
Bij het verwisselen van een reeks fragmenten ontstaat
een nieuwe reeks waarvan het
AEI BFJ CGK DHL
Merk op dat de bewerking verwisselen zichzelf omkeert: als we ze tweemaal na elkaar toepassen, dan krijgen we terug de oorspronkelijke reeks fragmenten.
Om een reeks fragmenten te verweven met stapgrootte
AB CD EF GH IJ KL MN OP QR ST UV WX
Als we starten bij het eerste fragment en telkens
AB IJ QR CD KL ST EF MN UV GH OP WX
Om een cijfertekst (geheime boodschap) te decoderen
met
halveer de reeks fragmenten
verweef de reeks fragmenten met stapgrootte
verdubbel de reeks fragmenten
verwissel de reeks fragmenten
verweef de reeks fragmenten met stapgrootte
voeg alle fragmenten samen om zo de klare tekst (oorspronkelijke boodschap) te bekomen
Gevraagd wordt:
Schrijf een functie splitsen waaraan twee argumenten
moeten doorgegeven worden: i) een tekst
Schrijf een functie samenvoegen waaraan een reeks fragmenten moet doorgegeven worden. De functie moet de string (str) teruggeven die bekomen wordt door alle fragmenten van de gegeven reeks samen te voegen.
Schrijf een functie halveren waaraan een reeks fragmenten moet doorgegeven worden. De functie moet de nieuwe reeks fragmenten teruggeven die bekomen wordt door de gegeven reeks te halveren. Hierbij mag de functie ervan uitgaan dat alle fragmenten in de gegeven reeks een even lengte hebben, zonder dat dit expliciet moet gecontroleerd worden.
Schrijf een functie verdubbelen waaraan een reeks fragmenten moet doorgegeven worden. De functie moet de nieuwe reeks fragmenten teruggeven die bekomen wordt door de gegeven reeks te verdubbelen. Hierbij mag de functie ervan uitgaan dat het aantal fragmenten in de gegeven reeks even is, zonder dat dit expliciet moet gecontroleerd worden.
Schrijf een functie verwisselen waaraan een reeks fragmenten moet doorgegeven worden. De functie moet de nieuwe reeks fragmenten teruggeven die bekomen wordt door de gegeven reeks fragmenten te verwisselen.
Schrijf een functie verweven waaraan twee argumenten
moeten doorgegeven worden: i) een reeks fragmenten en ii)
een getal
Schrijf een functie decoderen waaraan twee argumenten
moeten doorgegeven worden: i) een cijfertekst
>>> splitsen('ABCDEFGHIJKL', 6)
['AB', 'CD', 'EF', 'GH', 'IJ', 'KL']
>>> splitsen('ABCDEFGHIJKL', 4)
['ABC', 'DEF', 'GHI', 'JKL']
>>> splitsen('ABCDEFGHIJKL', 3)
['ABCD', 'EFGH', 'IJKL']
>>> samenvoegen(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'])
'ABCDEFGHIJKL'
>>> samenvoegen(['ABC', 'DEF', 'GHI', 'JKL'])
'ABCDEFGHIJKL'
>>> samenvoegen(['ABCD', 'EFGH', 'IJKL'])
'ABCDEFGHIJKL'
>>> halveren(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'])
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']
>>> halveren(['ABCD', 'EFGH', 'IJKL'])
['AB', 'CD', 'EF', 'GH', 'IJ', 'KL']
>>> verdubbelen(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'])
['AB', 'CD', 'EF', 'GH', 'IJ', 'KL']
>>> verdubbelen(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'])
['ABCD', 'EFGH', 'IJKL']
>>> verwisselen(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'])
['ACEGIK', 'BDFHJL']
>>> verwisselen(['ABC', 'DEF', 'GHI', 'JKL'])
['ADGJ', 'BEHK', 'CFIL']
>>> verwisselen(['ABCD', 'EFGH', 'IJKL'])
['AEI', 'BFJ', 'CGK', 'DHL']
>>> verweven(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'], 2)
['AB', 'EF', 'IJ', 'CD', 'GH', 'KL']
>>> verweven(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'], 3)
['AB', 'GH', 'CD', 'IJ', 'EF', 'KL']
>>> verweven(['AB', 'CD', 'EF', 'GH', 'IJ', 'KL'], 4)
['AB', 'IJ', 'CD', 'KL', 'EF', 'GH']
>>> decoderen("Ie fradnoCh' a ac guaamoffiiy pvtenham fatoa eciSoruwitJ ksprrn!", 3)
"I'm afraid you have the misfortune of facing Captain Jack Sparrow!"
>>> decoderen("Iofc Ch'friyaam anopv figuteaad a itciat!nhksruZ e frnZJ SooeZamprw Z", 5)
"I'm afraid you have the misfortune of facing Captain Jack Sparrow!ZZZZ"
>>> decoderen("Ifrnot' aguamfi i adChnac aa fiypvJeamatX ciruXtksrnXh foeXeSow X pr!oX", 6)
"I'm afraid you have the misfortune of facing Captain Jack Sparrow!XXXXXX"