Zum Inhalt springen
BetaEN
Lektion 2 von 5Informatik entdecken

Informatik entdecken · Lektion 2 · 45 Minuten

Geheimschriften – Caesar und Vigenère

Das lernst du

  • Die Caesar-Verschlüsselung verstehen und programmieren
  • Erkennen, warum Caesar leicht zu knacken ist
  • Mit einem Schlüsselwort nach Vigenère sicherer verschlüsseln

Geheime Botschaften

Schon vor über 2000 Jahren wollten Menschen Nachrichten so schreiben, dass Fremde sie nicht lesen können. Der römische Feldherr Julius Caesar soll dafür einen einfachen Trick benutzt haben. Heute verschlüsseln dein Handy und dein Browser ständig – mit viel stärkeren Verfahren, aber nach derselben Grundidee.

Die Caesar-Verschlüsselung

Jeder Buchstabe wird um eine feste Zahl im Alphabet verschoben. Bei einer Verschiebung um 3 wird aus A ein D, aus B ein E – und hinter Z geht es wieder bei A los. Das „wieder von vorne“ erledigt % 26:

def caesar(text, verschiebung):
    ergebnis = ""
    for zeichen in text:
        if "A" <= zeichen <= "Z":
            nummer = ord(zeichen) - ord("A")          # A = 0, B = 1, …
            nummer = (nummer + verschiebung) % 26
            ergebnis = ergebnis + chr(nummer + ord("A"))
        else:
            ergebnis = ergebnis + zeichen
    return ergebnis


geheim = caesar("TREFFEN UM ACHT", 3)
print(geheim)
print(caesar(geheim, -3))

Mit derselben Funktion entschlüsselst du auch: einfach um -3 zurückschieben.

Caesar knacken

Es gibt nur 25 sinnvolle Verschiebungen. Ein Computer probiert sie alle in Sekundenbruchteilen aus. Das nennt man Brute Force („rohe Gewalt“). Findest du die Nachricht?

def caesar(text, verschiebung):
    ergebnis = ""
    for zeichen in text:
        if "A" <= zeichen <= "Z":
            ergebnis = ergebnis + chr((ord(zeichen) - ord("A") + verschiebung) % 26 + ord("A"))
        else:
            ergebnis = ergebnis + zeichen
    return ergebnis


geheim = "HIV WGLEXD PMIKX LMRXIV HIV XYVRLEPPI"
for versuch in range(1, 26):
    print(versuch, caesar(geheim, -versuch))

Eine Zeile ergibt Sinn – also ist Caesar nicht sicher.

Vigenère: mit Schlüsselwort

Der Franzose Blaise de Vigenère hatte im 16. Jahrhundert eine bessere Idee: Jeder Buchstabe wird unterschiedlich weit verschoben. Wie weit, sagt ein Schlüsselwort. Mit dem Schlüssel KEY wird der erste Buchstabe um K (10) verschoben, der zweite um E (4), der dritte um Y (24) – und dann geht es wieder mit K los:

TextHALLO
SchlüsselKEYKE
Verschiebung10424104
GeheimREJVS

Aus den beiden L werden jetzt verschiedene Buchstaben (J und V). Das macht das Knacken viel schwerer. Mit dem Rest-Operator % wiederholst du den Schlüssel immer wieder:

schluessel = "KEY"
for nummer in range(7):
    print(nummer, schluessel[nummer % len(schluessel)])

Gut zu wissen: Auch Vigenère gilt heute als geknackt – mit Statistik über häufige Buchstaben. Moderne Verschlüsselung wie AES rechnet mit Bits statt Buchstaben und ist so stark, dass selbst alle Computer der Welt zusammen sie nicht mit Brute Force knacken könnten.

Deine Aufgabe

Jetzt bist du dran

Schreib vigenere(text, schluessel, richtung). Der Text besteht aus Großbuchstaben, Leerzeichen und Satzzeichen. Jeder Buchstabe wird um den Wert des passenden Schlüssel-Buchstabens verschoben (A = 0, B = 1, … Z = 25). Der Schlüssel wiederholt sich – aber nur Buchstaben verbrauchen einen Schlüssel-Buchstaben. Alle anderen Zeichen bleiben, wie sie sind. richtung ist 1 zum Verschlüsseln und -1 zum Entschlüsseln.

def vigenere(text, schluessel, richtung):
    ergebnis = ""
    nummer = 0  # welcher Schlüssel-Buchstabe ist dran?
    for zeichen in text:
        ergebnis = ergebnis + zeichen
    return ergebnis


geheim = vigenere("HALLO WELT", "KEY", 1)
print(geheim)
print(vigenere(geheim, "KEY", -1))

Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.

Lösung anzeigen

Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:

def vigenere(text, schluessel, richtung):
    ergebnis = ""
    nummer = 0  # welcher Schlüssel-Buchstabe ist dran?
    for zeichen in text:
        if "A" <= zeichen <= "Z":
            verschiebung = ord(schluessel[nummer % len(schluessel)]) - ord("A")
            neu = (ord(zeichen) - ord("A") + richtung * verschiebung) % 26
            ergebnis = ergebnis + chr(neu + ord("A"))
            nummer = nummer + 1
        else:
            ergebnis = ergebnis + zeichen
    return ergebnis


geheim = vigenere("HALLO WELT", "KEY", 1)
print(geheim)
print(vigenere(geheim, "KEY", -1))