Шифр Цезаря: как зашифровать и расшифровать текст вручную и на Python

Шифр Цезаря заменяет каждую букву той, что стоит в алфавите на k позиций дальше.

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

И даём рабочий код на Python: простую функцию, вариант через str.maketrans, ROT13 из стандартной библиотеки и взлом перебором.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2817 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3471 экспертное мнение Подписаться на Телеграм-канал
Обложка: Шифр Цезаря: как зашифровать и расшифровать текст вручную и на Python

Шифр Цезаря заменяет каждую букву той, что стоит в алфавите на k позиций дальше. Число k называют сдвигом или ключом. Со сдвигом 3 буква «А» превращается в «Г», «Б» в «Д», а «Я» уходит в начало алфавита и становится «В».

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

CheckroiCheckroiПодборка курсов по Python571 курс • 50 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Как работает сдвиг и откуда он взялся

Рой сдвигает буквы на шифровальном диске

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

В виде формулы это записывают так: y = (x + k) mod n, где x означает номер буквы с нуля, k сдвиг, а n число букв в алфавите. Для расшифровки знак меняется: x = (y − k) mod n. Операция mod (остаток от деления) и замыкает алфавит в круг.

Метод назван в честь Гая Юлия Цезаря. Светоний в «Жизни двенадцати цезарей» пишет, что в личных письмах Цезарь заменял A на четвёртую букву, D, и так со всеми остальными, то есть пользовался сдвигом 3 («Божественный Юлий», гл. 56). Август сдвигал на одну букву, а вместо X писал AA, то есть по кругу не переходил («Божественный Август», гл. 88).

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

Буква Шифр Буква Шифр Буква Шифр
А Г К Н Х Ш
Б Д Л О Ц Щ
В Е М П Ч Ъ
Г Ё Н Р Ш Ы
Д Ж О С Щ Ь
Е З П Т Ъ Э
Ё И Р У Ы Ю
Ж Й С Ф Ь Я
З К Т Х Э А
И Л У Ц Ю Б
Й М Ф Ч Я В

Как зашифровать текст вручную

Записка с зашифрованным текстом и таблица замены на столе

Для короткой записки хватит листа бумаги и таблицы выше.

  1. Договоритесь с получателем о сдвиге и об алфавите: с буквой «Ё» (33 буквы) или без неё (32 буквы).
  2. Выпишите алфавит в строку, а под ним тот же алфавит, сдвинутый на k позиций влево. Получится таблица замены.
  3. Берите буквы сообщения по одной и записывайте вместо каждой букву из нижней строки.
  4. Пробелы и знаки препинания переносите без изменений, заглавные буквы оставляйте заглавными.

Пример со сдвигом 3: фраза «Встречаемся у Форума в полдень» превращается в «Ефхузъгзпфв ц Чсуцпг е тсожзря». Проверить себя можно по первому слову: В → Е, С → Ф, Т → Х, Р → У.

Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Как расшифровать шифр Цезаря

Способ зависит от того, известен ли вам ключ.

Сдвиг известен

Сдвигайте каждую букву назад на k позиций. Со сдвигом 3 «Г» снова станет «А», а «В» вернётся в «Я». Сдвиг назад на k даёт тот же результат, что сдвиг вперёд на n − k: в русском алфавите из 33 букв расшифровать сдвиг 3 можно сдвигом 30.

Сдвиг неизвестен

  • Перебор. Ключей всего n − 1: 32 для русского алфавита и 25 для английского. Расшифруйте текст каждым и найдите вариант, который читается. Вручную это скучно, программа справится за доли секунды, код ниже.
  • Частотный анализ. Сдвиг не меняет того, как часто встречается буква. В русских текстах чаще других стоят «о», «е» и «а». Найдите самую частую букву шифра, предположите, что это «о», и посчитайте расстояние между ними: это и будет ключ.

