Блог учителя Информатики

Шифр Цезаря

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

Например, в шифре со сдвигом вправо на 3, A была бы заменена на D, B станет E, Z станет C, и так далее.

Алгоритм шифрования можно выразить следующими формулами:
y = (x + k) mod n
x = (y - k) mod n
где x — символ открытого текста, y — символ шифрованного текста, n — мощность алфавита, а k — ключ.

Напишем программу на языке программирования Python которая использует шифр Цезаря.
Для начала создадим строку со всеми буквами русского алфавита. Используя эту строку мы будем находить порядковый номер буквы из нашего сообщения, чтобы сделать смещение для шифрования.

alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'

Затем запросим ввод строки которую будем шифровать и ключ для шифрования.

message = input('Введите строку: ').lower()
key = int(input('Введите ключ: '))

В переменной message будем хранить исходное сообщение, которое хотим зашифровать. В key будет храниться число, секретный ключ сдвига нашего алфавита.
Для удобства шифрования все введенные символы преобразуем в строчный регистр используя при вводе метод .lower(). При вводе ключа преобразуем введенный символ в целое число используя функцию int().

encrypted = ''

Так же создадим пустую переменную encrypted для хранения зашифрованного сообщения.
Используя цикл for будем перебирать наше исходное сообщение, чтобы получить по каждой букве из фразы.

for letter in message:

Цикл на каждой итерации будет получать в переменную letter по одному символу из сообщения message. Затем мы проверим, является ли полученный символ буквой.

    if letter in alphabet:

Для упрощения мы будем шифровать только буквы русского алфавита, символы препинания и пробелы будем оставлять без изменения. Для этого проверим полученный символ на вхождение в нашу строку с алфавитом используя оператор in. Если искомый символ будет буквой, то in вернет True, если любым другим символом, то получим False.
Если символ входит в наш алфавит, то сделаем следующее. Методом .find() найдем позицию буквы из сообщения в нашем алфавите и запишем в переменную t. Затем вычислим новое значение с учетом смещения на значение нашего ключа и запишем в переменную new_key. Добавим в строку encrypted букву с индексом new_key.

        t = alphabet.find(letter)
        new_key = (t + key) % len(alphabet)
        encrypted += alphabet[new_key]

Иначе, если символ из исходной строки не найден в строке с алфавитом, просто добавим его в строку encrypted.

    else:
        encrypted += letter
print('Зашифрованное сообщение:', encrypted)

И выведем строку encrypted с нашим зашифрованным сообщением.
Теперь соберем все в цельную программу.

alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
message = input('Введите строку: ').lower()
key = int(input('Введите ключ: '))
encrypted = ''
for letter in message:
    if letter in alphabet:
        t = alphabet.find(letter)
        new_key = (t + key) % len(alphabet)
        encrypted += alphabet[new_key]
    else:
        encrypted += letter
print('Зашифрованное сообщение:', encrypted)

Чтобы расшифровать сообщение достаточно в нашей программе в строке, где мы вычисляем значение нового символа от его значения отнять значение ключа.

            new_key = (t - key) % len(alphabet)

Чтобы зашифровать сообщение со сдвигом влево достаточно указать отрицательное значение ключа.
Как мы видим, что наши алгоритмы шифрования и дешифрования отличаются лишь тем, как мы находим новое значение смещения, либо складывая позицию символа с ключом или отнимая. Напишем универсальную программу, которая будет выполнять оба действия.

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

while True:

Выведем сообщение для пользователя, чтобы он мог выбрать нужную ему операцию. Затем в переменную menu поместим ответ пользователя. Так же ответ приведем к нижнему регистру методом .lower(), чтобы не было разницы каким регистром буквы задавать выполняемую операцию.
Проверим условие, если пользователь выбрал В — выход, кто прервем наш цикл командой break. Иначе, если пользователь ошибочно ввел любой символ кроме Ш и Р запустим наш цикл заново командой continue, все команды и операции ниже будут проигнорированы.

    print('Введите Ш чтобы зашифровать сообщение, Р чтобы расшифровать и В чтобы выйти')
    menu = input('>>> ').lower()
    if menu == 'в':
        break
    elif not (menu == 'ш' or menu == 'р'):
        continue

Проверим условием, если пользователь решил расшифровать сообщение, тогда значение ключа key умножим на -1, чтобы оно стало противоположным по знаку.

    if menu == 'р':
        key *= -1

Далее идет алгоритм разобранный нами ранее. Попробовать зашифровать или расшифровать свое сообщение алгоритмом Цезаря можно в блоке ниже.

Поделиться:
Вам также может понравится
Решение олимпиадных задач по информатике: Наименьший остаток
Решение олимпиадных задач по информатике: Последовательность
Решение олимпиадных задач по информатике: От перестановки чисел что-то меняется
Делаем Черепашку в виде снежинки