Het vier-vierkantencijfer is een versleutelingsmethode die werd uitgevonden door de bekende Franse cryptograaf Félix Marie Delastelle1 (1840–1902). Deze codeertechniek maakt gebruik van vier \(5 \times 5\) roosters. Elk van deze roosters bevat alle letters van het alfabet juist één keer, behalve de letter J. Bij het coderen en decoderen van berichten wordt de letter J immers altijd gelijkgesteld aan de letter I. De roosters linksboven en rechtsonder zijn de zogenaamde plaintext squares en bevatten van links naar rechts en van boven naar onder de letters in alfabetische volgorde. De roosters rechtsboven en linksonder zijn de zogenaamde ciphertext squares en bevatten een permutatie van de letters van het alfabet.

Een ciphertext square wordt opgebouwd door eerst de posities van het rooster van links naar rechts, en van boven naar onder in te vullen met de letters van een sleutelwoord. Hierbij worden dubbele letters slechts één keer ingevuld. Daarna worden de overige posities van het rooster ingevuld met de resterende letters van het alfabet in alfabetische volgorde (de letters die nog niet in het rooster voorkwamen). Zowel bij het invullen van de letters van het sleutelwoord, als bij het invullen van de letters van het alfabet wordt de letter J gelijkgesteld aan de letter I. Het vier-vierkantencijfer maakt gebruik van twee sleutelwoorden, die respectievelijk gebruikt worden voor het opbouwen van de roosters rechtsboven en linksonder. Hieronder tonen we bijvoorbeeld de roosters die gebruikt worden bij het vier-vierkantencijfer met de sleutelwoorden VOORBEELD en SLEUTELWOORD.

A B C D E     V O R B E
F G H I K     L D A C F
L M N O P     G H I K M
Q R S T U     N P Q S T
V W X Y Z     U W X Y Z

S L E U T     A B C D E
W O R D A     F G H I K
B C F G H     L M N O P
I K M N P     Q R S T U
Q V X Y Z     V W X Y Z

Om een gegeven bericht te coderen worden de volgende stappen uitgevoerd:

  1. Deel het bericht op in bigrammen (groepen van twee letters). Karakters in het bericht die geen letter zijn (leestekens, spaties, …) worden hierbij genegeerd. Als het gegeven bericht uit een oneven aantal letters bestaat, dan wordt achteraan het bericht een extra letter Q toegevoegd. Op die manier wordt de tekst HELLO WORLD! als volgt opgedeeld in bigrammen:

    HE LL OW OR LD
  2. Zoek de eerste letter van het oorspronkelijke bigram in het rooster linksboven.

     A B C D E     V O R B E
     F G H I K     L D A C F
     L M N O P     G H I K M
     Q R S T U     N P Q S T
     V W X Y Z     U W X Y Z
        
     S L E U T     A B C D E
     W O R D A     F G H I K
     B C F G H     L M N O P
     I K M N P     Q R S T U
     Q V X Y Z     V W X Y Z
  3. Zoek de tweede letter van het oorspronkelijke bigram in het rooster rechtsonder.

     A B C D E     V O R B E
     F G H I K     L D A C F
     L M N O P     G H I K M
     Q R S T U     N P Q S T
     V W X Y Z     U W X Y Z
        
     S L E U T     A B C D E
     W O R D A     F G H I K
     B C F G H     L M N O P
     I K M N P     Q R S T U
     Q V X Y Z     V W X Y Z
  4. De eerste letter van het gecodeerde bigram staat op dezelfde rij als de eerste letter van het oorspronkelijke bigram en op dezelfde kolom als de tweede letter van het oorspronkelijke bigram.

     A B C D E     V O R B E
     F G H I K     L D A C F
     L M N O P     G H I K M
     Q R S T U     N P Q S T
     V W X Y Z     U W X Y Z
        
     S L E U T     A B C D E
     W O R D A     F G H I K
     B C F G H     L M N O P
     I K M N P     Q R S T U
     Q V X Y Z     V W X Y Z
  5. De tweede letter van het gecodeerde bigram staat op dezelfde rij als de tweede letter van het oorspronkelijke bigram en op dezelfde kolom als de eerste letter van het oorspronkelijke bigram.

     A B C D E     V O R B E
     F G H I K     L D A C F
     L M N O P     G H I K M
     Q R S T U     N P Q S T
     V W X Y Z     U W X Y Z
        
     S L E U T     A B C D E
     W O R D A     F G H I K
     B C F G H     L M N O P
     I K M N P     Q R S T U
     Q V X Y Z     V W X Y Z

Op basis van het vier-vierkantencijfer dat we hierboven als voorbeeld gebruikt hebben, kunnen we dus als volgt het bericht “Help me Obi-Wan Kenobi” coderen.