Частотный анализ работает на длинных текстах. В двух-трёх словах частоты случайны, там надёжнее перебор.

Шифр Цезаря на Python

Ниже три рабочих варианта: от учебной функции до готового кодека из стандартной библиотеки. Код проверен в Python 3.14, вывод под каждым примером реальный. Если Python ещё не стоит, начните с инструкции, как создать и запустить файл Python в VS Code.

Простая функция для русского текста

Функция проходит по строке, находит номер каждой буквы в алфавите, прибавляет сдвиг и берёт остаток от деления на длину алфавита. Остаток и замыкает алфавит в круг; как работает оператор %, подробно разобрано в статье про операторы в Python.

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

def caesar(text, shift):
    result = []
    for ch in text:
        low = ch.lower()
        if low in RU:
            new = RU[(RU.index(low) + shift) % len(RU)]
            result.append(new.upper() if ch.isupper() else new)
        else:
            result.append(ch)
    return "".join(result)

secret = caesar("Встречаемся у Форума в полдень", 3)
print(secret)
print(caesar(secret, -3))
Ефхузъгзпфв ц Чсуцпг е тсожзря
Встречаемся у Форума в полдень

Расшифровка не требует отдельной функции: достаточно передать отрицательный сдвиг. В Python остаток от деления отрицательного числа на положительное всегда неотрицательный, поэтому (-2) % 33 даёт 31, и индекс не выходит за алфавит.

Через str.maketrans: русский и английский алфавит сразу

Если текст смешанный, удобнее построить таблицу замены один раз и применять её методом translate. Оба метода описаны в документации Python по строкам. Каждый алфавит сдвигается по своему кругу: 33 буквы для кириллицы, 26 для латиницы.

import string

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

def make_table(shift):
    src = RU + RU.upper() + EN + EN.upper()
    dst = ""
    for abc in (RU, RU.upper(), EN, EN.upper()):
        k = shift % len(abc)
        dst += abc[k:] + abc[:k]
    return str.maketrans(src, dst)

def encrypt(text, shift):
    return text.translate(make_table(shift))

def decrypt(text, shift):
    return text.translate(make_table(-shift))

msg = encrypt("Привет, Python 3.12!", 5)
print(msg)
print(decrypt(msg, 5))
Фхнжйч, Udymts 3.12!
Привет, Python 3.12!

Цифры и знаки здесь не меняются, потому что их нет в таблице замены. Если нужно шифровать и цифры, добавьте строку string.digits в список алфавитов.

ROT13 из стандартной библиотеки

Для латиницы в Python есть готовый кодек rot_13 в модуле codecs. Это шифр Цезаря со сдвигом 13. В английском алфавите 26 букв, поэтому повторное применение возвращает исходный текст: одна и та же операция и шифрует, и расшифровывает.

import codecs

print(codecs.encode("Hello, World!", "rot13"))
print(codecs.decode("Uryyb, Jbeyq!", "rot13"))
Uryyb, Jbeyq!
Hello, World!

С кириллицей кодек не работает: русские буквы он оставляет как есть.

Как взломать шифр Цезаря программой

Рой радуется, что программа нашла ключ

Ключей мало, поэтому шифр Цезаря ломается перебором за доли секунды. Возьмём перехваченную строку и выведем все 32 варианта, используя функцию caesar из предыдущего раздела:

secret = "Цчпямт, ъипклт, цхзлкпт"
for k in range(1, len(RU)):
    print(f"{k:2} {caesar(secret, -k)}")

Фрагмент вывода, строки с 5 по 8:

 5 Сткъзн, хдкёжн, сргжёкн
 6 Рсйщжм, фгйеём, рпвёейм
 7 Пришёл, увидел, победил
 8 Опзчек, тбзгдк, онадгзк

