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.
quelle
/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.)Antworten:
GolfScript, 53 Zeichen
Dies ist eine Aufgabe, für die GolfScript nahezu perfekt geeignet zu sein scheint.
Um den Code kurz zu halten, verwende ich denselben Code sowohl für die Verschlüsselung als auch für die Entschlüsselung: Zum Entschlüsseln subtrahiere ich den Schlüssel vom Chiffretext, während ich zum Verschlüsseln zuerst einen zufälligen Chiffretext generiere und dann den Klartext davon subtrahiere. Trotzdem nimmt der zusätzliche Code für die Implementierung des Verschlüsselungsmodus etwas mehr als die Hälfte der Programmlänge in Anspruch.
De-Golf-Version mit Kommentaren:
quelle
Rubin (
200185)Probeläufe + WC:
quelle
s[k=(p=f).map{rand 26}],r[k,p,:-]
sollte geschrieben werdens[k=f.map{rand 26}],r[k,$_,:-]
$_
nur die letzte Zeile durchgelesen wirdgets
.f
auch.scan(/./).map{|b|b.ord-65}
nach dem Lesen einer Zeile.Haskell, 203 Zeichen
Beispiel:
quelle
Perl,
220171 ZeichenProbelauf:
Hinweis: Zumindest wenn ich es ausführe, wird "Drücken Sie eine beliebige Taste, um fortzufahren ..." an das Ende der letzten Ausgabe angehängt. Ich hoffe das ist ok, da es nicht Teil des Programms ist. Wenn nicht, kann ich es so machen, dass es in der nächsten Zeile erscheint.
Dies ist mein erstes richtiges Programm in Perl und mein erstes Golfprogramm überhaupt, daher würde ich mich über Tipps sehr freuen. Auch habe ich gefunden
/(.)/g
im Internet gefunden, aber ich habe keine Ahnung, wie es funktioniert (ist es ein regulärer Ausdruck? Ich habe die noch nicht gelernt). Kann es mir jemand erklären?EDIT: Dank an Ilmari Karonen, die mir bei den Regexps geholfen hat, habe ich mein neues Wissen genutzt, um 7 Zeichen zu speichern!
Erweiterte, leicht lesbare Version:
quelle
/(.)/g
ist ein regulärer Ausdruck. Sie werden definitiv diese lernen wollen, wenn Sie Perl Golf spielen wollen. perldoc.perl.org/perlre.html ist kein schlechter Startplatz.Python -
304295Ich glaube, dass dies genau den Spezifikationen entspricht
(einschließlich derwird nicht validiert, daher denke ich, dass nur eine Müllausgabe erzeugt wird, wenn Sie Zeichen außerhalb von eingeben'>'
am Anfang der Eingabe stehenden Eingabeaufforderungen). Die Eingabe[A-Z]
. Es wird auch nur der erste Buchstabe des Eingabebefehls überprüft. Alles, was mit beginnt,D
führt zu einer Entschlüsselung, und alles andere führt zu einer Verschlüsselung.quelle
>
, ich habe es nur verwendet, um zu demonstrieren, welche Zeilen ausgegeben wurden. Sie müssen diese nicht implementieren.C ++ -
220241 Zeichen, 4 ZeilenBearbeiten 1- Die MSVS-Standardbibliothek scheint eine Menge unnötiger Dateien zu enthalten, was bedeutete, dass ios über alle benötigten Includes verfügte, dies funktionierte jedoch nicht mit anderen Compilern. Das ios wurde für die tatsächlichen Dateien geändert, die die benötigten Funktionen in cstdlib und cstdio enthalten. Vielen Dank an Ilmari Karonen für den Hinweis.
quelle
g++ otp.cpp
sagtotp.cpp: In function ‘int main()’: otp.cpp:3: error: ‘scanf’ was not declared in this scope otp.cpp:3: error: ‘rand’ was not declared in this scope otp.cpp:3: error: ‘puts’ was not declared in this scope otp.cpp:3: error: ‘puts’ was not declared in this scope
Python - 270
Beispielausgabe:
Zeichenanzahl:
quelle
J: 94 Bytes
Alle notwendigen Leerzeichen gezählt.
Kommentierte Version:
quelle
C # (
445416)Aggregat vergessen. Schneiden Sie ein gutes Stück ab.
Etwas golfen:
}
Golf gespielt:
quelle
C (159 + 11 für Compiler-Flags)
Golf gespielt:
Ungolfed:
Kompilieren mit
-Dg=gets(s)
.Beispiel:
quelle
JavaScript 239
Verwendung:
quelle
Ruby -
184179177 ZeichenFühren Sie es so aus:
$ ruby pad-lock.rb
Hier ist die ungolfed version falls jemand interessiert ist
quelle