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:
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:
enzovoort. Uiteindelijk krijgen we deze cijfertekst:
C MLPBRVTOP
Om uit de cijfertekst en de sleutel terug de originele tekst te verkrijgen, werken we omgekeerd:
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!
Schrijf een programma dat, gegeven een bericht en een sleutel, het one-time pad toepast op dit bericht met deze sleutel.
Invoer:
DIT IS GEHEIM
XVHAEUQWNOPGD
Uitvoer:
C MLPBRVTOP