Caesar-Chiffre in Python
Caesar-Chiffre in Python
Von Scratch zu Python – Das gleiche Problem, eleganter gelöst
Du hast in Scratch einen Caesar-Verschlüssler programmiert. Dabei musstest du:
- Eine Liste mit 26 Buchstaben von Hand anlegen
- Die Position eines Buchstabens in der Liste suchen
- Mit Schleifen und
verbindemühsam Text zusammenbauen
In Python geht das viel einfacher! Computer speichern Buchstaben intern als Zahlen (das hast du beim ASCII-Code gelernt). Python kann diese Zahlen direkt nutzen – keine Liste nötig!
Vorbereitung: Thonny starten
- Öffne Thonny auf deinem Desktop
- Erstelle eine neue Datei:
Datei→Neu - Speichere sie als
caesar.pyin deinem Portfolio-Ordner (auf deinem Desktop)
Teil 1: Pythons Geheimwaffe – ord() und chr()
Das Alphabet als Zahlen
In Scratch musstest du eine Liste anlegen:
Alphabet = [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]
Python braucht das nicht! Jeder Buchstabe hat eine Nummer (ASCII-Code):
| Buchstabe | A | B | C | D | ... | X | Y | Z |
|---|---|---|---|---|---|---|---|---|
| ASCII-Code | 65 | 66 | 67 | 68 | ... | 88 | 89 | 90 |
Aufgabe 1.1: ord() ausprobieren
Die Funktion ord() gibt dir die Nummer eines Buchstabens.
Tippe in Thonny (im unteren "Shell"-Bereich):
>>> ord("A")
65
>>> ord("B")
66
>>> ord("Z")
90
Erkennst du das Muster? Die Buchstaben A-Z haben die Nummern 65-90 – sie sind schon in der richtigen Reihenfolge!
Aufgabe 1.2: chr() ausprobieren
Die Funktion chr() macht das Gegenteil – sie verwandelt eine Nummer zurück in einen Buchstaben (Character).
>>> chr(65)
'A'
>>> chr(68)
'D'
>>> chr(90)
'Z'
Aufgabe 1.3: Zusammenhang verstehen
Probiere aus:
>>> chr(ord("A") + 3)
'D'
Das ist schon fast die ganze Caesar-Verschlüsselung!
| Scratch | Python |
|---|---|
Nummer von "A" in Alphabet → 1 |
ord("A") → 65 |
Element 4 von Alphabet → "D" |
chr(68) → "D" |
| Liste mit 26 Einträgen anlegen | Nicht nötig! |
Teil 2: Einen einzelnen Buchstaben verschlüsseln
Aufgabe 2.1: Das Grundgerüst
In Scratch hast du frage ... und warte benutzt. In Python heißt das input():
# Caesar-Verschlüsselung in Python
# Version 1: Ein einzelner Buchstabe
buchstabe = input("Welchen Buchstaben möchtest du verschlüsseln? ")
print("Du hast eingegeben:", buchstabe)
Führe das Programm aus mit dem grünen Play-Button (oder F5).
Aufgabe 2.2: Position finden und verschieben
Jetzt verschieben wir den Buchstaben um 3 Stellen:
# Caesar-Verschlüsselung in Python
# Version 2: Verschiebung um 3
buchstabe = input("Welchen Buchstaben möchtest du verschlüsseln? ")
buchstabe = buchstabe.upper() # In Großbuchstaben umwandeln
nummer = ord(buchstabe) # Buchstabe → Zahl
neue_nummer = nummer + 3 # Verschieben
neuer_buchstabe = chr(neue_nummer) # Zahl → Buchstabe
print("Verschlüsselt:", neuer_buchstabe)
Teste: Gib "A" ein → Ausgabe sollte "D" sein.
Teste: Gib "d" ein → Ausgabe sollte auch "G" sein (wegen.upper())
Aufgabe 2.3: Das Problem am Ende des Alphabets
Teste: Gib "Y" ein. Was passiert?
Problem: Y hat die Nummer 89. Plus 3 ergibt 92 – aber das ist kein Buchstabe mehr!
>>> chr(92)
'\\'
Das ist ein Backslash, kein Buchstabe!
Aufgabe 2.4: Die Lösung mit Modulo
In Scratch hast du geprüft: falls NeuePosition > 26, dann ändere um -26
In Python gibt es einen eleganteren Weg: den Modulo-Operator %
Der Modulo gibt den Rest einer Division zurück:
>>> 28 % 26
2
>>> 27 % 26
1
>>> 26 % 26
0
So "springt" jede Zahl über 26 automatisch wieder an den Anfang!
Die verbesserte Version:
# Caesar-Verschlüsselung in Python
# Version 3: Mit Wrap-Around
buchstabe = input("Welchen Buchstaben möchtest du verschlüsseln? ")
buchstabe = buchstabe.upper()
# Position im Alphabet (0-25 statt 1-26)
position = ord(buchstabe) - ord("A")
# Verschieben mit Modulo (springt automatisch zurück)
neue_position = (position + 3) % 26
# Zurück zum Buchstaben
neuer_buchstabe = chr(neue_position + ord("A"))
print("Verschlüsselt:", neuer_buchstabe)
Teste: "Y" → "B", "Z" → "C" ✓
Warum - ord("A") und + ord("A")?
ord("A")ist 65- Wir rechnen die Position auf 0-25 um (wie ein Index)
- Am Ende addieren wir 65 wieder, um den richtigen Buchstaben zu bekommen
Teil 3: Variable Verschiebung
Aufgabe 3.1: Verschiebung abfragen
# Caesar-Verschlüsselung in Python
# Version 4: Variable Verschiebung
buchstabe = input("Welchen Buchstaben möchtest du verschlüsseln? ")
buchstabe = buchstabe.upper()
verschiebung = int(input("Um wie viele Stellen verschieben? (1-25) "))
position = ord(buchstabe) - ord("A")
neue_position = (position + verschiebung) % 26
neuer_buchstabe = chr(neue_position + ord("A"))
print("Verschlüsselt:", neuer_buchstabe)
Hinweis:
int()wandelt die Eingabe in eine Zahl um (input gibt immer Text zurück)
Teste:
- A mit Verschiebung 1 → B
- A mit Verschiebung 13 → N
- Z mit Verschiebung 1 → A
Teil 4: Entschlüsseln
Aufgabe 4.1: Nachdenken
In Scratch brauchtest du zwei falls-Blöcke:
- einen für
> 26(beim Verschlüsseln) - einen für
< 1(beim Entschlüsseln)
In Python funktioniert der Modulo-Trick auch mit negativen Zahlen!
>>> (-1) % 26
25
>>> (-3) % 26
23
Das heißt: Wir brauchen keine extra Fallunterscheidung!
Aufgabe 4.2: Ver- und Entschlüsselung
# Caesar-Verschlüsselung in Python
# Version 5: Ver- und Entschlüsseln
buchstabe = input("Welchen Buchstaben? ")
buchstabe = buchstabe.upper()
modus = input("Verschlüsseln (v) oder Entschlüsseln (e)? ")
verschiebung = int(input("Verschiebung? "))
# Bei Entschlüsselung: negative Verschiebung
if modus == "e":
verschiebung = -verschiebung
position = ord(buchstabe) - ord("A")
neue_position = (position + verschiebung) % 26
neuer_buchstabe = chr(neue_position + ord("A"))
print("Ergebnis:", neuer_buchstabe)
Teste: Verschlüssle "H" mit 3 → "K"
Teste: Entschlüssle "K" mit 3 → "H" ✓
Teil 5: Ganze Wörter – Hier zeigt Python seine Stärke!
In Scratch war das kompliziert:
- Variable
ifür die Position - Schleife mit
wiederhole (Länge von Eingabe) mal Zeichen i von Eingabeverbinde Ausgabe und VerschlüsselterBuchstabe
Aufgabe 5.1: Die Python-Lösung
In Python geht das mit einer for-Schleife viel eleganter:
# Caesar-Verschlüsselung in Python
# Version 6: Ganze Wörter
text = input("Welchen Text möchtest du verschlüsseln? ")
text = text.upper()
modus = input("Verschlüsseln (v) oder Entschlüsseln (e)? ")
verschiebung = int(input("Verschiebung? "))
if modus == "e":
verschiebung = -verschiebung
ergebnis = "" # Hier sammeln wir die verschlüsselten Buchstaben
for buchstabe in text:
if buchstabe.isalpha(): # Nur Buchstaben verschlüsseln
position = ord(buchstabe) - ord("A")
neue_position = (position + verschiebung) % 26
neuer_buchstabe = chr(neue_position + ord("A"))
ergebnis = ergebnis + neuer_buchstabe
else:
ergebnis = ergebnis + buchstabe # Leerzeichen etc. behalten
print("Ergebnis:", ergebnis)
Teste: "HALLO WELT" mit Verschiebung 3 → "KDOOR ZHOW"
Was ist hier neu?
| Code | Bedeutung |
|---|---|
for buchstabe in text: |
Geht jeden Buchstaben einzeln durch |
buchstabe.isalpha() |
Prüft, ob es ein Buchstabe ist (kein Leerzeichen, keine Zahl) |
ergebnis = ergebnis + neuer_buchstabe |
Hängt den neuen Buchstaben an |
Vergleich: Scratch vs. Python
| Aspekt | Scratch | Python |
|---|---|---|
| Alphabet | 26 Einträge von Hand eingeben | Nicht nötig (ord/chr) |
| Position finden | Nummer von X in Alphabet |
ord(X) - ord("A") |
| Buchstabe holen | Element N von Alphabet |
chr(N + ord("A")) |
| Wrap-Around | falls > 26 dann -26 |
% 26 (eine Zeile!) |
| Entschlüsseln | Extra falls < 1 nötig |
Modulo funktioniert auch negativ |
| Ganze Wörter | Komplizierte Schleife mit i |
for buchstabe in text: |
| Leerzeichen | Schwierig zu handhaben | .isalpha() prüft automatisch |
Zusatzaufgaben
Zusatz 1: Auch Kleinbuchstaben behalten
Ändere das Programm so, dass "Hallo" zu "Kdoor" wird (nicht "KDOOR").
Tipp: Prüfe mit buchstabe.isupper() ob der Buchstabe groß ist.
Zusatz 2: ROT13
ROT13 ist eine spezielle Caesar-Verschlüsselung mit Verschiebung 13. Das Besondere: Zweimal anwenden ergibt wieder den Originaltext!
Probiere es aus: Verschlüssle "HALLO" mit 13, dann verschlüssle das Ergebnis nochmal mit 13.
Zusatz 3: Alle Möglichkeiten durchprobieren (Brute Force)
Schreibe ein Programm, das einen verschlüsselten Text mit allen 25 möglichen Verschiebungen entschlüsselt und alle Ergebnisse ausgibt. So kann man die Verschlüsselung "knacken"!
Das hast du gelernt
| Python-Konzept | Beispiel |
|---|---|
| Eingabe | input("Frage") |
| Ausgabe | print("Text", variable) |
| Bedingte Anweisung | if bedingung: |
| Schleife über Text | for buchstabe in text: |
| Zeichen → Zahl | ord("A") → 65 |
| Zahl → Zeichen | chr(65) → "A" |
| Modulo (Rest) | 28 % 26 → 2 |
| Großbuchstaben | text.upper() |
| Ist es ein Buchstabe? | buchstabe.isalpha() |