Allgemein,  Programmieren

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()
610cookie-checkAve Caesar! Caesar-Verschlüsselung mit Python

Leave a Reply

Your email address will not be published.