Schreiben Sie ein Programm oder eine Funktion (oder eine Reihe von Programmen / Funktionen) zum Ver- und Entschlüsseln von Daten gemäß der folgenden Spezifikation:
Verschlüsselung
Berechnen Sie einen XOR-Hash der Eingabe, indem Sie jedes Byte miteinander XOR-verknüpfen.
XOR jedes Byte der Eingabe von diesem Hash.
Verschieben Sie das Ergebnis um vier Bits nach links.
Füllen Sie die linke Seite mit den ersten vier Bits des XOR-Hashs auf.
Füllen Sie die rechte Seite mit den letzten vier Bits des XOR-Hashs auf.
Beispiel
Eingegebene Eingabe:
"G0lf"
(0x47306C66
)Berechnen Sie den XOR-Hash:
0x47 ^ 0x30 ^ 0x6C ^ 0x66 = 0x7D
XOR jedes Byte von Hash:
0x3A4D111B
Erwartetes Ergebnis (nach Shift und Pad):
"s¤Ñ\x11½"
(0x73A4D111BD
)
Regeln
Ihr Programm / Ihre Funktion kann Eingaben / Ausgaben jeglicher Art in der von Ihnen gewählten Golfsprache (String, Byte Array usw.) vornehmen, solange die Eingaben / Ausgaben die tatsächlichen Bytes sind. Beispielsweise können Sie eine hexadezimale Zeichenfolge nicht ausgeben.
Verschlüsselung und Entschlüsselung können in getrennte Programme (Punktzahl entspricht der kombinierten Größe) oder in ein einzelnes Programm unterteilt werden. Einzelne Methoden können ein Argument annehmen, ob sie verschlüsseln oder entschlüsseln sollen.
Die Eingabe für die Verschlüsselung muss mindestens 1 Byte groß sein.
Die Eingabe für die Entschlüsselung muss mindestens 2 Byte betragen.
Nicht druckbare Bytes müssen in der Ausgabe nicht maskiert werden.
quelle
Antworten:
CJam, 28 + 27 = 55 Bytes
Für jeden Teil stelle ich ein Programm vor, das erwartet, dass die Eingabe / Ausgabe in Form eines Integer-Arrays erfolgt, und eines, das eine Zeichenfolge verwendet. Die obige Byteanzahl gilt für die Integer-Array-Version, das verknüpfte Skript und die Erläuterung gelten jedoch für die auf Zeichenfolgen basierende Version (die zum Testen des in der Frage angegebenen Beispiels verwendet werden kann).
Verschlüsselung
Entschlüsselung
Hier ist ein Testskript, das einen vollständigen Roundtrip durchführt und den verschlüsselten Code druckt, bevor die Entschlüsselung erneut durchgeführt wird.
Erläuterung
quelle
CJam, 36 + 34 = 70 Bytes
Ein etwas anderer Ansatz unter Verwendung von Binärformen
Verschlüsseln :
Wie es funktioniert:
Entschlüsseler :
Wie es funktioniert:
Probieren Sie den Ver- und Entschlüsseler online aus
quelle
Pyth, 69 Bytes
Dies kombiniert Verschlüsselung und Entschlüsselung. Fügen Sie einfach ein
0
Argument für die Verschlüsselung oder1
Entschlüsselung hinzu. Der Grund dafür ist einfach. Das Konvertieren von Strings in Bits (oder 4-Bit-Integer) oder umgekehrt ist in Pyth wirklich sehr lang. Durch die Kombination der beiden Funktionen in einem Programm kann ich eine Menge Bytes sparen.Online-Demonstrationen: Ver- und Entschlüsselung .
Erläuterung:
Der erste Teil konvertiert die Eingabe in eine Liste mit 4-Bit-Ganzzahlen (jedes Zeichen wird in 2 4-Bit-Ganzzahlen konvertiert) und speichert sie in
K
.Der zweite Teil bestimmt die Hash-Werte und speichert sie in
J
. WennQ==0
es sie mit xor berechnet, nimmt es andernfalls den ersten und letzten Wert von anK
.Der nächste Teil erledigt das xor unter Verwendung der Hash-Werte. Wenn
Q == 0
es auf der vollständigen Liste ausgeführt wirdK
, sonst nur auf der ListeK
ohne den ersten und letzten Wert.Und der letzte Teil konvertiert
K
zurück in Zeichen:quelle
Javascript ( ES6 ) 83 + 73 = 156
Beide Funktionen nehmen Eingaben als und geben ein Array von Zahlen zur Darstellung von Bytes aus.
Verschlüsseln Sie
85848375entschlüsseln 73Demonstration (nur Firefox)
Verwenden der Zeichenfolgen 131 + 129 = 260
Und nur zum Spaß ... hier sind einige Versionen, die stattdessen Zeichenfolgen für die Eingabe / Ausgabe verwenden.
quelle