Een transpositiecijfer is een versleutelingsmethode waarbij alle karakters van een bericht systematisch op een andere plaats gezet worden. Dit proces moet omkeerbaar zijn, zodat het oorspronkelijke bericht kan gereconstrueerd worden.

In de klassieke cryptografie wordt voornamelijk gebruikgemaakt van een techniek die bekend staat als kolomtranspositie. Hierbij gebruikt men een sleutelwoord dat enkel bestaat uit letters om te bepalen hoe de karakters van het bericht door elkaar geschud moeten worden. De makkelijkste manier om de werking van kolomtranspositie uit te leggen is aan de hand van een voorbeeld. Stel dat we het bericht

It Ain't What You Do...

willen versleutelen met het sleutelwoord BANANARAMA.

Eerst reduceren we het sleutelwoord door enkel het eerste voorkomen van elke letter over te houden, waarbij we geen onderscheid maken tussen hoofdletters en kleine letters. Op die manier wordt het sleutelwoord BANANARAMA bijvoorbeeld gereduceerd tot BANRM, waarin alle letters uniek voorkomen.

Daarna vullen we een rechthoekig rooster van links naar rechts en van boven naar onder met de opeenvolgende karakters van het bericht. Het aantal kolommen van het rooster correspondeert met het aantal unieke letters in het sleutelwoord (= aantal letters in gereduceerde sleutelwoord). Als de laatste rij niet volledig opgevuld raakt dan wordt die aangevuld met vraagtekens (?). Het sleutelwoord BANANARAMA telt 5 unieke letters en dus worden de letters van het bericht

It Ain't What You Do...

als volgt ingevuld in een rooster met 5 kolommen. De laatste rij wordt aangevuld met twee vraagtekens (aangeduid in het geel).

kolomtranspositie
Codering van de zin It Ain't What You Do... volgens kolomtranspositie met het sleutelwoord BANANARAMA.

Vervolgens nummeren we de kolommen van het rooster op basis van de alfabetische volgorde van de letters in het gereduceerde sleutelwoord. We beginnen daarbij te nummeren vanaf nul. Voor het gereduceerde sleutelwoord BANRM worden de kolommen achtereenvolgens genummerd met 1, 0, 3, 4 en 2. Onderstaande tabel geeft aan hoe de kolommen moeten genummerd worden voor enkele bijkomende sleutelwoorden:

sleutelwoord gereduceerd kolomnummering kolomvolgorde
BANANARAMA BANRM 1, 0, 3, 4, 2 1, 0, 4, 2, 3
overnumerousnesses OVERNUMS 3, 7, 0, 4, 2, 6, 1, 5 2, 6, 4, 0, 3, 7, 5, 1
Mississippi MISP 1, 0, 3, 2 1, 0, 3, 2

We bekomen ten slotte het gecodeerde bericht door de karakters van het rooster kolom per kolom achter elkaar te zetten, waarbij elke kolom van boven naar onder wordt doorlopen en de kolommen in oplopende volgorde doorlopen worden op basis van hun kolomnummering. Voor het voorbeeldrooster krijgen we eerst de letters t'au. uit de tweede kolom (hoofdletter A), daarna de letters Inho. uit de eerste kolom (hoofdletter B), daarna de letters iWYO? uit de laatste kolom (hoofdletter M), enzoverder. Op die manier wordt het bericht gecodeerd als

t'au.Inho.iWYo? tt .A  D?

Raak daar nog maar eens wijs uit.

Opgave

Een sleutelwoord is een string die enkel uit letters bestaat (hoofdletters en kleine letters). Gevraagd wordt:

Voorbeeld

>>> reduceer('BANANARAMA')
'BANRM'
>>> reduceer('overnumerousnesses')
'OVERNUMS'
>>> reduceer('Mississippi')
'MISP'

>>> kolomnummering('BANANARAMA')
(1, 0, 3, 4, 2)
>>> kolomnummering('overnumerousnesses')
(3, 7, 0, 4, 2, 6, 1, 5)
>>> kolomnummering('Mississippi')
(1, 0, 3, 2)

>>> kolomvolgorde('BANANARAMA')
(1, 0, 4, 2, 3)
>>> kolomvolgorde('overnumerousnesses')
(2, 6, 4, 0, 3, 7, 5, 1)
>>> kolomvolgorde('Mississippi')
(1, 0, 3, 2)

>>> codeer("It Ain't What You Do...", 'BANANARAMA')
"t'au.Inho.iWYo? tt .A  D?"
>>> codeer("lacks ascenders, descenders, and dots in lower case", 'overnumerousnesses')
'cnesooeasnni ?sec se?lc e  akds,tw?s,ddnc? rea r?aedrdls'
>>> codeer("One-Mississippi, two-Mississippi", 'Mississippi')
'nisptMipOMip -si-si,ossiessiwisp'

>>> decodeer("t'au.Inho.iWYo? tt .A  D?", 'BANANARAMA')
"It Ain't What You Do...??"
>>> decodeer('cnesooeasnni ?sec se?lc e  akds,tw?s,ddnc? rea r?aedrdls', 'overnumerousnesses')
'lacks ascenders, descenders, and dots in lower case?????'
>>> decodeer('nisptMipOMip -si-si,ossiessiwisp', 'Mississippi')
'One-Mississippi, two-Mississippi'

De eerste kolomtranspositie correspondeert met het voorbeeld uit de inleiding. Om makkelijker te kunnen debuggen, geven we hieronder ook een grafische voorstelling van het rooster voor de twee andere kolomtransposities.

kolomtranspositie
Codering van de zin lacks ascenders, descenders, and dots in lower case volgens kolomtranspositie met het sleutelwoord overnumerousnesses.
kolomtranspositie
Codering van de zin One-Mississippi, two-Mississippi volgens kolomtranspositie met het sleutelwoord Mississippi.