One-time pad

One-time pad, soms ook wel OTP, Vernam-cijfer, eenmalig blokcijfer of het perfecte cijfer genoemd, is de enige bewezen methode voor cryptografie die een onbreekbare vercijfering mogelijk maakt, mits correct toegepast. Het OTP begint met de invoer die versleuteld moet worden. Neem bijvoorbeeld de volgende tekenreeks:

DIT IS GEHEIM

Als we elke letter omzetten naar een getal door de positie in het alfabet te nemen, waar A overeenkomt met 0, Z met 25 en de spatie met 26, dan kunnen we deze invoer ook als volgt schrijven als een lijst van getallen:

[3, 8, 19, 26, 8, 18, 26, 6, 4, 7, 4, 8, 12]

Vervolgens beschouwen we een sleutel. Deze sleutel moet aan twee belangrijke voorwaarden voldoen:

  • De sleutel is even lang als de invoer.
  • De sleutel moet random zijn.

Stel dat we deze sleutel nemen:

XVHAEUQWNOPGD

In getallen wordt dit

[23, 21, 7, 0, 4, 20, 16, 22, 13, 14, 15, 6, 3]

Het OTP berekent nu de cijfertekst door de invoer en de sleutel bij elkaar op te tellen modulo de grootte van het alfabet:

  1. \( 3 + 23 \mod 27 = 26 \)
  2. \( 8 + 21 \mod 27 = 2 \)
  3. \( 19 + 7 \mod 27 = 26 \)

enzovoort. Uiteindelijk krijgen we deze cijfertekst:

 C  MLPBRVTOP

Om uit de cijfertekst en de sleutel terug de originele tekst te verkrijgen, werken we omgekeerd:

  1. \( 26 - 23 \mod 27 = 3 \)
  2. \( 2 - 21 \mod 27 = 8 \)
  3. \( 26 - 7 \mod 27 = 19 \)

enzovoorts. Dit herstelt de originele tekst. Het OTP is een symmetrisch cijfer: het werkt met één sleutel die zowel gebruikt wordt voor encryptie als decryptie. Alle partijen die tekst moeten versleutelen en ontsleutelen moeten dus in het bezit zijn van de sleutel, en als de sleutel in handen van een aanvaller zou geraken, is het cijfer gebroken. Echter, als de sleutel uniform willekeurig gekozen wordt en niet uitlekt, dan is het OTP de sterkst mogelijke manier om data te versleutelen omdat geen enkele aanvaller beter kan doen dan de sleutel te gokken. In de praktijk kan je het OTP natuurlijk moeilijk gebruiken omwille van het feit dat het symmetrisch is en dat de sleutel even lang moet zijn als de invoer. Alle data die je daar dus mee encrypteert wordt in essentie dubbel zo groot!

Opgave

Schrijf een programma dat, gegeven een bericht en een sleutel, het one-time pad toepast op dit bericht met deze sleutel.

Voorbeeld

Invoer:

DIT IS GEHEIM
XVHAEUQWNOPGD

Uitvoer:

 C  MLPBRVTOP

Indienen

Evaluatie


Uitvoerconsole