Hintergrund
Ein One-Time-Pad ist eine Form der Verschlüsselung, die sich bei sachgemäßer Verwendung als unmöglich zu knacken erwiesen hat.
Die Verschlüsselung wird durchgeführt, indem ein Klartext (der nur aus den Buchstaben AZ besteht) und eine zufällige Zeichenfolge mit der gleichen Länge (auch nur aus den Buchstaben) generiert wird. Diese Zeichenfolge fungiert als Schlüssel. Jedes Zeichen im Klartext wird dann mit dem entsprechenden Zeichen im Schlüssel gepaart. Der Chiffretext wird wie folgt berechnet: Für jedes Paar werden beide Zeichen in Zahlen umgewandelt (A = 0, B = 1, ... Z = 25). Die beiden Zahlen werden modulo 26 addiert. Diese Zahl wird wieder in ein Zeichen umgewandelt.
Entschlüsselung ist genau das Gegenteil. Die Zeichen im Chiffretext und im Schlüssel werden gepaart und in Zahlen umgewandelt. Der Schlüssel wird dann vom Chiffretextmodul 26 subtrahiert und das Ergebnis wird zurück in ein Zeichen AZ umgewandelt.
Die Herausforderung
Ihre Herausforderung besteht darin, das kürzestmögliche Programm zu schreiben, mit dem ein einmaliges Pad sowohl verschlüsselt als auch entschlüsselt werden kann.
In der ersten Eingabezeile (in STDIN) steht entweder das Wort "ENCRYPT" oder das Wort "DECRYPT".
Wenn das Wort verschlüsselt ist, ist die nächste Zeile der Klartext. Ihr Programm sollte zwei Zeilen ausgeben (an STDOUT), wobei die erste der Schlüssel und die zweite der Chiffretext ist.
Wenn das Wort entschlüsselt ist, erhält Ihr Programm zwei weitere Eingabezeilen. Die erste Zeile ist der Schlüssel, und die zweite Zeile ist der Chiffretext. Ihr Programm sollte eine Zeile ausgeben, bei der es sich um den entschlüsselten Klartext handelt.
Klartext, Chiffretext und Schlüssel sollten immer aus Großbuchstaben AZ bestehen. Sie bestehen immer aus einer einzelnen Zeile und enthalten keine Leerzeichen.
Der Schlüssel sollte immer zufällig sein. Es sollten keine großen Teile zwischen den Läufen wiederholt werden, und es sollten keine Muster im Text vorhanden sein.
Zwei einfache Beispiele:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
Das >
stellt dar, welche Zeilen ausgegeben werden, sodass Sie dieses Symbol nicht als Ausgabe drucken müssen.
/dev/random
, haveged
) angegeben haben, verschlüsseln Sie diese, indem Sie die Ords mit den Bytes versehen und entschlüsseln Sie sie, indem Sie sie mit dem Schlüssel versehen. gist.github.com/5078264 der schlüssel oder die zufälligkeit kann aus stdin gelesen werden, die nachricht oder der verschlüsselte text kann ein dateinamenargument sein.
/dev/hwrng
anstelle von Pseudo-Zufall (was es technisch kaputt macht.)