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.

Opgave

Het transpositiecijfer splitst een tekst (str) op in een reeks van $$m$$ fragmenten die allemaal even lang zijn. We stellen een reeks fragmenten voor als een lijst (list) van strings (str) die allemaal even lang zijn.

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 $$i$$-de fragment de aaneenschakeling is van de $$i$$-de karakters van elk fragment uit de oorspronkelijk reeks. Als we dit toepassen op bovenstaande reeks van drie fragmenten, dan krijgen we deze nieuwe reeks van vier fragmenten:

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 $$s \in \mathbb{N}_0$$, lezen we de reeks uit in $$s$$ groepen van fragmenten die telkens $$s$$ posities van elkaar verwijderd liggen. Laat ons dit bijvoorbeeld voor stapgrootte $$4$$ eens toepassen op deze reeks van twaalf fragmenten:

AB CD EF GH IJ KL MN OP QR ST UV WX

Als we starten bij het eerste fragment en telkens $$4$$ fragmenten vooruit springen, dan krijgen we de eerste groep van fragmenten (AB IJ QR). Als we daarna bij het tweede fragment starten en opnieuw telkens $$4$$ fragmenten vooruit springen, dan bekomen we zo een tweede groep van fragmenten (CD KL ST). Op dezelfde manier kunnen we nu ook de derde groep (EF MN UV) en de vierde groep (GH OP WX) uitlezen, door respectievelijk bij het derde en het vierde fragment te starten, en telkens $$4$$ letters vooruit te springen. Als we al deze groepen achter elkaar zetten, dan krijgen we deze nieuwe reeks fragmenten:

AB IJ QR CD KL ST EF MN UV GH OP WX

Om een cijfertekst (geheime boodschap) te decoderen met $$m$$ fragmenten, splitsen we die eerst op in $$m$$ fragmenten die allemaal even lang zijn. Daarna voeren we achtereenvolgens de volgende bewerkingen uit op deze reeks fragmenten:

  1. halveer de reeks fragmenten

  2. verweef de reeks fragmenten met stapgrootte $$m$$

  3. verdubbel de reeks fragmenten

  4. verwissel de reeks fragmenten

  5. verweef de reeks fragmenten met stapgrootte $$2$$

  6. voeg alle fragmenten samen om zo de klare tekst (oorspronkelijke boodschap) te bekomen

Gevraagd wordt:

Voorbeeld

>>> 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"

Bronnen