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.
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.
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:
bigram
waaraan een string moet doorgegeven worden. Indien deze string geen bigram met twee verschillende letters is, dan moet de methode een AssertionError
opwerpen met de boodschap geen twee verschillende letters
. De methode heeft ook nog een optionele parameter codeer
waaraan een Booleaanse waarde kan doorgegeven worden (standaardwaarde: true
). Indien de waarde true
wordt doorgegeven aan de parameter codeer
, dan moet de methode het gecodeerde bigram teruggeven voor het gegeven bigram. Indien de waarde false
wordt doorgegeven aan de parameter codeer
, dan moet de methode het gedecodeerde bigram teruggeven voor het gegeven gecodeerde bigram.codeer
waaraan een string moet doorgegeven worden. De methode moet de gecodeerde string teruggeven na codering van de gegeven string door Playfair met het opgegeven sleutelwoord.decodeer
waaraan een string moet doorgegeven worden. De methode moet de gedecodeerde string teruggeven na decodering van de gegeven string door Playfair met het opgegeven sleutelwoord. Indien er tijdens het coderen van de gegeven string extra letters X
of Q
werden toegevoegd aan het oorspronkelijke bericht, dan moet de methode die niet uit het gedecodeerde bericht verwijderen.> 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"