ein freies Lehrmittel auf der Basis von eduskript

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.

Wichtig

In Python beginnt der Index bei 0, nicht bei 1!

Loading editor...

Aufgabe: Ergänzen Sie den Code so, dass auch das dritte und vierte Zeichen ausgegeben werden.

Loading editor...
Lösung
text = "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:

Loading editor...

Aufgabe: Was gibt der folgende Code aus? Überlegen Sie zuerst, dann führen Sie den Code aus.

Loading editor...
Erklärung

Der Code gibt aus: 0, 1, 2, 0, 1, 2, 0, 1

Die 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:

Loading editor...

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.

Loading editor...
Lösung
schluessel = "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.

Voraussetzung

Stellen Sie sicher, dass Sie in der Datei caesar.py Ihre Lösung der letzten Lektion einfügen.

Loading editor...

Aufgabe: Ändern Sie den Code so, dass das Zeichen 'W' mit dem Schlüsselbuchstaben 'X' verschlüsselt wird. Was kommt heraus?

Loading editor...
Lösung
from 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:

  1. Wir iterieren durch jeden Buchstaben des Klartextes (mit Index i)
  2. Der Schlüsselbuchstabe ist schluessel[i % len(schluessel)] – so wiederholt sich der Schlüssel
  3. Wir verschlüsseln jeden Buchstaben mit caesar_encrypt

Aufgabe: Vervollständigen Sie die Funktion vigenere_encrypt.

Loading editor...
Lösung
from 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.

Loading editor...
Lösung
from 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:

KonzeptAnwendung
string[i]Zugriff auf das i-te Zeichen eines Strings
i % nErzeugt 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