Security

Шифр Цезаря

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

Что такое Шифр Цезаря

Шифр Цезаря — простейший шифр подстановки: каждая буква текста заменяется буквой, стоящей на фиксированное число позиций дальше по алфавиту. Дошёл до конца — начинаешь с начала. Число позиций и есть ключ. Гай Юлий Цезарь, по свидетельству Светония, пользовался сдвигом на 3.

При сдвиге 3 в русском алфавите:

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

Пример: приветтулезх.

Расшифровка шифра Цезаря

Расшифровка — это тот же сдвиг, только в обратную сторону: если шифровали на +3, то расшифровываете на −3 (что то же самое, что +30 для 33-буквенного алфавита).

Формула на позициях букв (нумерация с нуля):

шифрование:   E(x) = (x + k) mod N
расшифровка:  D(y) = (y − k) mod N

где k — ключ, N — размер алфавита: 33 для русского с «ё», 26 для латиницы.

Если ключ неизвестен — это не проблема. Вариантов всего 32, их перебирают вручную за минуту:

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

def caesar(text: str, shift: int) -> str:
    out = []
    for ch in text:
        low = ch.lower()
        if low in ALPHABET:
            new = ALPHABET[(ALPHABET.index(low) + shift) % len(ALPHABET)]
            out.append(new.upper() if ch.isupper() else new)
        else:
            out.append(ch)
    return "".join(out)

print(caesar("тулезх", -3))          # привет

for k in range(1, 33):               # перебор, если ключ неизвестен
    print(f"{k:2}: {caesar('тулезх', -k)}")

Осмысленный вариант в списке будет ровно один — его и берут. Такой метод называется полным перебором, или brute force.

Для латиницы существует именной частный случай — ROT13, сдвиг на 13. Поскольку 13 — это ровно половина от 26, шифрование и расшифровка совпадают: применил дважды, получил исходный текст.

echo "URYYB" | tr 'A-Za-z' 'N-ZA-Mn-za-m'   # HELLO

Почему это не криптография в современном смысле

Шифр Цезаря вскрывается двумя способами, и оба тривиальны:

  1. Перебор ключей. Пространство ключей — 32 варианта. Любой компьютер проверит их мгновенно.
  2. Частотный анализ. Шифр не меняет статистику: буква о — самая частая в русском тексте — останется самой частой и в шифротексте, просто под другим именем. Достаточно найти самый частый символ, предположить, что это о, и ключ найден по одной букве. Работает даже без перебора и на длинных текстах не даёт осечек.

Отсюда главный урок, ради которого шифр Цезаря до сих пор разбирают в учебниках: стойкость шифра не должна зависеть от секретности алгоритма. Это принцип Керкгоффса — надёжна та система, где известно всё, кроме ключа. У Цезаря секретность держалась именно на незнании алгоритма противником, и как только метод стал общеизвестен, шифр умер.

Современная криптография устроена наоборот: алгоритмы AES, ГОСТ «Кузнечик» и RSA опубликованы, изучены и атакованы тысячами исследователей — а стойкость держится на размере ключа. Пространство ключей AES-256 — это 2²⁵⁶ вариантов, и перебор здесь не помогает.

Практический вывод один: шифр Цезаря, ROT13 и «свои» самодельные шифры годятся для головоломок и обучения, но не для защиты данных. Для реальной задачи берут проверенный алгоритм и готовую библиотеку — например, TLS для канала.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер