Python Caesar Cipher Decoder

In meiner Lektion wurde ich mit der Erstellung eines Caesar Cipher Decoders beauftragt, der eine Reihe von Inputs nimmt und die bestmögliche Saite mit einem Buchstabenfrequenzen findet. Wenn nicht sicher, wie viel Sinn das gemacht hat, aber lassen Sie die Frage:

Schreiben Sie ein Programm, das folgendes macht. Zuerst sollte es eine Zeile der Eingabe lesen, die die verschlüsselte Nachricht ist und aus Großbuchstaben und Räumen bestehen wird. Ihr Programm muss versuchen, die Nachricht mit allen 26 möglichen Werten der Verschiebung S zu dekodieren; Aus diesen 26 möglichen ursprünglichen Nachrichten, drucken Sie die, die die höchste Güte hat. Für Ihre Bequemlichkeit werden wir die Variable letterGoodness für Sie vordefinieren, eine Liste der Länge 26, die den Werten in der Häufigkeitstabelle oben entspricht

Buchstabenfrequenzen

Ich habe diesen Code so weit:

x = input() NUM_LETTERS = 26 #Can't import modules I'm using a web based grader/compiler def SpyCoder(S, N): y = "" for i in S: x = ord(i) x += N if x > ord('Z'): x -= NUM_LETTERS elif x < ord('A'): x += NUM_LETTERS y += chr(x) return y def GoodnessFinder(S): y = 0 for i in S: if x != 32: x = ord(i) x -= ord('A') y += letterGoodness[x] return y def GoodnessComparer(S): goodnesstocompare = GoodnessFinder(S) goodness = 0 v = '' for i in range(0, 26): v = SpyCoder(S, i) goodness = GoodnessFinder(v) if goodness > goodnesstocompare: goodnesstocompare = goodness return v y = x.split() z = '' for i in range(0, len(y)): if i == len(y) - 1: z += GoodnessComparer(y[i]) print(z) 

EDIT: Änderungen vorgenommen, die von Cristian Ciupitu vorgeschlagen werden Bitte ignorieren Sie Einrückungsfehler, sie sind wahrscheinlich entstanden, als ich meinen Code kopiert habe.

Das Programm funktioniert wie folgt:

  • Nehmen Sie den Eingang und teilen Sie ihn in eine Liste auf
  • Für jeden Listenwert füttere ich ihn einem Gutsfinder.
  • Es nimmt die Güte der Saite und vergleicht alles andere gegen und wenn es eine höhere Güte gibt, macht es die höhere die Güte zu vergleichen.
  • Es verschiebt dann diese Zeichenkette, um zu sehen, ob die Güte höher oder niedriger ist

Ich bin mir nicht ganz sicher, wo das Problem ist, der erste Test: LQKP OG CV GKIJV DA VJG BQQ
Druckt die richtige Nachricht: MIT DEM ZOO MITBLICKEN

Allerdings der nächste Test: UIJT JT B TBNQMF MJOF PG UFYU GPS EFDSZQUJOH
Gibt die Junk-String von: SGHR HR Z RZLOKD KHMD NE SDWS ENQ CDBQXOSHMF
Wenn es sein soll: DIES IST EINE BEISPIELE VON TEXT FÜR DECRYPTING

Ich weiß, ich muss:
Versuche jeden Verschiebungswert
Holen Sie sich die "Güte" des Wortes
Bringt den String mit der höchsten Güte zurück.

Ich hoffe meine Erklärung war sinnvoll, da ich im Moment ziemlich verwirrt bin.

3 Solutions collect form web for “Python Caesar Cipher Decoder”

Hier ist meine Umsetzung, die gut funktioniert.

Sie sollten die Güte jeder möglichen Nachricht ausdrucken und sehen, warum Ihr Programm es ausgibt.

 letterGoodness = dict(zip(string.ascii_uppercase, [.0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007])) trans_tables = [ str.maketrans(string.ascii_uppercase, string.ascii_uppercase[i:]+string.ascii_uppercase[:i]) for i in range(26)] def goodness(msg): return sum(letterGoodness.get(char, 0) for char in msg) def all_shifts(msg): msg = msg.upper() for trans_table in trans_tables: txt = msg.translate(trans_table) yield goodness(txt), txt print(max(all_shifts(input()))) 

