У меня есть строка, которая была зашифрована в моно-алфавитном подстановке, я хотел попробовать и взломать ее, используя частотный анализ английского языка (а не на самом деле его решить, но чтобы обогатить мои навыки программирования).Подставляйте все буквы в строку
Я в настоящее время в ситуации, когда у меня есть частоты букв появлений в строке, представленной в отсортированном списке tuple
с, например, следующее: [('V', freqV), ('D', freqD)...]
(обратите внимание, что в данном случае V
это письмо, которое появляется больше, чем любая другая буква, поэтому freqV
- это наибольшее число, отображаемое в tuple
s, которые указаны в списке), а также английский язык представлен таким же образом.
Из этого состояния, как правильно заменить буквы?
Я уже попробовал простой лобовое решение:
new_text = str(cipher_str)
for i in xrange(26): #26 is the length of both lists, obviously
new_text = new_text.replace(sorted_cipher_freq[i][0], sorted_eng_freq[i][0])
, но он не будет работать (одна из причин в том, что иногда персонаж заменить с идентичен расшифрованного один. Например, ap
= an
, так что буква a
такая же, что и при дешифровке и зашифровке, но p
должно быть n
).
Как я могу это сделать?
Одна из проблем, которые вы собираетесь работать в вашей реализации является то, что вы изменяете литий пока вы пытаетесь перебрать его. Это приведет к тому, что ваши подмены будут угасать, потому что, например, после первых нескольких вы заменяете буквы, которые уже являются подслоями. Вместо этого вы создаете сопоставление (read: dict) подстановок, затем перебираете кодированную строку, создавая новую строку по одному символу за раз с отображением. –
@ Two-BitAlchemist Но это испортит порядок букв ... Итак, я должен уже сдаться и пойти со словарем '{letter_in_cipher: letter_to_sub_with}'? – Jack