Человек находит строку 7 за секунду. Чтобы ключ выбирала сама программа, считайте для каждого сдвига, сколько в расшифровке самых частых русских букв, и берите вариант с максимумом. Подсчёт делает встроенная sum: она складывает значения True как единицы, подробнее о ней в статье, как суммировать список в Python.

FREQUENT = "оеаинтс"  # самые частые буквы русского текста

def crack(secret):
    def score(k):
        return sum(ch in FREQUENT for ch in caesar(secret, -k).lower())
    best = max(range(len(RU)), key=score)
    return best, caesar(secret, -best)

secret = caesar("Шифр Цезаря легко взломать: достаточно посчитать, какие буквы встречаются в тексте чаще остальных", 11)
print(crack(secret))
(11, 'Шифр Цезаря легко взломать: достаточно посчитать, какие буквы встречаются в тексте чаще остальных')

На длинной фразе программа нашла сдвиг 11 верно. На короткой «Пришёл, увидел, победил» она ошибается: выбирает сдвиг 4 и выдаёт бессмыслицу. Поэтому для коротких строк автоматический подбор лучше совмещать с перебором и проверкой глазами.

Русский и английский алфавит: сколько ключей

Принцип один, различаются длина алфавита и число возможных ключей. В коде длину лучше брать через len(RU): тогда переход на другой алфавит сводится к правке одной строки. Как устроены строки и функция len, удобно смотреть в официальной документации, а как пользоваться python.org, мы разбирали отдельно.

Алфавит Букв Рабочих сдвигов Особенность
Русский с «Ё» 33 32 Сдвиг 33 возвращает исходный текст
Русский без «Ё» 32 31 Часто встречается в школьных задачах, «ё» заменяют на «е»
Английский 26 25 Сдвиг 13 (ROT13) шифрует и расшифровывает одной операцией

Перед работой уточните, какой вариант русского алфавита у собеседника. Со сдвигом 3 слово «встречаемся» в алфавите с «Ё» становится «ефхузъгзпфв», а без «Ё» — «ефхуиъгипфв». Различаются только буквы «Г», «Д» и «Е»: при сдвиге 3 они попадают на «Ё» или рядом с ней, остальные буквы шифруются одинаково.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Шифр Цезаря с ключевым словом

У этого варианта два ключа: число и слово. Нижнюю строку таблицы замены собирают так:

  1. Выписывают ключевое слово, выбрасывая повторяющиеся буквы.
  2. Дописывают остальные буквы алфавита по порядку, пропуская те, что уже есть в слове.
  3. Сдвигают получившуюся строку так, чтобы слово начиналось под буквой с номером k.

Алфавит перемешан, поэтому соседние буквы шифра уже не идут подряд, и простой сдвиг назад текст не откроет. Частотный анализ при этом по-прежнему работает: каждая буква всё так же заменяется всегда одной и той же.

def keyword_alphabet(word, shift):
    head = "".join(dict.fromkeys(word.lower()))
    tail = "".join(ch for ch in RU if ch not in head)
    mixed = head + tail
    k = shift % len(RU)
    return mixed[-k:] + mixed[:-k]

def encrypt_kw(text, word, shift):
    table = str.maketrans(RU, keyword_alphabet(word, shift))
    return text.lower().translate(table)

print(keyword_alphabet("рим", 3))
print(encrypt_kw("встречаемся у форума", "рим", 3))
эюяримабвгдеёжзйклнопстуфхцчшщъыь
янолмфэмжнь п сйлпжэ

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

Слово «рим» встало на позиции с четвёртой по шестую, то есть под буквами «Г», «Д» и «Е». Чтобы расшифровать такое сообщение, постройте ту же таблицу и поменяйте строки местами: str.maketrans(keyword_alphabet("рим", 3), RU).

