Schon gewusst?

Bit-Shift

Eine hausgemachte Verschlüsselungslösung

Funktionsweise

Verschlüsseln

Die Bitshift-Chiffre funktioniert, indem (wie der Name schon sagt) die Bits des ASCII-Textes verschoben werden. Dies geschieht mit dem bitweisen <<-Operator, mit dem die Bits um eine bestimmte Anzahl von Stellen verschoben werden.

Um den Text zu kodieren, durchlaufen wir den Text in einer Schleife. Für jedes Zeichen x durchlaufen wir das Schlüssel-Array und für jedes Schlüsselzeichen i:

x = x + 1 << i % 8

Wir begrenzen die maximale Verschiebung mit Modulo, um zu vermeiden, dass ein Bit um Hunderte von Stellen verschoben wird.

Beispiel:

Nehmen wir an, wir arbeiten gerade an dem Zeichen A, und unser Schlüssel ist YO

A = 0b01000001 # ASCII for A
    0b01000010 # plus 1
    0b010000100 # Y ist 89, 89 % 8 = 1, also 1 Null hinzufügen
    # nächstes Zeichen im Schlüssel: O
    0b010000101 # plus 1
    0b0100001010000000 # O ist 79, 79 % 8 = 7, also 7 Nullen hinzufügen.

Nachdem jedes Zeichen kodiert wurde, fügen wir es einem Array hinzu und kehren den Schlüssel um, um die Häufigkeitsanalyse zu erschweren.

Nehmen wir an, das nächste Zeichen in unserer Zeichenkette ist B, unser Schlüssel ist jetzt OY, da er umgekehrt wurde.

B = 0b01000010 # ASCII for B
    0b01000011 # plus 1
    0b010000110000000 # O ist 79, 79 % 8 = 7, also 7 Nullen hinzufügen.
    # next character in key: Y
    0b010000110000001 # plus 1
    0b0100001100000010 # Y ist 89, 89 % 8 = 1, also 1 Null hinzufügen.

Unser Array sieht nun wie folgt aus: [0b0100001010000000, 0b0100001100000010], oder in Dezimalzahlen: [17024, 17154].

Schließlich kodieren wir das Array in base64, um die endgültige verschlüsselte Zeichenfolge zu erhalten: b'WzE3MDI0LCAxNzE1NF0='.

Verschlüsseln

Bei der Dekodierung wird zunächst die base64-Zeichenfolge dekodiert und ausgewertet, und dann wird der Schlüssel umgekehrt. Anschließend können wir den Text und den Schlüssel wie bei der Kodierung in einer Schleife durchlaufen:

x = x - 1 >> i % 8

Beispiel:

Das Zeichen A wurde als 0b0100001010000000 kodiert. Der Schlüssel war YO, aber da wir ihn umgedreht haben, verwenden wir OY.

A = 0b0100001010000000
  = 0b0100001001111111  # minus 1
  = 0b010000100 # O ist 79, 79 % 8 = 7, also entfernen wir die 7 niederwertigsten Bits
  # nächstes Zeichen im Schlüssel: Y
  = 0b010000011 # minus 1
  = 0b01000001 # Y ist 89, 89 % 8 = 1, also entfernen wir das niedrigstwertige Bit

0b01000001 ist A in ASCII, wir haben also den ersten Buchstaben erfolgreich entschlüsselt. Wir machen so weiter, wobei wir darauf achten, dass wir den Schlüssel jedes Mal umdrehen.

Vor- und Nachteile

Vorteile

  • Die Umkehrung des Schlüssels erschwert die Häufigkeitsanalyse.
  • Schlüssel kann beliebig lang sein (theoretisch, hängt von der Programmiersprache ab) und Sonderzeichen enthalten, was Brute-Force erschwert.

Nachteile

  • Unterschiedliche Sprachen haben unterschiedliche Ausgaben, abhängig von der base64-Unterstützung.
  • Entwickelt bei CrypTools von @arguiot, der kein professioneller Kryptologe ist, daher kann es einige Sicherheitsprobleme geben.

Implementierungen

Sprache Encrypt Decrypt
Javascript encrypt.js decrypt.js
Python encrypt.py decrypt.py
Swift lib.swift lib.swift

Paketmanager

NPM:
npm i @cryptoolsorg/bitshiftcipher

Quelle: CrypTools Cipher Repository