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

Алфавит выписывают по кругу: после последней буквы снова идёт первая. Каждую букву сообщения заменяют на ту, что стоит в этом круге на k шагов дальше. Пробелы, цифры и знаки препинания обычно оставляют как есть.
В виде формулы это записывают так: y = (x + k) mod n, где x означает номер буквы с нуля, k сдвиг, а n число букв в алфавите. Для расшифровки знак меняется: x = (y − k) mod n. Операция mod (остаток от деления) и замыкает алфавит в круг.
Метод назван в честь Гая Юлия Цезаря. Светоний в «Жизни двенадцати цезарей» пишет, что в личных письмах Цезарь заменял A на четвёртую букву, D, и так со всеми остальными, то есть пользовался сдвигом 3 («Божественный Юлий», гл. 56). Август сдвигал на одну букву, а вместо X писал AA, то есть по кругу не переходил («Божественный Август», гл. 88).
Шифр Цезаря со сдвигом 3 для русского алфавита из 33 букв выглядит так. Слева в каждой паре исходная буква, справа буква шифра.
| Буква | Шифр | Буква | Шифр | Буква | Шифр |
|---|---|---|---|---|---|
| А | Г | К | Н | Х | Ш |
| Б | Д | Л | О | Ц | Щ |
| В | Е | М | П | Ч | Ъ |
| Г | Ё | Н | Р | Ш | Ы |
| Д | Ж | О | С | Щ | Ь |
| Е | З | П | Т | Ъ | Э |
| Ё | И | Р | У | Ы | Ю |
| Ж | Й | С | Ф | Ь | Я |
| З | К | Т | Х | Э | А |
| И | Л | У | Ц | Ю | Б |
| Й | М | Ф | Ч | Я | В |
Как зашифровать текст вручную

Для короткой записки хватит листа бумаги и таблицы выше.
- Договоритесь с получателем о сдвиге и об алфавите: с буквой «Ё» (33 буквы) или без неё (32 буквы).
- Выпишите алфавит в строку, а под ним тот же алфавит, сдвинутый на k позиций влево. Получится таблица замены.
- Берите буквы сообщения по одной и записывайте вместо каждой букву из нижней строки.
- Пробелы и знаки препинания переносите без изменений, заглавные буквы оставляйте заглавными.
Пример со сдвигом 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 из стандартной библиотеки
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 они попадают на «Ё» или рядом с ней, остальные буквы шифруются одинаково.
Шифр Цезаря с ключевым словом
У этого варианта два ключа: число и слово. Нижнюю строку таблицы замены собирают так:
- Выписывают ключевое слово, выбрасывая повторяющиеся буквы.
- Дописывают остальные буквы алфавита по порядку, пропуская те, что уже есть в слове.
- Сдвигают получившуюся строку так, чтобы слово начиналось под буквой с номером 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-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 161 200 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 666 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | - | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




