/ / XOR-Entschlüsselung von zwei Klartextzeichenfolgen - Java, Verschlüsselung, Binär, XOR

XOR-Entschlüsselung von zwei Klartextzeichenfolgen - Java, Verschlüsselung, Binär, XOR

Ich wurde in meiner AP Java-Klasse beauftragt, Folgendes zu entschlüsseln: umzDlBF8aFix

mit folgendem Schlüssel: oE2dpffzEiFD

Das einzige Problem ist, dass ich nicht weiß, wie man ein XOR macht, um diese zu entschlüsseln. Ich bin so weit gekommen, sie in Binärdateien umzuwandeln:

Schlüssel: 101000 | 000100 | 110110 | 011101 | 101001 | 011111 | 110011 | 000100 | 100010 | 000101 | 000011

Geheimtext: 110110 | 100110 | 110011 | 100101 | 000001 | 111100 | 011010 | 000101 | 100011 | 110001

Aber ich weiß nicht, was ich damit anfangen soll. Wenn Sie mir dabei helfen könnten, wäre das großartig! Code wäre auch nett, würde aber nicht benötigt.

Tausend Dank!

Antworten:

0 für die Antwort № 1

Sie müssen sie nicht in Binärdateien umwandeln. XOR ist eine bitweise Operation, sodass Sie zwei Bytes zusammen XOR-verknüpfen können. Dabei wird jedes Bit eines Bytes mit dem entsprechenden Bit des anderen Bytes XOR-verknüpft.

Schreiben Sie einfach eine Schleife von Null bis (und ohne)Die Länge der Chiffre, in der Sie jedes Zeichen aus der Chiffre lesen, XOR mit dem entsprechenden Zeichen aus dem Schlüssel und das Ergebnis an einen StringBuilder anhängen. Dann aufrufen .toString() auf dem StringBuilder, um Ihr Ergebnis zu erhalten.

Wenn sich Ihr Compiler beschwert, dass er keine XOR-Zeichen verwenden kann, setzen Sie jedes Zeichen um char zu einem byteFühren Sie das XOR zwischen den Bytes aus und wandeln Sie das Ergebnis in a um char.

Das String Klasse hat a charAt() Methode, mit der Sie einen Charakter aus einem erhalten könnenspezifischer Index in der Zeichenfolge. Alternativ können Sie zunächst den Inhalt jeder Zeichenfolge als Zeichenarray abrufen. (Dafür gibt es noch eine andere Funktion.)

Als Bonus können Sie es so machen, dass der Schlüssel es tutmüssen nicht die gleiche Länge wie die Chiffre haben. Sie können einen separaten Index für die Adressierung der Chiffre verwalten. Wenn dieser Index die Länge der Chiffre erreicht, können Sie ihn auf Null zurücksetzen und so die Chiffre von Anfang an lesen.


0 für die Antwort № 2

Der XOR-Operator hat die Eigenschaft, dass T XOR K.XOR K == T Wenn Sie also einen Klartext T mit einem Schlüssel K verschlüsseln möchten, wenden Sie die Operation C = T XOR K an. Um den Text zu entschlüsseln, müssen Sie nur dieselbe Operation erneut anwenden (T = C. XOR K). Sie können die XOR-Operation mit einer for-Schleife oder einer funktionalen Programmierzuordnung auf jedes Byte im Klartext anwenden.

BEARBEITEN: Falls Sie es benötigen, wird der XOR-Operator in Programmiersprachen durch das Zeichen "^" dargestellt, sodass A ^ B A XOR B bedeutet.

EDIT2: einfacher Beweis, dass T XOR K XOR K == T, nur damit Sie es nicht so akzeptieren müssen, wie es magisch ist:

  • K XOR K ist eindeutig gleich 0
  • T XOR 0 ist eindeutig gleich T.
  • Da der XOR-Operator zusammen mit Binärzahlen assoziativ ist, können wir T XOR K XOR K als T XOR (K XOR K) == T XOR 0 == T schreiben

0 für die Antwort № 3

Wie andere angemerkt haben, ist "xor" ein wunderbaresVerschlüsselungsmechanismus, da die Verschlüsselung und die Entschlüsselung genau die gleiche Operation sind. Wenn Sie jeden Teil des Schlüssels nur einmal verwenden, verfügen Sie über den sichersten Verschlüsselungsalgorithmus.

Wenn Sie einen Teil des Schlüssels wiederverwenden, wird er zu einem der schlechtesten Verschlüsselungsmechanismen, da er dadurch leicht zu knacken ist.

Das Problem, das Sie hier haben, ist - wie geht es Ihnen?von den Zeichen bis zu dem Wert, den Sie verschlüsseln möchten. Sie könnten die Unicode-Zeichenwerte verwenden, aber Sie würden mit Ihrem Chiffretext und Schlüssel falsche Ergebnisse erhalten. Das Problem bei der Verwendung von Unicode wie es ist auch, dass Sie nach der Verschlüsselung / Entschlüsselung möglicherweise nicht druckbare Zeichen erhalten, was normalerweise kein Problem ist, aber in Lehrbuchbeispiele Es ist schwierig, nicht druckbare Zeichen zu drucken.

Um Ihren Text zu entschlüsseln, habe ich angenommen, dass die Übersetzung von Zeichen so funktioniert.

  • A - Z => 0 - 25
  • a - z => 26 - 51
  • 0 - 9 => 52 - 61

(Ich musste nicht raten, was 62/63 sein würde, aber Raum und Punkt wären gute Vermutungen).

Mit dieser Annahme und xor nehme ich Ihren Chiffretext umzDlBF8aFix und dein Schlüssel oE2dpffzEiFD und am Ende mit dem Klartext GiFeMeaPenny.

Da dies lesbar ist Englisch - "Gib mir einen Cent"- es sieht so aus, als wären die obigen Annahmen plausibel.