Ave Caesar! Caesar-Verschlüsselung mit Python
Ave Caesar, morituri te salutant! („Heil dir, Caesar, die Todgeweihten grüßen dich!“) (~Asterix)
Die Caesar-Verschlüsselung (oder Caesar-Chiffre) ist ein einfaches symmetrisches Verschlüsselungsverfahren, das auf der monoalphabetischen Ersetzung basiert. Als eines der einfachsten Verschüsselungsverfahren dient es heute hauptsächlich dazu, Grundprinzipien der Kryptologie zu veranschaulichen.
Bei der Verschlüsselung wird jeder Buchstabe des Klartexts auf einen Geheimtextbuchstaben abgebildet. (Quelle Wikipedia)
Im Code soll nachher nur der zu ver- oder entschlüsselnde Text in ein Textfeld eingegeben werden und der Text wird per Knopfdruck automatisch ver- bzw. entschlüsselt.
from tkinter import*
# Fenster erstellen
fenster = Tk()
# Fenstertitel
fenster.title("Ave Caesar!")
t_welcome= "Ave Caesar!"
Zuerst wird mit tkinter ein Fenster erstellt.
a_abc = ' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"$%&/()=äöüÖÄÜß'
d_B2N = {} #[] # dict()
d_N2B = {} #[] # dict()
verschiebung_maximum=len(a_abc)
# t_welcome= a_abc # debug
def listen_erstellen():
i=1
for buchstabe in a_abc: # range(len(a_abc)):
d_B2N.update({buchstabe:i})
d_N2B.update({i:buchstabe})
i=i+1
Erzeugen der Liste aller Buchstaben, die ersetzt werden können.
Danach werden zwei Dictionaries mit einer Schleife über alle Buchstaben aufgebaut.
d_B2N wandelt Buchstaben (key) in Zahlen (value) um.
d_N2B wandelt Zahlen (key) in Buchstaben (value) um.
def encode():
anweisungs_label.config(text="encoding")
recode("encode")
def decode():
anweisungs_label.config(text="decoding")
recode("decode")
def recode(modus):
verschiebung= int(f_offset.get('1.0',END))
txt=""
if (verschiebung > 24) or (verschiebung < 1 ):
anweisungs_label.config(text="Verschiebung macht keinen Sinn: 1-24")
return 0
text_eingabe= f_input.get('1.0',END)
text_eingabe.rstrip('\r|\n') # Zeilenumbruch entfernen
text_eingabe.replace('\n','')
for buchstabe in text_eingabe:
print (buchstabe)
zahl=d_B2N.get(buchstabe, "§")
if modus == "encode":
zahl = zahl + verschiebung
else:
zahl = zahl - verschiebung
if zahl >= verschiebung_maximum:
zahl= zahl-verschiebung_maximum
if zahl <= 0:
zahl= zahl+verschiebung_maximum
code= d_N2B.get(zahl)
print(code)
txt = txt + code
f_output.delete('1.0', END) # schöner machen
f_output.insert(END, txt)
print (txt)
f_output.insert(END, txt)
Folgende drei Funktionen sin die Kernfunktionen des Programms: encode, decode und recode
recode codiert oder decodiert den eingegebenen Text mit der angegebenen Verschiebung.
Zuerst wird der Text aus dem Eingabefeld gelesen. Danach wird mit der Schleife jeder Buchstabe verschoben und geprüft, ob die Verschiebung kleiner oder größer der Maximal-/Minimalverschiebung ist. Anschließend wird der codierte Text im Ausgabefeld dargestellt.
# vorbereiten
listen_erstellen()
hoehe=2
breite=80
fenster.geometry('400x400')
# Eingabe erzeugen
label = Label(fenster, text="Eingabefenster")
label.pack()
f_input = Text(fenster, height=hoehe, width=breite)
f_input.pack()
f_input.insert(END, t_welcome)
#Ausgabe erzeugen
label = Label(fenster, text="Ausgabefenster")
label.pack()
f_output = Text(fenster, height=hoehe, width=breite)
f_output.pack()
f_output.insert(END, "")
# Offset erzeugen
label = Label(fenster, text="Verschiebung")
label.pack()
f_offset = Text(fenster, height=1, width=2,max=2)
f_offset.pack()
f_offset.insert(END, "10")
# Button erstellen
b_encode = Button(fenster, text="codieren", command=encode )
b_decode = Button(fenster, text="decodieren", command=decode )
b_encode.pack()
b_decode.pack()
exit_button = Button(fenster, text="Exit", command=fenster.quit)
# Label erstellen
anweisungs_label = Label(fenster, text="Codieren")
info_label = Label(fenster, text="Exit schließt das Fenster")
anweisungs_label.pack()
info_label.pack()
exit_button.pack()
# auf Eingabe warten
fenster.mainloop()
Textfelder und Knöpfe werden erstellt.
Der komplette Code:
from tkinter import*
# Fenster erstellen
fenster = Tk()
# Fenstertitel
fenster.title("Ave Caesar!")
t_welcome= "Ave Caesar!"
a_abc = ['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']
A_ABC = ['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']
a_abc = ' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"$%&/()=äöüÖÄÜß'
d_B2N = {} #[] # dict()
d_N2B = {} #[] # dict()
verschiebung_maximum=len(a_abc)
# t_welcome= a_abc # debug
def listen_erstellen():
i=1
for buchstabe in a_abc: # range(len(a_abc)):
d_B2N.update({buchstabe:i})
d_N2B.update({i:buchstabe})
i=i+1
# wird ausgeführt, nachdem der Knopf gedrückt wurde
def button_action():
anweisungs_label.config(text="Was anderes")
def recode(modus):
verschiebung= int(f_offset.get('1.0',END))
txt=""
if (verschiebung > 24) or (verschiebung < 1 ):
anweisungs_label.config(text="Verschiebung macht keinen Sinn: 1-24")
return 0
text_eingabe= f_input.get('1.0',END)
text_eingabe.rstrip('\r|\n') # Zeilenumbruch entfernen
text_eingabe.replace('\n','')
for buchstabe in text_eingabe:
print (buchstabe)
zahl=d_B2N.get(buchstabe, "§")
if modus == "encode":
zahl = zahl + verschiebung
else:
zahl = zahl - verschiebung
if zahl >= verschiebung_maximum:
zahl= zahl-verschiebung_maximum
if zahl <= 0:
zahl= zahl+verschiebung_maximum
code= d_N2B.get(zahl)
print(code)
txt = txt + code
f_output.delete('1.0', END) # schöner machen
f_output.insert(END, txt)
print (txt)
f_output.insert(END, txt)
# for buchstabe in f_input.
def encode():
anweisungs_label.config(text="encoding")
recode("encode")
def decode():
anweisungs_label.config(text="decoding")
recode("decode")
# vorbereiten
listen_erstellen()
hoehe=2
breite=80
fenster.geometry('400x400')
# Eingabe erzeugen
label = Label(fenster, text="Eingabefenster")
label.pack()
f_input = Text(fenster, height=hoehe, width=breite)
f_input.pack()
f_input.insert(END, t_welcome)
#Ausgabe erzeugen
label = Label(fenster, text="Ausgabefenster")
label.pack()
f_output = Text(fenster, height=hoehe, width=breite)
f_output.pack()
f_output.insert(END, "")
# Offset erzeugen
label = Label(fenster, text="Verschiebung")
label.pack()
f_offset = Text(fenster, height=1, width=2,max=2)
f_offset.pack()
f_offset.insert(END, "10")
# Button erstellen
b_encode = Button(fenster, text="codieren", command=encode )
b_decode = Button(fenster, text="decodieren", command=decode )
b_encode.pack()
b_decode.pack()
exit_button = Button(fenster, text="Exit", command=fenster.quit)
# Label erstellen
anweisungs_label = Label(fenster, text="Codieren")
info_label = Label(fenster, text="Exit schließt das Fenster")
anweisungs_label.pack()
info_label.pack()
exit_button.pack()
# auf Eingabe warten
fenster.mainloop()