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:
| Text | H | A | L | L | O |
|---|---|---|---|---|---|
| Schlüssel | K | E | Y | K | E |
| Verschiebung | 10 | 4 | 24 | 10 | 4 |
| Geheim | R | E | J | V | S |
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))- Denkanstoß
Verschiebung
=ord(schluessel[nummer % len(schluessel)])-ord("A"). Neuer Buchstabe: (ord(zeichen)-ord("A")+verschiebung)%26. - Welcher Befehl hilft?
Erhöhe nummer nur, wenn wirklich ein Buchstabe verschlüsselt wurde.
Multipliziere die Verschiebung mit richtung – bei -1 wird dann zurückgeschoben.
- Lückencode – ergänze die ___
def vigenere(text, schluessel, richtung): ergebnis = "" nummer = 0 # welcher Schlüssel-Buchstabe ist dran? for zeichen in text: if ___: verschiebung = ___ neu = ___ ergebnis = ___ nummer = ___ else: 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🔒 Erst nach allen Hinweisen oder 2 Prüf-Versuchen
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))