Частые ошибки и что с ними делать

  • Расшифровка выдаёт почти правильный текст, но часть букв съехала на одну. У вас и у отправителя разные алфавиты: один считал «Ё», другой нет. Решение: договориться об алфавите заранее или перебрать оба варианта.
  • IndexError: string index out of range. В коде забыли взять остаток от деления, и номер буквы в конце алфавита вышел за его пределы. Решение: заменить RU[RU.index(low) + shift] на RU[(RU.index(low) + shift) % len(RU)].
  • Заглавные буквы пропали или не шифруются. Алфавит в коде задан строчными, а проверка идёт по исходному символу. Решение: искать букву через ch.lower() и возвращать регистр через isupper(), как в первом примере.
  • Вместо «ё» в шифре появляются чужие буквы вроде «є». Код сдвигает буквы через chr(ord(ch) + shift). В Юникоде буквы от «а» до «я» идут подряд (коды 1072–1103), а «ё» стоит отдельно, под кодом 1105, и chr(ord("ё") + 3) даёт «є». Решение: брать номер буквы из строки-алфавита через index.
  • Шифруются пробелы и знаки препинания. Так бывает, если алфавит собран из всех символов подряд. Читать такой шифр неудобно, а надёжнее он не становится. Решение: менять только буквы.

Насколько надёжен шифр и где он пригодится

Для защиты данных шифр Цезаря не годится. У него всего 32 ключа на русском и 25 на английском, а перебор, как видно выше, занимает одну строку кода. Он сохраняет частоты букв и длину слов, так что сообщение выдаёт себя даже без перебора.

Зато шифр хорошо подходит для трёх задач:

  • учебная задача по программированию: строки, циклы, остаток от деления и словари в одном упражнении;
  • головоломки и квесты: зашифрованная подсказка, которую игрок расшифрует на листке;
  • первый шаг к настоящей криптографии: шифр Виженера использует тот же сдвиг, только ключом служит слово, и для каждой буквы сдвиг свой.

Современные данные защищают алгоритмами вроде AES и RSA, и работа с ними уже задача специалиста по информационной безопасности.

Где освоить Python системно

Шифр Цезаря собирает в одной задаче строки, циклы, индексы и арифметику остатков. Если такая задача далась с трудом или хочется писать программы посложнее, базу Python лучше пройти по программе с наставником и проверкой кода. Подборка курсов с ценами и отзывами собрана в разделе курсы Python. Ниже пять программ из каталога.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология161 200 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 666 ₽4108 ₽/мес.9 месяцевОбзор курса
Программирование на Python ПРО
Перейти на сайт курса
SkillboxSkillbox119 600 ₽ - 17 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Как расшифровать шифр Цезаря без ключа?

Переберите все сдвиги: в русском алфавите их 32, в английском 25. Один из вариантов прочитается как обычный текст. Для длинных сообщений подходит частотный анализ: самая частая буква шифра обычно соответствует «о».

Какой сдвиг использовал Юлий Цезарь?

По Светонию, Цезарь заменял каждую букву на ту, что стоит на три позиции дальше: A на D. Его преемник Август сдвигал на одну букву.

Сколько букв брать в русском алфавите: 32 или 33?

Как договоритесь с получателем. С буквой «Ё» в алфавите 33 буквы, без неё 32, и школьные задачи часто дают второй вариант. Результаты расходятся уже с буквы «Г», поэтому алфавит нужно согласовать заранее.

Как написать шифр Цезаря на Python?

Задайте алфавит строкой, найдите номер буквы методом index, прибавьте сдвиг и возьмите остаток от деления на длину алфавита. Для смешанного текста удобнее построить таблицу замены через str.maketrans и применить translate. Как работает остаток %, разобрано в статье про операторы в Python.

Чем ROT13 отличается от шифра Цезаря?

Ничем, кроме сдвига: ROT13 это шифр Цезаря со сдвигом 13 для латиницы. В английском алфавите 26 букв, поэтому повторное применение ROT13 возвращает исходный текст. В Python для него есть кодек rot13 в модуле codecs.

Можно ли защитить данные шифром Цезаря?

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

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!