Implementieren Sie ein CipherSaber- Verschlüsselungsprogramm wie unten beschrieben. Richtlinien:
- Der kleinste Eintrag in Bytes gewinnt.
- In Abweichung von den Code-Golf- Normen können Sie jedoch gerne interessante Einträge veröffentlichen, auch wenn es sich nicht um ernsthafte Golfeinträge handelt.
- Ein Eintrag ist normalerweise ein Programm, das den Klartext von der Standardeingabe übernimmt und den Chiffretext in die Standardausgabe schreibt, wobei der Schlüssel (vom Benutzer) auf eine von Ihnen bevorzugte Weise angegeben wird.
- Wenn Sie dies jedoch als Prozedur implementieren möchten, ist dies ebenfalls in Ordnung.
- Die IV muss von einem kryptografisch sicheren Pseudozufallszahlengenerator stammen. Wenn Ihre Sprache dies nicht unterstützt, wählen Sie eine andere. ;-);
- Bitte verwenden Sie keine kryptospezifischen Bibliotheken, Systemaufrufe oder Anweisungen (außer dem PRNG, wie oben angegeben). Generelle bitweise Operationen auf niedriger Ebene sind natürlich in Ordnung.
CipherSaber ist eine Variante von RC4 / Arcfour, daher beschreibe ich zunächst Letzteres und dann die Änderungen, die CipherSaber daran vornimmt.
0. RC4 / Arcfour
Arcfour ist an anderer Stelle vollständig spezifiziert , aber der Vollständigkeit halber werde ich es hier beschreiben. (Bei Abweichungen zwischen dem Internet-Entwurf und dieser Beschreibung ist die erstere normativ.)
Schlüsseleinstellung
Richten Sie zwei Arrays, S
und S2
sowohl der Länge 256, wobei k_1
das erste Byte des Schlüssels ist, und k_n
ist das letzte.
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
( S2
wird immer wieder mit den Bytes des Schlüssels gefüllt, bis alle 256 Bytes voll sind.)
Initialisieren Sie dann j
auf 0 und mischen Sie 256 Mal:
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
Damit ist die Schlüsseleinrichtung abgeschlossen. Das S2
Array wird hier nicht mehr verwendet und kann gesäubert werden.
Erzeugung von Chiffrestreams
Initialisieren Sie i
und j
auf 0 und generieren Sie dann den Schlüsselstrom wie folgt:
i = 0
j = 0
while true
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap S[i], S[j]
k = (S[i] + S[j]) mod 256
yield S[k]
end
Daten verschlüsseln / entschlüsseln
- Zum Verschlüsseln XOR die Keystream-Ausgabe mit dem Klartext
- Zum Entschlüsseln XOR die Schlüsselstromausgabe mit dem Chiffretext
1. CipherSaber
CipherSaber (was wir in dieser Frage implementieren) ist eine Variation von RC4 / Arcfour in zweierlei Hinsicht:
10 Byte IV / Nonce
Beim Verschlüsseln einer Nachricht sollten 10 zufällige Bytes abgerufen werden, z. B. via /dev/urandom
, und in die ersten 10 Bytes der verschlüsselten Ausgabe geschrieben werden. Beim Entschlüsseln einer Nachricht sind die ersten 10 Bytes der Eingabe die IV, mit der sie verschlüsselt wird.
Die Einrichtungsphase für RC4 / Arcfour-Schlüssel wird mit passphrase || IV
dem Schlüssel ausgeführt, wobei passphrase
die benutzerdefinierte Passphrase IV
wie oben beschrieben und ||
verkettet ist. Also eine Passphrase von "Hallo Welt!" und eine IV von "Supercalif" (wie unwahrscheinlich das auch sein mag :-P) würde zu einem Schlüssel von "Hallo Welt! Supercalif" führen.
Mehrere Iterationen der Schlüsselkonfiguration
Um die Sicherheitsanfälligkeit zu vermeiden, durch die die WEP-Verschlüsselung vollständig beschädigt wurde, wird die Mischschleife der Schlüssel-Setup-Phase von RC4 eine benutzerdefinierte Anzahl von Malen ausgeführt. Der Wert von j
sollte zwischen den Iterationen beibehalten werden.
2. Testvektoren
Hier sind einige Testvektoren, mit denen Sie Ihre Programme testen können. Darüber hinaus hat squeamish ossifrage ein CipherSaber-Verschlüsselungs- und Entschlüsselungstool erstellt , mit dem Sie Ihre Ergebnisse validieren können.
Sie müssen nur das Verschlüsselungsprogramm implementieren. Sie müssen das Entschlüsselungsprogramm nicht angeben, aber die Ausgabe Ihres Verschlüsselungsprogramms muss korrekt zur ursprünglichen Eingabe zurückkehren, wenn sie mit einem korrekt implementierten Entschlüsselungsprogramm unter Verwendung des richtigen Schlüssels verarbeitet wird.
quelle
urandom
erstellen , die verwendet (was ein separater Eintrag sein kann, wenn Sie möchten), wenn Sie sich für "Gewinnen" interessieren. :-)Python 2 -
373350326317 BytesPyth kommt möglicherweise später. Definiert eine Funktion,
c(p,d,r,m)
die Bytelisten für Passphrase und Daten verwendet, und int für Wiederholungen und den Modus, der bei 1 verschlüsselt und bei 0 entschlüsselt. Dies liegt daran, dass der einzige Unterschied darin besteht, dass es sich um die IV handelt. Gibt die Byteliste zurück.Hier sind einige Testcode- / Hilfsfunktionen:
quelle
else:v,d=d[:10],d[10:]
Teil entfernen .Ruby - 263 Zeichen
Dies ist meine Ruby-Antwort auf die ursprüngliche Frage zum Stackoverflow im Jahr 2010! Es ist ein Codierer und Decodierer in einem Programm
Parameter sind:
e oder d (zum Codieren oder Decodieren)
Schlüssel
wie oft
quelle
C 312 Bytes
Akzeptiert eine Anzahl von Schlüssel- und Schlüsselmischungsiterationen in der Befehlszeile und verschlüsselt dann alles auf stdin in stdout. Dies verwendet die BSD / Darwin-Bibliotheksfunktion
arc4random()
, bei der es sich um ein auf RC4 basierendes PRNG handelt. Es sät sich automatisch selbst, sodass die Ergebnisse jedes Mal anders sind.Ordentlichere Version:
Beispiel:
quelle
Python - 266 Zeichen
Dies ist meine Python-Antwort auf die ursprüngliche Frage zum Stackoverflow im Jahr 2010! Es ist ein Codierer und Decodierer in einem Programm
Parameter sind:
e oder d (zum Codieren oder Decodieren)
Schlüssel
wie oft
Diese Version versucht, die 2 Schleifen des rc4 zu einer zusammenzuführen (spart bisher 11 Bytes ...)
quelle