Как сделать шифр цезаря на питоне

Добавил пользователь Алексей Ф.
Обновлено: 05.10.2024

Шифр Цезаря, также известный как шифр сдвига, код Цезаря или сдвиг Цезаря — один из самых простых и наиболее широко известных методов шифрования.

Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите.

Например, в шифре со сдвигом вправо на 3, А была бы заменена на Г, Б станет Д, и так далее.

Шифр назван в честь римского полководца Гая Юлия Цезаря, использовавшего его для секретной переписки со своими генералами.

Шаг шифрования, выполняемый шифром Цезаря, часто включается как часть более сложных схем, таких как шифр Виженера, и всё ещё имеет современное приложение в системе ROT13. Как и все моноалфавитные шифры, шифр Цезаря легко взламывается и не имеет почти никакого применения на практике.

Программа просит ввести строку и ключ (размер сдвига). Если ключ k положителен, выполняется шифрование, если отрицателен — дешифрование.

INTRO: О CEASAR CIPHER Caesar Chiph – это простой шифр, который был вокруг … Теги от шифров, криптография, Python.

INTRO: О CEASAR CIPHER

Шифр Caesar – это простой шифр, который был в течение длительного времени. Юлий Цезарь использовал его в некоторых его переписке в течение 2000 лет назад. Он имеет приложения в других шифрах, но не предлагает полезного уровня безопасности из-за того, насколько легко расшифровать.

И наоборот, если мы хотим расшифровать это, мы применяем шифр в обратный и сдвиг влево вместо справа. Из этого мы видим, что две вариабельные части шифра являются 1. Каким образом вы переключаетесь и 2. Насколько.

Кодирование шифра

Как упражнение, я написал простой сценарий Python для выполнения вращений для меня. Во-первых, я разработал математику для обработки сдвига (включая упаковку), поскольку это была самая сложная часть. Затем я итасировал каждый персонаж и применил вычисление. Наконец, я добавил простой CLI, а затем опубликовал его на Github Отказ

Математика

Модуль

Это довольно простая математика, хотя, так почему мы добавляем ниже и вычтите его в том же уравнении? Разве те не отменили друг друга? Да, но Поскольку алфавит основан на 26 символах, нам необходимо до 0-26 значений кода Unicode к нашему индексу 1-26, чтобы мы могли использовать модуль для обработки сдвигов, которые необходимо обернуть.

Бонус: В полном примере кода я использую модуль 26, чтобы обрабатывать сдвиги больше 26. например Сдвиг 27 является эквивалентом 1 (27%).

Резюме

Напишите программу на Python для создания шифрования Цезаря.

Примечание. В криптографии шифр Цезаря, также известный как шифр Цезаря, шифр сдвига, код Цезаря или сдвиг Цезаря, является одним из самых простых и широко известных методов шифрования. Это тип шифра замещения, в котором каждая буква в открытом тексте заменяется буквой с фиксированным числом позиций по алфавиту. Например, при сдвиге влево 3 D будет заменен на A, E станет B и так далее. Метод назван в честь Юлия Цезаря, который использовал его в своей личной переписке.

«Python

Пример решения : -

Код Python:

Блок - схема:

«Блок-схема:

Визуализируйте выполнение кода Python:

Следующий инструмент визуализирует, что компьютер делает шаг за шагом при выполнении указанной программы:

Редактор кода Python:

Есть другой способ решить это решение? Внесите свой код (и комментарии) через Disqus.

Favorite

Добавить в избранное

Проблемы с практикой Python. Приготовьтесь к следующему собеседованию

Практическая задача Python 3: Caesar Cipher Redux

Д ля третьей практической задачи вы снова решите шифр Цезаря, но на этот раз вы сделаете это без использования .translate().

Описание проблемы

Описание этой проблемы такое же, как и у предыдущей проблемы. Прежде чем погрузиться в решение проблемы, вы можете спросить, почему вы повторяете одно и то же упражнение, просто без помощи .translate().

Отличный вопрос. В обычной жизни, когда ваша цель – получить работающую, поддерживаемую программу, переписывание частей стандартной библиотеки – плохой выбор. Стандартная библиотека Python будет упаковано с работой, хорошо проверенные и быстрые решения проблем, больших и малых. Воспользоваться этим в полной мере – признак хорошего программиста.

Тем не менее, это не рабочий проект или программа, которую вы строите для удовлетворения потребности. Это обучающее упражнение, и именно такие вопросы можно задать во время собеседования. Цель обоих – увидеть, как вы можете решить проблему и какие интересные дизайнерские компромиссы вы придете при этом.

Итак, в духе обучения, давайте попробуем решить шифр Цезаря без .translate().

Проблема Решение

Для этой проблемы у вас будет два разных решения, когда вы будете готовы расширить раздел ниже.

Для этой проблемы предлагаются два различных решения. Проверьте оба и посмотрите, какой из них вы предпочитаете!

Решение 1

Для первого решения вы внимательно следите за описанием проблемы, добавляя сумму к каждому символу и переворачивая его обратно в начало алфавита, когда он идет дальше по ту сторону z:

Начиная с строки 14, вы можете видеть, что caesar() делает ли а понимание списка, вызывая вспомогательную функцию для каждой буквы в message. Затем он делает .join() чтобы создать новую закодированную строку. Это коротко и мило, и вы увидите аналогичную структуру во втором решении. Самое интересное происходит в shift_n().

Здесь вы можете увидеть другое применение для string.ascii_lowercase, на этот раз отфильтровывая любую букву, которая не входит в эту группу. Как только вы будете уверены, что отфильтровали все не-буквы, вы можете перейти к кодированию. В этой версии кодирования вы используете две функции из стандартной библиотеки Python:

