Новая проблема шифрования, как декодировать данный зашифрованный код? - PullRequest
0 голосов
/ 03 апреля 2020

Пока я пытался разгадать шифр Цезаря, я столкнулся с несколькими проблемами.

#enciphered message = 'I wtvp olel decfnefcpd lyo lwrzctesxd'

plain = 'abcdefghijklmnopqrstuvwxyz'

cipher = 'lmnopqrstuvwxyzabcdefghijk'
cipher_text = input('Enter enciphered message: ')
clean_text = ' '

for i in cipher_text:

    if i != " ":
        clean_text = clean_text + plain[plain.index(cipher[(ord(i)-ord('a'))])]
    else:
        clean_text = clean_text + " "

print(clean_text)

Выше приведен код, который я создал, и вот что я получил в результате:

Enter enciphered message: I wtvp olel decfnefcpd lyo lwrzctesxd

 n hega zwpw opnqypqnao wjz whcknepdio

Вот мои связанные вопросы:

  1. Почему он не был правильно декодирован? Например: «Мне нравятся структуры данных и алгоритмы»

  2. Я также запутался в заглавной букве «I» в начале зашифрованного сообщения. Есть ли у вас какие-либо идеи по этому поводу?

  3. Наконец, я понятия не имею, как декодировать прописные и строчные буквы одновременно; как мне это сделать?

1 Ответ

0 голосов
/ 03 апреля 2020

(1) Почему он не был правильно декодирован? Например: «Мне нравятся структуры данных и алгоритмы»

Прежде всего, алфавит уже присутствует в ASCII. Таким образом, нет необходимости переопределять алфавит в plain или cipher. Ключ - это смещение от символа открытого текста к символу зашифрованного текста, которое оборачивается сразу после z.

. Таким образом, обычно вы преобразуете символ в индекс в алфавите от 0..25, а затем добавить (для шифрования) или вычесть (для расшифровки) ключ, по модулю 26 - размер алфавита. Затем, чтобы получить результат, вы превращаетесь обратно в персонажа. Вы уже делаете преобразование в индекс, используя ord(character) - ord(a). Обратное можно сделать, используя chr.

(2) Я также запутался в заглавной букве «I» в начале зашифрованного сообщения. Есть ли у вас какие-либо идеи по этому поводу?

Ну, есть больше возможностей для односимвольных слов. Слово A было бы основным подозреваемым.

(3) Наконец, я понятия не имею, как декодировать прописные и строчные буквы одновременно; как мне это сделать?

Лучший способ - создать переменную, которая указывает, что что-то написано в верхнем регистре или нет; is_uppercase было бы хорошим именем. Затем преобразуйте символ в нижний регистр. Выполните операцию шифрования / дешифрования, а затем при необходимости преобразуйте полученный символ обратно в верхний регистр. Таким образом, ваша операция шифрования / дешифрования не подвергается никакому воздействию и остается относительно простой.

...