Meine endgültige Lösung, die funktioniert, dank der wunderbaren Cristian Ciupitu.

 x = input() NUM_LETTERS = 26 #Can't import modules I'm using a web based grader/compiler def SpyCoder(S, N): y = "" for i in S: if(i.isupper()): x = ord(i) x += N if x > ord('Z'): x -= NUM_LETTERS elif x < ord('A'): x += NUM_LETTERS y += chr(x) else: y += " " return y def GoodnessFinder(S): y = 0 for i in S: if i.isupper(): x = ord(i) x -= ord('A') y += letterGoodness[x] else: y += 1 return y def GoodnessComparer(S): goodnesstocompare = GoodnessFinder(S) goodness = 0 v = '' best_v = S for i in range(0, 26): v = SpyCoder(S, i) goodness = GoodnessFinder(v) if goodness > goodnesstocompare: best_v = v goodnesstocompare = goodness return best_v print(GoodnessComparer(x)) 

Danke für all deine Hilfe!

Ich arbeite an dem gleichen Tutorial und verwendete eine etwas andere Methode. Dies vermeidet das Erstellen und Aufrufen von Funktionen:

 inp = input() #to hold code text code = list(inp) #store code as a list soln = [] #store the 'Goodness' for each of 26 possible answers y=0 #variable to hold total goodness during calculations clear = [] #will hold decoded text pos=0 #position marker for a list #for every possible value of shift #note range as 0 to 25 are valid shifts and shift 26 = shift 0 for shift in range(0,26): for i in code: #loop through each letter in code if i == " ": #spaces have no score so omit them continue else: #if it's a letter x = ord(i)-shift #apply the test shift if x < 65: #prevent shifting outside AZ range x = x + 26 x = x - 64 #turn ord into character position in AZ with A=1 x = letterGoodness[x-1] #turn this into the Goodness score y = y + x #add this to a running total soln.insert(shift-1,y) #AFTER decoding all letters in code, add total(y) to list of scores y = 0 #reset y before next test value bestSoln=max(soln) #find highest possible score for i in range(0,26): #check the list of solutions for this score if soln[i]==bestSoln: #the position in this list is the shift we need bestShift = i+1 #+1 as the first solution is 0 for i in code: #now decode the original text using our best solution if i == " ": #spaces are not encoded so just add these to the string clear.insert(pos," ") #pos used to track next position for final string pos = pos + 1 continue else: x = ord(i)-bestShift #same operation as before if x < 65: x = x + 26 z = chr(x) clear.insert(pos,z) #add the decoded letter to the clear text pos = pos + 1 print("".join(clear)) #join the list of clear text into one string and print it 

Beachten Sie, dass viele Teile dieses Codes zum Beispiel komprimiert werden könnten

 x = x - 64 x = letterGoodness[x-1] y = y + x 

Sie werden erweitert, um "meine Arbeit zu zeigen" für eine Tutorialübung.

  • Python crypt in OSX
  • Python - GPG entschlüsselt funktioniert aber GNUPG nicht
  • Verschlüsseln und Entschlüsseln mit PyCrypto AES 256
  • Was ist die beste / am einfachsten zu verwenden Verschlüsselung Bibliothek in python
  • Python AES Entschlüsselung
  • Hashing (verstecken) Strings in Python
  • Wie kann ich einen String in Python verschlüsseln und entschlüsseln?
  • Entschlüsseln Sie Chrome Linux BLOB verschlüsselte Cookies in Python
  • Ist es möglich, einen 100% sicheren virtuellen privaten Server zu haben?
  • Obfuscate Strings in Python
  • RSA Verschlüsselung und Entschlüsselung in Python
  • Python ist die beste Programmiersprache der Welt.