XOR
Einzelbits werden XOR-verknüpft (typische Komponente komplexerer Chiffren)XOR ist eine einfache adaptive Chiffre, die auf dem logischen XOR basiert.
Funktionsweise
Verschlüsseln
Die XOR-Chiffre verschlüsselt eine Nachricht mit Hilfe der booleschen XOR-Operation (Exklusiv-Oder). Stellen A und B einzelne Bits dar, dann ergibt A XOR B 1, wenn A und B unterschiedlich sind, und 0, wenn sie gleich sind.
A | B | A XOR B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Vor der Verschlüsselung werden die Zeichenkette und der Schlüssel in ihre ASCII-Äquivalente umgewandelt und dann wird jedes Bit jedes Zeichens mit jedem Bit des Schlüssels XOR-verknüpft. Wenn wir z.B. den String "XOR" mit dem Schlüssel 134 verschlüsseln wollen, würden wir Folgendes tun:
X O R
01011000 01001111 01010010 # String in ASCII
10000110 10000110 10000110 # Schlüssel 134 in ASCII (repeating)
--------------------------
11011110 11001001 11010100 # XOR Ergebnis
Þ É Ô # Ergebnis in Klartext umgewandelt
Bei der Implementierung in Python erhalten wir char ^ key
.
Wie Sie vielleicht bemerkt haben, wird bei dieser Chiffre ein bestimmtes Zeichen immer durch das gleiche Zeichen ersetzt. Das macht die Häufigkeitsanalyse einfacher. Um dies zu vermeiden, können wir einen sich nicht wiederholenden Schlüssel verwenden, z. B. 29, 62, 134
, wobei wir die Schlüssel in einer Schleife durchlaufen, um jedes Zeichen zu verschlüsseln.
X O R
88 79 82
29 62 134
----------
69 113 212
E q Ô
Entschlüsseln
XOR hat eine Reihe von Eigenschaften:
A XOR A = 0
A XOR 0 = A
(A XOR B) XOR C = A XOR (B XOR C)
Daraus können wir schließen, dass:
B XOR A XOR A = B XOR 0 = B
Um eine Nachricht zu entschlüsseln, müssen wir sie also mit demselben Schlüssel neu XOR-verschlüsseln, also neu codieren.
Þ É Ô # Verschlüsselter String
11011110 11001001 11010100 # String in ASCII
10000110 10000110 10000110 # Schlüssel 134 in ASCII (repeating)
--------------------------
01011000 01001111 01010010 # XOR Ergebnis
X O R # Entschlüsselter String
Nachteile
- Die Frequenzanalyse kann zum Knacken des Codes verwendet werden, wenn der Schlüssel nur ein Byte lang ist.
Implementierungen
Sprache | Encrypt | Decrypt |
---|---|---|
Javascript | encrypt.js | decrypt.js |
Python | encrypt.py | decrypt.py |
Swift | lib.swift | lib.swift |
Quelle: CrypTools Cipher Repository