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 bekendstaat 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 bijvoorbeeld dat we het bericht HelpmeObiWanKenobi willen versleutelen met het sleutelwoord STARWARS. In een eerste stap wordt een rooster van links naar rechts en van boven naar onder ingevuld met de opeenvolgende karakters van het bericht. Als de laatste rij niet volledig opgevuld raakt, dan wordt die aangevuld met vraagtekens (?). Het aantal kolommen van het rooster correspondeert met het aantal unieke letters in het sleutelwoord, waarbij geen onderscheid gemaakt wordt tussen hoofdletters en kleine letters. Het sleutelwoord STARWARS telt bijvoorbeeld 5 unieke letters, en dus heeft het rooster in dit geval 5 kolommen.

kolomtranspositie
Voorbeeld van kolomtranspositie met het sleutelwoord STARWARS.

Vervolgens nummeren we de kolommen van het rooster vanaf nul, in alfabetische volgorde van de letters in het sleutelwoord. Als het sleutelwoord herhaalde letters heeft, dan houden we enkel rekening met het eerste voorkomen van elke letter. We maken opnieuw geen onderscheid tussen hoofdletters en kleine letters. Als we enkel het eerste voorkomen van elke letter overhouden, dan houden we voor het sleutelwoord STARWARS de vijf letters STARW over. Daardoor worden de vijf kolommen achtereenvolgens genummerd met 2, 3, 0, 1 en 4. Onderstaande tabel toont nog enkele voorbeelden van sleutelwoorden die aangeven hoe de kolommen moeten genummerd worden:

sleutelwoord unieke letters kolomnummering
STARWARS STARW 2, 3, 0, 1, 4
KOFFIE KOFIE 3, 4, 1, 2, 0
CHOCOLADE CHOLADE 1, 4, 6, 5, 0, 2, 3
ANANAS ANS 0, 1, 2

Tenslotte bekomen we het gecodeerde bericht door de karakters 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 de kolomnummering. In ons voorbeeld krijgen we eerst de letters lbKi uit de middelste kolom (hoofdletter A), daarna de letters pie? uit de kolom die er rechts van staat (hoofdletter R), daarna de letters Heao uit de linker kolom (hoofdletter S), enzoverder. Op die manier wordt de tekst gecodeerd als lbKipie?HeaoeOnbmWns?.

Opgave

Definieer een klasse Cijfer waarmee berichten kunnen gecodeerd en gedecodeerd worden door kolomtranspositie met een gegeven sleutelwoord. Bij het instantiƫren van objecten van de klasse Cijfer moet een sleutelwoord (String) doorgegeven worden dat enkel bestaat uit letters. Zorg ervoor dat elk object van de klasse Cijfer een eigenschap kolommen heeft, die verwijst naar een reeks (Array) met de nummering (Number) van de kolommen op basis van het gegeven sleutelwoord. Voorts moet de klasse Cijfer minimaal de volgende methoden ondersteunen:

Voorbeeld

> const cijfer = new Cijfer("STARWARS")
> cijfer.kolommen
[2, 3, 0, 1, 4]
> cijfer.codeer("HelpmeObiWanKenobi")
"lbKipie?HeaoeOnbmWn?"
> cijfer.decodeer("lbKipie?HeaoeOnbmWn?")
"HelpmeObiWanKenobi??"

> const cijfer_02 = new Cijfer("GLOBE")
> cijfer_02.kolommen
[2, 3, 4, 0, 1]
> cijfer_02.codeer("Hidden trapdoor under kitchen table")
"drodinlearet eHnp rcti du hadtonkeb"
> cijfer_02.decodeer("drodinlearet eHnp rcti du hadtonkeb")
"Hidden trapdoor under kitchen table"