Allgemeines
Ein Text soll mittels Caesar verschlüsselt werden.
plaintext = "HALLO WELT"
key = 4 # 1, ..., 26
Als plaintext sind die 26 lateinischen Großbuchstaben zugelassen.
Der Schlüssel ist die Anzahl der Buchstaben um die verschoben werden soll
key = 4
ABCDEFGHI...
^
E
E
E
E
EFGHIJKLM...
PLAIN: ABCDEFGHIJKLMOPQRSTUVWXYZ
CIPHER: EFGHIJKLMOPQRSTUVWXYZABCD
Aufgabe: Verschlüssele "HALLO WELT"
Schritt für Schritt
Verschlüsseln eines Buchstabens
Erster Versuch:
plainchar = "H"
print(plainchar)
cipherchar = plainchar+4
print(cipherchar)
Erkenntnis: So einfach gehts nicht!
Fehlermeldung:
Traceback (most recent call last):
File "main.py", line 3, in <module>
cipherchar = plainchar+4
TypeError: can only concatenate str (not "int") to str
ASCII Code eines Buchstaben ermitteln?
Mit ord
plainchar = "H"
print(plainchar)
print(ord(plainchar))
Nun kann der Schlüssel addiert werden.
cipherascii = ord(plainchar)+4
Vom ASCII Code zurück zum Buchstaben? Mit chr
:
cipherchar = chr(cipherascii)
Funktion für einen Buchstaben
def encrypt_char(plainchar, key):
cipherascii = ord(plainchar)+key
return chr(cipherascii)
plainchar = "H"
cipherchar = encrypt_char(plainchar,4)
print(cipherchar)
wrap-around
Aus Z
wird ^
.
def encrypt_char(plainchar, key):
cipherascii = ord(plainchar)+key
if cipherascii>ord("Z"):
cipherascii -= 26
return chr(cipherascii)
Kompletter Text
plaintext="GANZGEHEIM"
for c in plaintext:
print(c)
plaintext="GANZGEHEIM"
key=4
for c in plaintext:
print(f"{c} --> {encrypt_char(c,key)}")
Als Funktion
und mit Wandlung in Großbuchstaben
def encrypt_text(plaintext, key):
ciphertext = ""
plaintext = plaintext.upper()
for c in plaintext:
ciphertext += encrypt_char(c,key)
return ciphertext
plaintext = "GanzGeheim"
key=4
ciphertext = encrypt_text(plaintext,key)
print(ciphertext)
Andere Buchstaben entfernen
Regular Expression
import re
plaintext = "GANZ_GEHEIM!?"
result = re.sub(r"[^A-Z]", "", plaintext)
print(result)
def encrypt_text(plaintext, key):
ciphertext = ""
plaintext = plaintext.upper()
plaintext = re.sub(r"[^A-Z]", "", plaintext) # <---!!!
for c in plaintext:
ciphertext += encrypt_char(c,key)
return ciphertext
Userinput
plaintext = input("Klartext eingeben: ")
Übungen
Übung (decrypt)
Erweitere das Programm so, dass auch wieder die Entschlüsselung möglich ist.
Kommandozeile
Expose
- Einen Buchstaben verschlüsseln
ord
undchr
- Funktion für einen Buchstaben anlegen
- wrap-around berücksichtigen (mit if Anweisung)
- Schleife über alle Buchstaben im Text
- Funktion aufrufen und String zusammenbauen
- Funktion
encrypt_text
erstellen - Sicherstellen, dass alles Großbuchstaben statt Kleinbuchstaben sind
- Alle nicht Großbuchstaben entferenen
- Benutzereingabe
- Über die Kommandozeile aufrufen mit Argumenten und Optionen
Ideen
- Lookup Table statt Addition und if Anweisung