Playfair is een van de klassieke versleutelingsmethoden. Deze codeertechniek werd in 1854 door Sir Charles Wheatstone uitgevonden, maar draagt de naam van Lyon Playfair die het gebruik ervan promootte. De eenvoud in gebruik en de veiligheid van deze polygrafische substitutieversleuteling — vergeleken met andere substitutiecoderingen zoals Vigenère — maakten van Playfair een populaire versleutelingsmethode. In een 19 pagina’s lang pamflet uit 1914 van de hand van Joseph O. Mauborgne wordt voor het eerst de oplossing van een Playfaircodering gegeven.

Sir Charles Wheatstone (Barnwood, 6 februari 1802 – Parijs, 9 oktober 1875).

Voor het coderen en decoderen van berichten wordt bij Playfair gebruik gemaakt van een \(5 \times 5\) rooster, waarin de letters van het alfabet in een willekeurige volgorde uitgeschreven worden. Omdat ons alfabet 26 letters telt, worden de letters I en J als één letter gezien. Eerst worden de letters van een bepaald sleutelwoord in het rooster ingevuld, van links naar rechts en van boven naar onder. Daarbij worden herhaalde letters in het sleutelwoord weggelaten. Daarna worden de overige posities in het rooster van links naar rechts en van boven naar onder ingevuld met de ontbrekende letters van het alfabet, in volgorde waarin de letters in het alfabet voorkomen. Als we deze procedure toepassen met het sleutelwoord STALINGRAD, dan wordt bijvoorbeeld de tweede A overgeslagen, en worden de letters op de volgende manier gerangschikt in het rooster.

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

Om een bericht te versleutelen, wordt de tekst eerst opgedeeld in bigrammen (groepen van twee letters). Karakters in de tekst die geen letter zijn (leestekens, spaties, …) worden hierbij genegeerd. Indien een bigram uit twee identieke letters zou bestaan, dan wordt daartussen een X (of een Q indien de letters zelf een X zijn) toegevoegd in de tekst. Indien er op het einde slechts één letter overblijft, dan wordt die in het laatste bigram aangevuld met een X (of een Q indien de laatste letter zelf een X is). De tekst Dit is een zeer geheim bericht. wordt bijvoorbeeld als volgt opgedeeld in bigrammen:

DI TI SE EN ZE ER GE HE IM BE RI CH TX

Daarna wordt elk bigram omgezet naar een gecodeerd bigram op basis van de volgende regels:

Het eerste bigram DI van de voorbeeldtekst vormt een rechthoek in het rooster, waarvan de andere hoekpunten de letters B en L zijn (met B op dezelfde rij als D en L op dezelfde rij als I).

.  .  .  L I/J
.  .  .  D  B
.  .  .  .  .
.  .  .  .  .
.  .  .  .  .

Na codering van het eerste bigram krijgen we dus

DI TI SE EN ZE ER GE HE IM BE RI CH TX
BL

Bij het volgende bigram TI vinden we beide letters in dezelfde rij van het rooster. We nemen dan de letters onmiddellijk rechts ervan op diezelfde rij. Omdat de letter I uiterst rechts staat op de eerste rij, wordt die vervangen door de letter S uiterst links op de eerste rij.

S  T  A  .  I/J
.  .  .  .  .
.  .  .  .  .
.  .  .  .  .
.  .  .  .  .

Het bigram TI wordt op die manier dus gecodeerd als het bigram AS. De volgende vier bigrammen worden telkens gecodeerd op basis van de derde regel, omdat de letters nooit op dezelfde rij of kolom staan. We hebben dus voorlopig de volgende versleuteling gevonden.

DI TI SE EN ZE ER GE HE IM BE RI CH TX
BL AS TC CG WK FG

Bij het bigram GE vinden we beide letters in dezelfde kolom van het rooster. We nemen dan de letters onmiddellijk eronder op diezelfde rij, waardoor het bigram wordt gecodeerd als het bigram EO.

.  .  .  .  .
.  G  .  .  .
.  E  .  .  .
.  O  .  .  .
.  .  .  .  .

Alle mogelijke situaties zijn nu geïllustreerd en we kunnen de overige bigrammen als volgt coderen.

DI TI SE EN ZE ER GE HE IM BE RI CH TX
BL AS TC CG WK FG EO KF SU GK BA EK AW

Om een gecodeerd bericht te ontcijferen moeten we enkel het proces omkeren. Voor rechthoeken kiezen we opnieuw de tegenoverliggende hoeken, voor letters in dezelfde rij kiezen we de letters onmiddellijk links ervan, en voor letters in dezelfde kolom kiezen we de letters onmiddellijk erboven.

Opgave

Definieer een klasse Playfair waarmee teksten kunnen gecodeerd en gedecodeerd worden volgens Playfair met een gegeven sleutelwoord. Bij het coderen en decoderen mag nooit onderscheid gemaakt worden tussen hoofdletters en kleine letters, en tussen de letters I en J. 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 een object van de klasse Playfair moet een sleutelwoord opgegeven worden, waarmee het rooster opgebouwd wordt voor het coderen en decoderen van bigrammen. De klasse Playfair moet ondersteuning bieden aan de volgende methoden:

Voorbeeld

> var play = new Playfair("STALINGRAD");
> play.bigram("DI");
"BL"
> play.bigram("ti");
"AS"
> play.bigram("Ge");
"EO"
> play.bigram("BL", codeer=false);
"DI"
> play.bigram("as", codeer=false);
"TI"
> play.bigram("Eo", codeer=false);
"GE"
> play.bigram("A");
AssertionError: geen twee verschillende letters
> play.bigram("AA");
AssertionError: geen twee verschillende letters
> play.bigram("ABC");
AssertionError: geen twee verschillende letters
> play.codeer("Dit is een zeer geheim bericht.");
"BLASTCCGWKFGEOKFSUGKBAEKAW"
> play.decodeer("BLASTCCGWKFGEOKFSUGKBAEKAW");
"DITISEENZEERGEHEIMBERICHTX"

Bronnen