HE LP ME OB IW AN KE NO BI
FE MB ML HU DY RB FT KF BO

We geven hieronder nogmaals de vier roosters die gebruikt worden bij het coderen, waarbij we de letters weggewerkt hebben die niet gebruikt worden bij het omzetten van het oorspronkelijke bigram HE naar het gecodeerde bigram FE.

- - - - -     - - - - -
- - H - -     - - - - F
- - - - -     - - - - -
- - - - -     - - - - -
- - - - -     - - - - -

- - E - -     - - - - E
- - - - -     - - - - -
- - - - -     - - - - -
- - - - -     - - - - -
- - - - -     - - - - -

Hierdoor is het onmiddellijk duidelijk dat het coderen van een bigram neerkomt op het opzoeken van de twee andere hoekpunten van de rechthoek die bepaald wordt door de twee letters in de plaintext squares. Het gecodeerde bigram wordt dan eenvoudigweg gevormd door de letters op de twee andere hoekpunten, waarbij de letter in het rooster rechtsboven eerst komt.

Om een gecodeerd bericht te ontcijferen moeten we enkel het proces omkeren. De letters van een gecodeerd bigram moeten opgezocht worden in de roosters rechtsboven (eerste letter) en linksonder (tweede letter). Daarna kunnen de twee andere hoekpunten van de rechthoek bepaald worden. Op deze hoekpunten worden de letters van het oorspronkelijke bigram gevonden, waarbij de eerste letter terug te vinden is in het rooster linksboven.

Opgave

Vierkant

Definieer een klasse Vierkant waarmee de \(5 \times 5\) roosters kunnen voorgesteld worden die gebruikt worden bij het vier-vierkantencijfer. De rijen van het rooster worden van boven naar onder geïndexeerd vanaf nul, en de kolommen worden van links naar rechts geïndexeerd vanaf nul. Bij het aanmaken van een object van de klasse Vierkant kan een sleutelwoord (String) doorgegeven worden. De posities van het rooster moeten van links naar rechts, en van boven naar onder ingevuld worden, eerst met de letters van dit sleutelwoord (zonder dubbels) en daarna met de resterende letters van het alfabet in alfabetische volgorde. Als er geen sleutelwoord wordt doorgegeven, dan moet het rooster enkel ingevuld worden met de letters van het alfabet in alfabetische volgorde.

De klasse Vierkant moet minstens de volgende methoden ondersteunen:

VierVierkant

Gebruik de klasse Vierkant om een klasse VierVierkant te definiëren waarmee teksten kunnen gecodeerd en gedecodeerd worden volgens het vier-vierkantencijfer met twee gegeven sleutelwoorden. Bij het coderen en decoderen mag nooit onderscheid gemaakt worden tussen hoofdletters en kleine letters, en moet de letter J altijd gelijkgesteld worden aan de letter I. In gecodeerde en gedecodeerde berichten moeten alle letters uitgeschreven worden als hoofdletters, en wordt de letter I/J genoteerd als de letter I. Bij het aanmaken van objecten van de klasse VierVierkant moeten twee sleutelwoorden (String) doorgegeven worden. Dit zijn de sleutelwoorden waarmee de ciphertext squares rechtsboven en linksonder moeten opgebouwd worden, die gebruikt worden bij coderen en decoderen van bigrammen.

De klasse VierVierkant moet ondersteuning bieden aan de volgende methoden:

Voorbeeld

> let vierkant = new Vierkant();
> vierkant.toString();
"A B C D E\nF G H I K\nL M N O P\nQ R S T U\nV W X Y Z"
> vierkant.letter(3, 2);
"S"
> vierkant.letter(7, 1);
AssertionError: ongeldige positie
> vierkant.positie("A");
[0, 0]
> vierkant.positie("?");
AssertionError: ongeldige letter

> vierkant = new Vierkant("VOORBEELD");
> vierkant.toString();
"V O R B E\nL D A C F\nG H I K M\nN P Q S T\nU W X Y Z"
> vierkant.letter(3, 2);
"Q"
> vierkant.positie("A");
[1, 2]

> vierkant = new Vierkant("sleutelwoord");
> vierkant.toString();
"S L E U T\nW O R D A\nB C F G H\nI K M N P\nQ V X Y Z"
> vierkant.letter(3, 2);
"M"
> vierkant.positie("a");
[1, 4]

> const codec = new VierVierkant("VOORBEELD", "sleutelwoord");
> codec.codeer("help me obi wan kenobi");
"FEMBMLHUDYRBFTKFBO"
> codec.decodeer("FEMBMLHUDYRBFTKFBO");
"HELPMEOBIWANKENOBI"