Lernziele
- Sie haben den Vigenère-Cipher in Python umgesetzt und verstehen den Code. Insbesondere
- wie Sie auf einzelne Zeichen in einem String zugreifen können,
- wie der Modulo-Operator hilft, den Schlüssel zu wiederholen,
- wie Sie einen Buchstaben in eine Zahl umwandeln können,
- und wie Sie die Caesar-Funktionen aus der letzten Lektion wiederverwenden.
Die Vigenère-Verschlüsselung ist eine Erweiterung der Caesar-Verschlüsselung. Statt einem einzigen Buchstaben als Schlüssel verwenden wir hier ein ganzes Wort als Schlüssel. Jeder Buchstabe des Schlüssels gibt an, um wie viele Positionen der entsprechende Buchstabe des Klartextes verschoben wird.
Wir bauen nun die Vigenère-Verschlüsselung Schritt für Schritt auf.
1️⃣ Zeichen in einem String adressieren
In Python können wir auf einzelne Zeichen in einem String zugreifen, ähnlich wie bei einer Liste. Wir verwenden dafür eckige Klammern und den Index (die Position) des Zeichens.
WichtigIn Python beginnt der Index bei 0, nicht bei 1!
Aufgabe: Ergänzen Sie den Code so, dass auch das dritte und vierte Zeichen ausgegeben werden.
Lösungtext = "PYTHON" print("Erstes Zeichen:", text[0]) print("Zweites Zeichen:", text[1]) print("Drittes Zeichen:", text[2]) print("Viertes Zeichen:", text[3])
2️⃣ Schlüssel mit Modulo wiederholen
Bei der Vigenère-Verschlüsselung ist der Schlüssel oft kürzer als der Klartext. Der Schlüssel muss sich daher wiederholen. Hier hilft uns wieder der Modulo-Operator %, den Sie bereits aus der vorherigen Lektion kennen.
Mit i % len(schluessel) können wir durch die Indizes des Schlüssels rotieren:
Aufgabe: Was gibt der folgende Code aus? Überlegen Sie zuerst, dann führen Sie den Code aus.
ErklärungDer Code gibt aus:
0, 1, 2, 0, 1, 2, 0, 1Die Werte wiederholen sich immer im Zyklus 0, 1, 2 – genau das brauchen wir, um einen Schlüssel der Länge 3 zu wiederholen!
3️⃣ Schlüsselbuchstaben zu Verschiebung konvertieren
Bei der Caesar-Verschlüsselung haben wir eine Zahl als Verschiebung verwendet. Bei Vigenère ist der Schlüssel ein Wort. Wir müssen jeden Buchstaben des Schlüssels in eine Zahl umwandeln.
Die Funktion ord() gibt den ASCII-Code eines Zeichens zurück:
Für die Vigenère-Verschlüsselung können wir ord(buchstabe) direkt als Verschiebung verwenden – genau wie in unserer Caesar-Funktion.
Aufgabe: Vervollständigen Sie den Code, um die Verschiebung für jeden Buchstaben des Schlüssels auszugeben.
Lösungschluessel = "KEY" verschiebung_0 = ord(schluessel[0]) print(f"'{schluessel[0]}' hat ASCII-Code {verschiebung_0}") verschiebung_1 = ord(schluessel[1]) print(f"'{schluessel[1]}' hat ASCII-Code {verschiebung_1}") verschiebung_2 = ord(schluessel[2]) print(f"'{schluessel[2]}' hat ASCII-Code {verschiebung_2}")
4️⃣ Ein einzelnes Zeichen mit Schlüsselbuchstabe verschlüsseln
Jetzt kombinieren wir das Gelernte: Wir verschlüsseln ein einzelnes Zeichen mit einem Schlüsselbuchstaben. Dazu verwenden wir unsere caesar_encrypt-Funktion aus der letzten Lektion.
VoraussetzungStellen Sie sicher, dass Sie in der Datei
caesar.pyIhre Lösung der letzten Lektion einfügen.
Aufgabe: Ändern Sie den Code so, dass das Zeichen 'W' mit dem Schlüsselbuchstaben 'X' verschlüsselt wird. Was kommt heraus?
Lösungfrom caesar import caesar_encrypt, caesar_decrypt klartext_zeichen = 'W' schluessel_zeichen = 'X' verschiebung = ord(schluessel_zeichen) cipher_zeichen = caesar_encrypt(klartext_zeichen, verschiebung) print(f"'{klartext_zeichen}' → '{cipher_zeichen}'")Die Ausgabe ist
'W' → 'j'(ASCII-Code von 'X' ist 88).
5️⃣ Die komplette Vigenère-Verschlüsselung
Jetzt setzen wir alles zusammen! Die Idee ist:
- Wir iterieren durch jeden Buchstaben des Klartextes (mit Index
i) - Der Schlüsselbuchstabe ist
schluessel[i % len(schluessel)]– so wiederholt sich der Schlüssel - Wir verschlüsseln jeden Buchstaben mit
caesar_encrypt
Aufgabe: Vervollständigen Sie die Funktion vigenere_encrypt.
Lösungfrom caesar import caesar_encrypt, caesar_decrypt def vigenere_encrypt(klartext, schluessel): ciphertext = "" for i in range(len(klartext)): buchstabe = klartext[i] schluessel_buchstabe = schluessel[i % len(schluessel)] verschiebung = ord(schluessel_buchstabe) ciphertext = ciphertext + caesar_encrypt(buchstabe, verschiebung) return ciphertext ergebnis = vigenere_encrypt("HALLO", "KEY") print("Verschlüsselt:", ergebnis)
6️⃣ Die Vigenère-Entschlüsselung
Zum Entschlüsseln verwenden wir caesar_decrypt statt caesar_encrypt. Der Rest bleibt gleich!
Aufgabe: Schreiben Sie die Funktion vigenere_decrypt analog zu vigenere_encrypt.
Lösungfrom caesar import caesar_encrypt, caesar_decrypt def vigenere_encrypt(klartext, schluessel): ciphertext = "" for i in range(len(klartext)): buchstabe = klartext[i] schluessel_buchstabe = schluessel[i % len(schluessel)] verschiebung = ord(schluessel_buchstabe) ciphertext = ciphertext + caesar_encrypt(buchstabe, verschiebung) return ciphertext def vigenere_decrypt(ciphertext, schluessel): klartext = "" for i in range(len(ciphertext)): buchstabe = ciphertext[i] schluessel_buchstabe = schluessel[i % len(schluessel)] verschiebung = ord(schluessel_buchstabe) klartext = klartext + caesar_decrypt(buchstabe, verschiebung) return klartext # Test geheim = vigenere_encrypt("GEHEIM", "PASSWORT") print("Verschlüsselt:", geheim) entschluesselt = vigenere_decrypt(geheim, "PASSWORT") print("Entschlüsselt:", entschluesselt)
✅ Zusammenfassung
Herzlichen Glückwunsch! Sie haben die Vigenère-Verschlüsselung implementiert!
Hier ist die komplette Lösung als Datei:
from caesar import caesar_encrypt, caesar_decrypt
def vigenere_encrypt(klartext, schluessel):
"""Verschlüsselt einen Text mit dem Vigenère-Verfahren."""
ciphertext = ""
for i in range(len(klartext)):
buchstabe = klartext[i]
schluessel_buchstabe = schluessel[i % len(schluessel)]
verschiebung = ord(schluessel_buchstabe)
ciphertext = ciphertext + caesar_encrypt(buchstabe, verschiebung)
return ciphertext
def vigenere_decrypt(ciphertext, schluessel):
"""Entschlüsselt einen mit Vigenère verschlüsselten Text."""
klartext = ""
for i in range(len(ciphertext)):
buchstabe = ciphertext[i]
schluessel_buchstabe = schluessel[i % len(schluessel)]
verschiebung = ord(schluessel_buchstabe)
klartext = klartext + caesar_decrypt(buchstabe, verschiebung)
return klartext
# Testaufrufe (werden nur ausgeführt, wenn die Datei direkt gestartet wird)
if __name__ == "__main__":
nachricht = "Das ist eine geheime Nachricht!"
schluessel = "PYTHON"
verschluesselt = vigenere_encrypt(nachricht, schluessel)
print("Verschlüsselt:", verschluesselt)
entschluesselt = vigenere_decrypt(verschluesselt, schluessel)
print("Entschlüsselt:", entschluesselt)
Was wir gelernt haben:
| Konzept | Anwendung |
|---|---|
string[i] | Zugriff auf das i-te Zeichen eines Strings |
i % n | Erzeugt Werte von 0 bis n-1, die sich wiederholen |
ord(zeichen) | Liefert den ASCII-Code eines Zeichens |
len(string) | Liefert die Länge eines Strings |