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 hiervoor 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 de klare tekst 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.
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 |
Ten slotte bekomen we de cijfetekst 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 klare tekst gecodeerd als de cijfertekst lbKipie?HeaoeOnbmWns?.
Definieer een klasse Cijfer waarmee berichten kunnen gecodeerd en gedecodeerd worden door kolomtranspositie met een gegeven sleutelwoord. Bij het aanmaken van een nieuw cijfer (Cijfer) moet een sleutelwoord (String) doorgegeven worden dat enkel bestaat uit letters. Elk cijfer (Cijfer) moet een eigenschap kolommen hebben die verwijst naar een reeks (Array) met de nummering (Number) van de kolommen op basis van het gegeven sleutelwoord.
Voorts moet je op elke cijfer $$c$$ (Cijfer) minstens de volgende methoden kunnen aanroepen:
Een methode codeer waaraan een klare tekst (String) moet doorgegeven worden. De methode moet de cijfertekst (String) teruggeven die bekomen wordt na kolomtranspositie van de klare tekst met het sleutelwoord van cijfer $$c$$.
Een methode decodeer waaraan een cijfertekst (String) moet doorgegeven worden die bekomen werd na kolomtranspositie met het sleutelwoord van cijfer $$c$$. Als de cijfertekst onmogelijk kan bekomen worden door kolomtranspositie met het sleutelwoord van cijfer $$c$$, dan moet een Error opgeworpen worden met de boodschap ongeldig bericht. Anders moet de klare tekst (String) teruggegeven worden.
> 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"