Можно ли создать шифр, который невозможно взломать вообще?
Не «очень трудно». Не «требует тысяч лет вычислений».
А именно невозможно в принципе. В криптографии такой шифр действительно существует. И что удивительно — он предельно простой. Его можно записать одной строкой: C = P XOR K Это шифр Вернама, его частный случай известнен как одноразовый блокнот (One‑Time Pad).
Он настолько прост, что его легко реализовать буквально на уровне бит. И при этом — при правильном использовании — он обладает математически доказанной абсолютной секретностью.
Это не маркетинговое утверждение. В 1949 году Клод Шеннон, один из основателей теории информации, строго доказал, что такой шифр невозможно взломать никаким криптоанализом. Более того — это единственный известный шифр, для которого существует подобное доказательство.
От телеграфа к криптографии
История шифра начинается не с математиков, а с телеграфных инженеров. В начале XX века сообщения уже передавались не буквами, а кодами. Один из самых распространённых был код Бодо (Baudot code).
Каждый символ в нём кодировался 5 битами. 5 бит дают 32 комбинации — этого мало для букв, цифр и знаков одновременно. Поэтому код использовал два режима: — режим букв — режим цифр и знаков.
Переключение между ними происходило специальными управляющими символами. Именно с такими потоками бит работали телеграфные машины начала XX века.
В 1917 году инженер AT&T Гилберт Вернам (Gilbert Vernam) предложил шифровать телеграфный сигнал. Идея была неожиданно простой: если сообщение уже представлено в виде битов, можно смешать его с другим потоком битов — ключом. Для этого используется логическая операция XOR. Метод был запатентован в 1919 году: 📄 Vernam, G. S. Secret signaling system.
Как работает XOR
Правило операции очень простое: 0 XOR 0 = 0 1 XOR 0 = 1 0 XOR 1 = 1 1 XOR 1 = 0 Результат равен 1 только тогда, когда биты различаются. Если обозначить: P — бит открытого текста K — бит ключа C — бит шифротекста получается формула: C = P XOR K.
У операции XOR есть удивительное свойство. Если применить её дважды с тем же ключом: (P XOR K) XOR K = P То есть та же самая операция выполняет и шифрование, и расшифровку. С инженерной точки зрения это почти идеально: — одна операция — одинаковый алгоритм в обе стороны — легко реализуется аппаратно.
Но магия совершенной секретности появляется только при одном условии. Ключ должен быть: — полностью случайным — длиной не меньше сообщения — использован только один раз Так появляется концепция одноразового блокнота (One‑Time Pad).
Почему его нельзя взломать
Шеннон доказал, что при соблюдении этих условий шифр обладает совершенной секретностью. Это означает: из шифротекста невозможно извлечь никакой информации о сообщении. Совсем. Любое сообщение той же длины может соответствовать этому же шифротексту — просто при другом ключе. Например, если у нас есть шифротекст: 101101 он может быть результатом шифрования любого шестибитного сообщения. Всё зависит от ключа. Это означает, что криптоанализ просто не имеет за что зацепиться.
Факт, который часто удивляет
Шифр Вернама (а точнее его частный случай - одноразовый блокнот) — единственный шифр, который доказанно обладает абсолютной криптографической стойкостью. Все современные алгоритмы — Кузнечик, AES, ChaCha20 — не имеют такого доказательства. Они считаются стойкими потому что их пока не смогли взломать, а не потому что доказано, что это невозможно. Это принципиальная разница.
Почему его почти не используют
Причина — не в алгоритме. Причина в ключах. Как было отмечено выше, что бы использовать одноразовый блокнот, необходимо: — иметь случайный ключ — длиной не меньше сообщения — передать его получателю заранее — и никогда больше не использовать Если вы хотите отправить 10 мегабайт данных — у вас уже должен быть 10‑мегабайтный секретный ключ. И его нужно передать другой стороне безопасно. Фактически задача передачи ключа становится сложнее самой передачи сообщения.
Попытки взлома
Криптоаналитики пытались атаковать одноразовый блокнот с разных сторон. Но почти всегда проблема оказывалась не в алгоритме, а в его использовании. Самая известная уязвимость — повторное использование ключа. Если один и тот же ключ применить к двум сообщениям: C1 = P1 XOR K C2 = P2 XOR K то C1 XOR C2 = P1 XOR P2 Ключ исчезает из уравнения. А дальше можно использовать статистику языка и постепенно восстанавливать сообщения. Эта атака называется two‑time pad attack.
Кодировки, которые я применил в визуализации шифра
Кодировки в игре добавлены скорее как справочный элемент. Они показывают, как текст превращается в поток бит перед шифрованием. Доступны: — Код Бодо — ASCII‑7 — ASCII‑8 — UTF‑8 В оригинальной системе Вернама использовался ранее упомянутый код Бодо, имеющий на борту 5 бит в два режима (для букв и для цифр + доп. символы). Остальных кодировок тогда просто не существовало.
ASCII Появится только в 1963 году. Он является примером фиксированной кодировки. Каждый символ занимает одинаковое количество бит.
ASCII‑7 7 Бит → 128 символов.
ASCII‑8 8 Бит → 256 символов.
Это делает обработку очень простой: каждый символ начинается через одинаковый интервал.
Чуть более инетересной выглядит UTF‑8, появившаяся в 1992 году.
Как работает UTF‑8
UTF‑8 — Кодировка переменной длины. Символ может занимать: 1 байт (8 бит) 2 байта (16 бит) 3 байта (24 бита) 4 байта (32 бита) Как декодер понимает длину символа? По первому байту. Он содержит специальный префикс: 0xxxxxxx → 1 байт 110xxxxx → начало 2‑байтового символа 1110xxxx → начало 3‑байтового символа 11110xxx → начало 4‑байтового символа Все последующие байты начинаются с: 10xxxxxx Поэтому границы символов можно определить однозначно. Примеры: A 01000001 Ж 11010000 10010110 😊 11110000 10011111 10011000 10001010.
Как это реализовано в геймплее визуализации
Давайте уже переходить от чтения к любимому делу нажиманию кнопок. Как и в предыдущих визуализациях процесс разбит на наблюдаемые шаги.
Выбор кодировки.
Ввод сообщения.
Стоит отметить, я немного заморочился. При наведении на каждый символ сообщения в таблице кодировки из правой панели будут подсвечиваться соответствующие и символу и его позиции биты из левой панели. И наоборот.
Генерация ключа.
Помните?) Не менее длины сообщения. В данном случае длина сообщения 392 бита и ключ в 512 бит вполне удовлетворяет этому условию. Хотя, можно было выбрать и вариант "По длине сообщения". А что насчет условия по случайности генерации ключа? Ну, на качественный генератор случайных чисел или оборудование квантового распределения ключей я не накопил, так что для демо целей сойдёт и Math.random ()
Зашифровываем сообщение.
Два режима: Ручной (Следующий бит) - кликаем, наблюдаем постепенное побитовое преобразование, под кнопками в реальном времени наблюдаем XOR операцию. Автоматический (Мгновенное шифрование) - надоело кликать, а 392 клика подряд не каждому дано осилить, добиваем процесс зашифрования в одно нажатие.
Процесс передачи как ключа так и шифротекста.
Этот этап был и в Полибии, и в Цезаре, и в Виженере. Потому что это по сути ключевая проблема криптографии. Во всех смыслах. Я даже позволил себе некоторые фривольности, так сказать, решил сделать небольшой подкольчик. Если шифротекст (по нажатию кнопки) отправляется по прямой, то ключ же полетит по кривой Безье. Владельцы большого парка СКЗИ, решившие вопрос без костылей по гарантировано безопасной передаче, выработке и загрузке ключей в ПАК - моё почтение!
Процесс расшифроки шифротекста.
Комментарии излишне. Хотя... Отмечу что на 42 клике мне стало скучно и я воспользовался функцией "Мгновенное шифрование".
Декодирование.
Итоги сеанса.
Итоги статьи
На этом всё ребятушки, подписывайтесь на канал, ставьте лайк, всем пока... Раньше здесь был мат пара-папам-па-па-пам.
Абсолютная безопасность возможна. Но цена за неё — огромная сложность управления ключами. Именно поэтому одна из центральных задач современной криптографии — не столько шифрование, сколько: — создание ключей — передача ключей — безопасное хранение ключей В каком‑то смысле почти вся современная криптография — это попытка решить задачу: как безопасно управлять ключами.
Попробовать самому и посмотреть, как биты сообщения смешиваются с ключом можно здесь:
👉 Игра «Шифр Вернама» в Ludus Lab.