Опять же, вам предлагается не только изучить эти функции, но и подумать, как вы могли бы отреагировать в ситуации интервью, если бы не могли вспомнить их имена.

ord() выполняет работу по преобразованию Буквы в число, и chr() преобразует его обратно в букву. Это удобно, так как позволяет делать арифметику по буквам, что и нужно для этой задачи.

Первый шаг вашего кодирования в строке 7 получает числовое значение закодированной буквы с помощью ord() чтобы получить числовое значение исходной буквы. ord() возвращает значение Кодовая точка Юникода символа, который оказывается значением ASCII.

Для многих букв с небольшими значениями сдвига вы можете преобразовать букву обратно в символ, и все будет готово. Но рассмотрим начальную букву, z.

Сдвиг одного символа должен привести к появлению буквы a. Чтобы достичь этого, вы находите разницу от закодированной буквы к букве z. Если эта разница положительна, то вам нужно вернуться к началу.

Вы делаете это в строках с 8 по 11, многократно добавляя 26 к символу или вычитая его из него, пока он не окажется в диапазоне символов ASCII. Обратите внимание, что это довольно неэффективный метод для устранения этой проблемы. Вы увидите лучшее решение в следующем ответе.

Наконец, в строке 12 ваша функция преобразования shift принимает числовое значение новой буквы и преобразует его обратно в букву, чтобы вернуть ее.

Хотя это решение использует буквальный подход к решению проблемы шифра Цезаря, вы также можете использовать другой подход, смоделированный после .translate() решение в практической задаче 2.

Решение 2

Второе решение этой проблемы имитирует поведение встроенного метода Python .translate(). Вместо того чтобы сдвигать каждую букву на заданную величину, он создает карту перевода и использует ее для кодирования каждой буквы:

Начнем с того, что caesar() в строке 11 вы начинаете с устранения проблемы amount быть больше, чем 26. В предыдущем решении цикл повторялся до тех пор, пока результат не оказывался в нужном диапазоне. Здесь вы используете более прямой и эффективный подход, используя оператор mod (%).

То оператор mod производит остаток от целочисленного деления. В этом случае вы делите на 26, что означает, что результаты гарантированно будут между 0 и 25, включающий.

Затем вы создадите таблицу перевода. Это изменение по сравнению с предыдущими решениями и заслуживает некоторого внимания. Вы увидите больше об этом ближе к концу этого раздела.

Как только вы создадите table, остальная часть caesar() идентично предыдущему решению: понимание списка для шифрования каждой буквы и .join() чтобы создать строку.

shift_n() находит индекс данной буквы в алфавите и затем использует его для извлечения буквы из алфавита. table. Блок try…except ловит те случаи, которые не найдены в списке строчных букв.

Теперь давайте обсудим вопрос создания таблицы. Для этого игрушечного примера это, вероятно, не имеет большого значения, но он иллюстрирует ситуацию, которая часто встречается в повседневной разработке: балансирование ясности кода против известных узких мест производительности.

Если вы еще раз изучите код, то увидите, что table используется только внутри shift_n(). Это указывает на то, что в нормальных обстоятельствах он должен был бы быть создан и, таким образом, иметь свое масштаб ограничивается, shift_n():

Другой возможный способ, которым вы могли бы избежать этого штрафа за производительность, состоял бы в том, чтобы сделать глобальную переменную table. Хотя это также сокращает штраф за создание, это делает сферу применения table еще больше. Это не кажется лучше, чем подход, показанный выше.

В конце концов, выбор между созданием table один раз авансом и придавая ему больший объем или просто создавая его для каждой буквы это то что называется а проектное решение. Вы должны выбрать дизайн, основанный на том, что вы знаете о реальной проблеме, которую вы пытаетесь решить.

Поскольку вы рассмотрели два решения, стоит уделить время обсуждению их сходства и различия.

Сравнение Решений

Вы видели два решения в этой части шифра Цезаря, и они довольно похожи во многих отношениях. Это примерно одинаковое количество строк. Две основные процедуры идентичны за исключением ограничения amount и создание table. Это только когда вы смотрите на две версии вспомогательной функции, shift_n(), что различия появляются.

Первый shift_n() это почти буквальный перевод того, о чем просит проблема: “сдвиньте букву вниз по алфавиту и оберните ее вокруг z.”. Это явно восходит к постановке проблемы, но у нее есть несколько недостатков.

Хотя это примерно такая же длина, как и вторая версия, первая версия shift_n() быть более сложным. Эта сложность связана с преобразованием букв и математикой, необходимой для выполнения перевода. Необходимые детали-преобразование в числа, вычитание и обертывание—маскируют выполняемую операцию. Второй shift_n() гораздо меньше вовлечен в его детали.

Первая версия функции также специфична для решения этой конкретной задачи. Вторая версия shift_n(), как и стандартная библиотека .translate() то, что он смоделирован, является более универсальным и может быть использовано для решения большего набора проблем. Обратите внимание, что это не обязательно хорошая цель Дизайна.

Одна из мантр, которые вышли из экстремальное программирование движение – это “тебе это не понадобится ” (ЯГНИ). Часто разработчики программного обеспечения будут смотреть на такую функцию, как shift_n() и решить, что было бы лучше и более общего назначения, возможно, путем передачи параметра вместо использования string.ascii_lowercase.

Хотя это действительно сделало бы функцию более универсальной, это также сделало бы ее более сложной. Мантра ЯГНИ существует для того, чтобы напоминать вам не добавлять сложности, прежде чем у вас будет конкретный случай ее использования.

Чтобы завершить ваш раздел шифра Цезаря, есть явные компромиссы между двумя решениями, но второе shift_n() похоже, это немного лучше.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: