Seite 1 von 1

Wörterprüfung für Caesarverschlüsslungsprogramm

Verfasst: Dienstag 26. Juni 2018, 17:50
von hugohabicht
Ich habe mir ein Caesarver- und entschlüsselungstool geschrieben, was allerdings beim Entschlüsseln nur alle möglichen Schlüssel durchprobiert und nicht das lesbare ergebnis ausgibt. Nun frage ich mich ob man das nicht so verbessern könnte, sodass nur der für Menschen lesbare Entschlüsselte Text ausgegeben wird, dabei ist die Frage wie macht man das? mit Wörterbuch und durchchecken ob jedes einzelne Wort in einem Wörterbuch verfügbar ist?
Vielen Dank für eure Ideen im voraus
Hugo


Pythoncode:

Code: Alles auswählen

print("Caesar Ver- und Entschlüsselungstool")
print("================================================================================")
Hilfe=input("Soll die Hilfe geöffnet werden?[Ja oder Enter]")
if Hilfe=="ja" or Hilfe=="Ja"or Hilfe=="J"or Hilfe=="j":    
    print("Die Caesarverschlüsselung ist eine Verschlüsselung,")
    print("die von Gaius Julius Caesar erfunden wurde. Bei ihr ")
    print("wird jeder Buchstabe des Alphabets einem anderen, der Reihe nach zugeordnet.  ")
    print("Bei einem Schlüssel von 1 würde die Zuordnungstabelle ")
    print("folgendermaßen aussehen:")
    print("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|")
    print("---------------------------------------------------")
    print("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|")
    print("                                                   ")
    Mehr=input("Hätten sie gerne noch mehr Tabellen?[J/N]")
    if Mehr=="J" or Mehr=="j":
        Verschiebungsf=input("Welchen Verschiebungsfaktor hätten sie gerne?")
        Verschiebungsfaktor=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]
        Faktor=Verschiebungsfaktor.index(int(Verschiebungsf))
        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"]
        print("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|")
        print("---------------------------------------------------")
        for a in range(1,27):
           print( Alphabet[(Faktor+1)%26],end="|")
           Faktor=Faktor+1
        
    Ende=input("Wollen sie jetzt mit dem Programm fortfahren?[J/N]")
    if Ende=="J" or Ende=="j":
     while True:
       Text=input("Bitte Text eingeben:")
       Antwort=input("Sollen alle Schlüssel durchprobiert werden?[J/N]")
       if Antwort=="J" or Antwort=="j":
           for a in range(1,26):
             Schlüssel=a
             Anzahl=len(Text)
             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"]
             def Buchstaben(i):
                Buchstabe=Text[i]
                Position=Alphabet.index(Buchstabe)
                Neu=Position+Schlüssel
                if Neu==26:
                   return 0
                else:
                   return Neu%26
             for j in range(0,Anzahl):
                  print(Alphabet[Buchstaben(j)],end="")
             print(" ")     
       elif Antwort=="N" or Antwort== "n":
            Schlüssel=int(input("Schlüssel eingeben:"))
            Anzahl=len(Text)
            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"]
            def Buchstaben(i):
                Buchstabe=Text[i]
                Position=Alphabet.index(Buchstabe)
                Neu=Position+Schlüssel
                if Neu==26:
                    return 0
                else:
                    return Neu%26
            for j in range(0,Anzahl):
                print(Alphabet[Buchstaben(j)],end="")
       print("------------------------------------------------------")         
       Weiter=input("Soll das Programm wiederholtwerden?[Enter/Nein]")
       if Weiter=="Nein":
           break
    else:
        print("Schade, dass Sie mein Programm nicht ausprobiert haben.")
        print("Schönen Tag noch.")
else:
    while True:
       Text=input("Bitte Text eingeben:")
       Antwort=input("Sollen alle Schlüssel durchprobiert werden?[J/N]")
       if Antwort=="J" or Antwort=="j":
           for a in range(1,26):
             Schlüssel=a
             Anzahl=len(Text)
             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"]
             def Buchstaben(i):
                Buchstabe=Text[i]
                Position=Alphabet.index(Buchstabe)
                Neu=Position+Schlüssel
                if Neu==26:
                   return 0
                else:
                   return Neu%26
             for j in range(0,Anzahl):
                print(Alphabet[Buchstaben(j)],end="")
             print(" ")     
       elif Antwort=="N" or Antwort== "n":
            Schlüssel=int(input("Schlüssel eingeben:"))
            Anzahl=len(Text)
            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"]
            def Buchstaben(i):
                Buchstabe=Text[i]
                Position=Alphabet.index(Buchstabe)
                Neu=Position+Schlüssel
                if Neu==26:
                    return 0
                else:
                    return Neu%26
            for j in range(0,Anzahl):
                print(Alphabet[Buchstaben(j)],end="")
       Weiter=input("Soll das Programm wiederholtwerden?[Enter/Nein]")
       if Weiter=="Nein"or Weiter=="nein"or Weiter=="n" or Weiter=="N":
           break

