Ich habe mir ähnliche Themen angeschaut, aber keine Lösung, die ich finden kann, ist genau vergleichbar mit dem, was ich erreichen möchte.Chiffretext Letter Freq Substitution: Vergleich zweier Wörterbücher nach Wert und Änderung eines Textes
Ich habe einen verschlüsselten Text, der eine einfache Buchstabensubstitution basierend auf der Häufigkeit des Auftretens jedes Buchstabens im Text durchlaufen muss. Ich habe bereits eine Funktion, um den Text zu normalisieren (Kleinbuchstaben, keine Buchstabenbuchstaben, Nein, Zählbuchstabenvorkommen und dann die relative Häufigkeit jedes Buchstabens. Der Buchstabe ist der Schlüssel in einem Wörterbuch und die Häufigkeit ist der Wert.
ich habe die erwarteten Brief Frequenzen für AZ auch in einem separaten Wörterbuch (k = Buchstaben, v = Frequenz), aber ich bin ein wenig verwirrt durch das, was als nächstes zu tun.
Was ich denke, ich tun muss die normalisierte Chiffrat, das erwartete Brief freq dict [d1] und den Chiffre Buchstaben freq dict [d2] und iterieren, sie zu nehmen als (Teil psuedocode) folgt:
for word in text:
for item in word:
for k,v in d2.items():
if d2[v] == d1[v]:
replace any instance of d2[k] with d1[k] in text
decoded_text=open('decoded_text.txt', 'w')
decoded_text.write(str('the decoded text')
Hier möchte ich Text nehmen und sagen "Wenn der Wert in d2 mit einem Wert in d1 übereinstimmt, ersetze jede Instanz von d2 [k] durch d1 [k] im Text".
Mir ist klar, dass ich dort ein paar grundlegende Python-Logik-Fehler gemacht haben muss (ich bin relativ neu bei Python), aber bin ich auf dem richtigen Weg?
Vielen Dank im Voraus
Update:
Danke für alle Anregungen. Ich entschloss mich, die Methode von Karl Knechtel zu versuchen, mit einigen Änderungen, die in meinen Code passen. Allerdings habe ich immer noch Probleme (vollständig in meiner Implementierung)
Ich habe eine Dekodierungsfunktion gemacht, um die Chiffretext-Datei in Frage zu stellen. Dies ruft die zuvor ausgeführte Zählfunktion auf, die ein Wörterbuch (Buchstabe: Frequenz als Gleitkommazahl) zurückgibt. Dies bedeutete, dass der Code "make highcase version" nicht funktionieren würde, da k und v nicht floats waren und .upper nicht als Attribut annehmen konnten. Wenn Sie diese Dekodierfunktion aufrufen, erhalten Sie die Chiffretextzeichenfrequenzen und dann den Chiffriertext selbst, der noch kodiert ist.
def sorted_histogram(a_dict):
return [x[1] for x in sorted(a_dict.items(), key=itemgetter(1))]
def decode(filename):
text=open(filename).read()
cipher=text.lower()
cipher_dict=count(filename)
english_histogram = sorted_histogram(english_dict)
cipher_histogram = sorted_histogram(cipher_dict)
mapping = dict(zip(english_histogram, cipher_histogram)
translated = ''.join(
mapping.get(c, c)
for c in cipher
)
return translated
Danke, gut getupft. Ich habe die Antwort aktualisiert, um stattdessen die Funktion sorted() zu verwenden. –