Bei der Caesar-Verschlüsselung haben wir bereits den Text in Zahlen verwandelt, um mit den Zahlen rechnen zu können. Wir sagen diesem Vorgehen auch Textcodierung. Typischerweise verwandeln wir dabei jeden Buchstaben in eine Binärzahl. Eine gängige Codierung von Text verwendet die ASCII-Codierung.

Weshalb tun wir das? Der Vorteil ist, dass wir mit einem binären Code nicht nur Texte, sondern auch alle anderen Daten (Bilder, Videos…) verschlüsseln können.

Achtung: Textcodierung ist noch keine Verschlüsselung, sondern nur eine 1:1 Übersetzung in ein anderes Datenformat.

Probier es aus!

In Python können wir einen Buchstaben mit der ord() Funktion in die entsprechende ASCII-Zahl verwandeln, und mit chr() wieder zurück:

letter = 'A' # Muss ein einzelner Buchstabe sein! print(ord(letter))
print(chr(65))

Um die Zahl im Binärformat auszugeben, können wir die format() Funktion wie folgt verwenden:

print(format(65, "b"))

String Formatierung

Oft möchten wir einen längeren Text ausgeben, wobei nur einzelne Teile an der richtigen Stelle eingefügt werden sollen. Dafür verwenden wir einen f-String, d.h. vor dem ersten Anführungszeichen steht der Buchstabe f. Im String können mit geschweiften Klammern Python-Ausdrücke (z.B. Variablen) in die Ausgabe eingefügt werden:

name = "Papa Moll" age = 42 print(f"Ich heisse {name} und bin {age*365} Tage alt.")

Um das Ausgabeformat des Arguments zu kontrollieren, fügen wir im entsprechenden Platzhalter eine Format Specification ein: nach der Variablen wird nach einem Doppelpunkt das Ausgabeformat eingeben, in Beispiel unten 07b. Das b bedeutet wie oben die Ausgabe als Binärzahl; die vorangestellte 7 gibt die Breite (width) an, also, dass mindestens sieben Zeichen verwendet werden sollen; die 0 gibt an, mit welchem Zeichen wir die Zahl auffüllen wollen, wenn die Breite nicht erreicht wird:

# Die gleiche Zahl wird zweimal ausgegeben: # einmal im normalen Dezimalformat, # einmal als Binärzahl (b) # - mit einer Breite von mindestens 7 Stellen # - vorne mit Nullen (0) aufgefüllt. number = 42 print(f"Die Binärform von {number} ist {number:07b}")

Drucke eine ASCII-Tabelle aus mit folgenden Einträgen: Buchstaben a-z, A-Z, Zifferen 0-9, Leerzeichen , Punkt . Für jeden Eintrag soll der Buchstabe sowie seine ASCII-Codierung in Dezimal- und im Binärformat enthalten sein. Das Binärformat soll 8 bits (=1 byte) enthalten und vorne mit Nullen aufgefüllt werden.

A  |      65 | 01000001
B  |      66 | 01000010
C  |      67 | 01000011
D  |      68 | 01000100
...

Lösung:

Da wir jetzt mit Bits arbeiten statt mit Buchstaben, müssen wir uns eine neue Verschlüsselungstechnik ausdenken. Eine Verschiebung wie bei der Cäsar-Verschlüsselung macht nicht mehr viel Sinn, wenn nur noch die Zeichen 0 und 1 zur Verfügung stehen.

Eine einfache Operation auf Bits ist die XOR (eXclusive OR) Operation. Wie der Name andeutet werden bei der XOR-Operation zwei Bits so verknüpft, dass das Resultat genau dann 1 ist, wenn der eine oder der andere der Operanden 1 ist, aber nicht beide. Die folgende Wahrheitstabelle zeigt, wie je ein Bit des Plaintext (p) mit einem Bit des Key (k) zum Ciphertext (c) verknüpft werden.

Die Entschlüsselung funktioniert gleich wie die Verschlüsselung, weil (p XOR k) XOR k = p gilt.

Verschlüssle den folgenden Binärcode:

01101000 01100001 01101100

mit diesem Schlüssel

01010011 01110101 01100111

Lösung:

Gegeben ist folgender Geheimtext: 7 42 32 60. Die ASCII-Codes sind hier als Dezimalzahlen angegeben. Das Schlüsselwort heisst WOLF.

  1. Schreibe die Dezimalzahlen als 7-stellige Binärzahlen nebeneinander auf ein Blatt Papier. Wenn möglich ohne Taschenrechner.
  2. Schreibe unter die vier Binärzahlen die ASCII-Codes für die vier Buchstaben des Schlüsselworts. Dazu benutzt du die ASCII-Tabelle oder die Tabelle aus Aufgabe 1.
  3. Führe die XOR-Operation Bit-für-Bit für jedes Binärzahl-Paar durch. So erhältst du die Binärzahlen des Klartexts.
  4. Mit der ASCII-Tabelle kannst du nun die Binärzahlen in Buchstaben wandeln und erhälst den Klartext.

In Python können wir einen String, der eine Binärzahl codiert, mit der int() Funktion in eine richtige Zahl verwandeln, indem wir die Basis 2 angeben:

print(int('101010', 2))

Die binäre XOR-Operation wird in Python mit dem ^ Operator ausgeführt:

one = '11110000' two = '01010101' one_number = int(one, 2) two_number = int(two, 2) xor = one_number ^ two_number print(f"{one} XOR {two} = {xor:08b}")

Mit diesen Informationen solltest du ein Programm schreiben können, das den folgenden Text entschlüsselt.

  • der Schlüssel lautet „ROMANSHORN“, wobei immer der ASCII-Code jedes Buchstabens verwendet wird.
  • die Buchstaben des Schlüssels werden alle 10 Buchstaben wieder von vorne verwendet.
  • mit split() kann ein String in einzelne Wörter geteilt werden: for word in "eins zwei drei".split():
00010110 00100110 00101000 01100001 00011101 00100110 00101111 00111010
00100001 01101110 00100001 00100110 00100011 00100101 01101110 00110010
00100100 00100011 00110111 01101111

Lösung:

Entschlüssle das folgende Bild mit einem eigenen Code. Den verwendeten Schlüssel findest du unten.

Klicke auf das Bild und lade es dann herunter.

Schlüssel

Tipps

Lösung

  • gf_informatik/verschluesselung/codierung.txt
  • Zuletzt geändert: 2025-04-01 14:30
  • von hof