Re: Wörterprüfung für Caesarverschlüsslungsprogramm

Verfasst: Dienstag 26. Juni 2018, 18:49
von nezzcarth
hugohabicht hat geschrieben: Dienstag 26. Juni 2018, 17:50 mit Wörterbuch und durchchecken ob jedes einzelne Wort in einem Wörterbuch verfügbar ist?
Es gibt eine ganze Reihe von Möglichkeiten, wie man versuchen kann die wahrscheinlich richtige Lösung zu finden. Wobei man dazu natürlich sagen muss, dass die Cäsarverschlüsselung so trivial ist, dass der Aufwand, einen zuverlässigen Algorithmus zu implementieren in keinem Verhältnis zum Nutzen steht und höchstens aus Neugier oder akademischem Interesse Sinn ergibt. Ein Mensch kann in der Regel alle möglichen Ergebnisse sichten und sofort das richtige auswählen. Wenn man das dem Computer überlässt, wird es deutlich komplizierter. Man kann zum Beispiel, wie du vorschlägst, anfangen, die Ergebnisse mit Wörterbüchern abzugleichen und diese nach Trefferzahl gewichten, oder Häufigkeitsanalysen (Buchstabenfrequenz, etc) durchführen lassen und danach das wahrscheinlichste Resultat anzeigen etc. Kenntnis der Klartextsprache und der Länge des Alphabets vereinfachen es weiter.

Ansonsten: Möchtest du auch Verbesserungsvorschläge zu deinem Code? Leider gibt es da ehrlich gesagt recht viel Verbesserungspotential.

Re: Wörterprüfung für Caesarverschlüsslungsprogramm

Verfasst: Dienstag 26. Juni 2018, 19:37
von hugohabicht
Zuerst einmal danke für die ausführliche Antwort, Verbesserungsvorschläge nehme ich natürlich gerne entgegen. Zum Projekt: Es ist nur ein Versuch von mir, ein schon länger ruhendes Projekt welches ich jetzt wenigstens einigermaßen funktionstüchtig machen möchte, sodass nicht der Mensch entscheidet was richtig ist, sondern das Programm, Aufwand ist komplett egal

Re: Wörterprüfung für Caesarverschlüsslungsprogramm

Verfasst: Dienstag 26. Juni 2018, 23:22
von __blackjack__
@hugohabicht: Eine einfache Änderung wäre konsistente Einrückung mit vier Leerzeichen pro Ebene.

Dann könntest Du die ganzen Wiederholungen von Code und Daten loswerden in dem der Code sinnvoll auf Funktionen aufgeteilt wird. Ver- und Entschlüsseln ist eigentlich nur *eine* Funktion. Was man mit dem Verschiebewert n verschlüsselt, kann man nämlich mit dem Verschiebewert -n wieder entschhlüsseln wenn man eine entsprechende Funktion schreibt.

Auch das erstellen von den Tabellen kann man mit Hilfe der Ver-/Entschlüsselungsfunktion erledigen. So eine Tabelle braucht man also weder von Hand komplett in `print()`-Aufrufe schreiben, noch braucht man extra Code der die Aufgabe von der Ver-/Entschlüsselung noch einmal macht.

Das Alphabet braucht man auch nicht selbst ins Programm tippen, das gibt es bereits im `string`-Modul.

Wenn dann durch diese Änderungen weniger Code vorhanden ist, könntest Du an den Namen arbeiten. Funktionen und Methoden bekommen in der Regel eine Tätigkeit als Namen, weil die etwas tun. `Buchstaben` ist also kein passender Name für eine Funktion, weil der nicht beschreibt was die Funktion tut. Aussedem werden Namen für Funktionen und Werte klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten die KOMPLETT_GROSS geschrieben werden, und Klassennamen die in MixedCase geschrieben werden.

Vor und nach dem ``=`` bei Zuweisungen und um binäre Operatoren werden wegen der besseren lesbarkeit Leerzeichen gesetzt.

Schau Dir mal den Style Guide for Python Code an.