Питон Цезарь, шифр ascii, добавление пробелов
Я пытаюсь сделать шифр Цезаря, и у меня проблема с ним.
Он работает отлично, но я хочу добавить пробелы к введенному слову. Если вы вводите предложение с пробелами в нем. Он просто печатает = вместо пробела, когда он зашифрован. Может ли кто-нибудь помочь мне исправить это, чтобы он распечатывал пробелы?
2 ответа
Вам необходимо внимательно ознакомиться с вашими условиями:
Учитывая пробел, ord(letter) + shift будет хранить 32 + shift в shifted (35, когда shift равно 3). Это < 65, поэтому 26 добавляется, в этом случае приводит к 61, а символ с номером 61 оказывается = .
Шифр Цезаря
Шифр Цезаря, также известный как шифр сдвига, код Цезаря или сдвиг Цезаря — один из самых простых и наиболее широко известных методов шифрования.
Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом находящимся на некотором постоянном числе позиций левее или правее него в алфавите. Например, в шифре со сдвигом 3 А была бы заменена на Г, Б станет Д, и так далее.
Используемое преобразование обычно обозначают как ROTN, где N — сдвиг, ROT — сокращение от слова ROTATE, в данном случае «циклический сдвиг». Число разных преобразований конечно и зависит от длины алфавита. Для русского языка возможно 32 разных преобразования (преобразования ROT0 и ROT33 сохраняют исходный текст, а дальше начинаются уже повторения).
Шифр Цезаря со сдвигом на 3 (английский алфавит):
A заменяется на D
B заменяется на E
Z заменяется на C
Шифр назван в честь римского императора Гая Юлия Цезаря, использовавшего его для секретной переписки со своими генералами.
Шифр Цезаря Python
Шифр Цезаря заключается в замене каждого символа входной строки на символ, находящийся на несколько позиций левее или правее его в алфавите.
Для всех символов сдвиг один и тот же. Сдвиг циклический, т.е. если к последнему символу алфавита применить единичный сдвиг, то он заменится на первый символ, и наоборот.
Напишите программу, которая шифрует текст шифром Цезаря.
Используемый алфавит −− пробел и малые символы латинского алфавита: ‘ abcdefghijklmnopqrstuvwxyz’
Формат ввода: На первой строке указывается используемый сдвиг шифрования: целое число. Положительное число соответствует сдвигу вправо. На второй строке указывается непустая фраза для шифрования. Ведущие и завершающие пробелы не учитывать.
Формат вывода: Единственная строка, в которой записана фраза: Result: «. » , где вместо многоточия внутри кавычек записана зашифрованная последовательность.
Итак, вот как я ее решил:
Интерпретатор выводит все верно. На сайте тест не проходит. Подскажите, пожалуйста, где ошибся.
Шифр Цезаря
Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите.
Шифр назван в честь римского полководца Гая Юлия Цезаря, использовавшего его для секретной переписки со своими генералами.
Например, в шифре со сдвигом вправо на 3, A была бы заменена на D, B станет E, Z станет C, и так далее.
Напишем программу на языке программирования Python которая использует шифр Цезаря.
Для начала создадим строку со всеми буквами русского алфавита. Используя эту строку мы будем находить порядковый номер буквы из нашего сообщения, чтобы сделать смещение для шифрования.
Затем запросим ввод строки которую будем шифровать и ключ для шифрования.
В переменной message будем хранить исходное сообщение, которое хотим зашифровать. В key будет храниться число, секретный ключ сдвига нашего алфавита.
Для удобства шифрования все введенные символы преобразуем в строчный регистр используя при вводе метод .lower(). При вводе ключа преобразуем введенный символ в целое число используя функцию int().
Так же создадим пустую переменную encrypted для хранения зашифрованного сообщения.
Используя цикл for будем перебирать наше исходное сообщение, чтобы получить по каждой букве из фразы.
Цикл на каждой итерации будет получать в переменную letter по одному символу из сообщения message. Затем мы проверим, является ли полученный символ буквой.
Для упрощения мы будем шифровать только буквы русского алфавита, символы препинания и пробелы будем оставлять без изменения. Для этого проверим полученный символ на вхождение в нашу строку с алфавитом используя оператор in. Если искомый символ будет буквой, то in вернет True, если любым другим символом, то получим False.
Если символ входит в наш алфавит, то сделаем следующее. Методом .find() найдем позицию буквы из сообщения в нашем алфавите и запишем в переменную t. Затем вычислим новое значение с учетом смещения на значение нашего ключа и запишем в переменную new_key. Добавим в строку encrypted букву с индексом new_key.
Иначе, если символ из исходной строки не найден в строке с алфавитом, просто добавим его в строку encrypted.
И выведем строку encrypted с нашим зашифрованным сообщением.
Теперь соберем все в цельную программу.
Чтобы расшифровать сообщение достаточно в нашей программе в строке, где мы вычисляем значение нового символа от его значения отнять значение ключа.
Чтобы зашифровать сообщение со сдвигом влево достаточно указать отрицательное значение ключа.
Как мы видим, что наши алгоритмы шифрования и дешифрования отличаются лишь тем, как мы находим новое значение смещения, либо складывая позицию символа с ключом или отнимая. Напишем универсальную программу, которая будет выполнять оба действия.
Для начала создадим меню, в котором будем выбирать операцию: шифрование или дешифрование. А чтобы иметь возможность выполнять эти действия многократно, поместим все в бесконечный цикл while.
Выведем сообщение для пользователя, чтобы он мог выбрать нужную ему операцию. Затем в переменную menu поместим ответ пользователя. Так же ответ приведем к нижнему регистру методом .lower(), чтобы не было разницы каким регистром буквы задавать выполняемую операцию.
Проверим условие, если пользователь выбрал В — выход, кто прервем наш цикл командой break. Иначе, если пользователь ошибочно ввел любой символ кроме Ш и Р запустим наш цикл заново командой continue, все команды и операции ниже будут проигнорированы.
Проверим условием, если пользователь решил расшифровать сообщение, тогда значение ключа key умножим на -1, чтобы оно стало противоположным по знаку.
Далее идет алгоритм разобранный нами ранее. Попробовать зашифровать или расшифровать свое сообщение алгоритмом Цезаря можно в блоке ниже.