Шифр Вернама

Привет
Шифр Вернама — симметричный потоковый шифр, основанный на операции исключающего ИЛИ (XOR). Текст и ключ представляют в виде битов и складывают побитно по модулю 2. Тот же ключ, применённый к шифровке ещё раз, возвращает исходный текст, поэтому шифрование и расшифровка выполняются одной и той же операцией.
Как работает шифр Вернама
Операция XOR (сложение по модулю 2) даёт 1, если биты разные, и 0, если одинаковые:
| A | B | A XOR B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Главное свойство: (A XOR K) XOR K = A. Если сложить шифровку с тем же ключом, ключ «сокращается» и остаётся исходный текст.
Сервис переводит текст и ключ в байты (кодировка UTF-8: латинская буква — 1 байт, русская — 2 байта) и складывает каждый байт текста с очередным байтом ключа. Если ключ короче текста, он повторяется по кругу. Результат XOR — произвольные байты, многие из которых не отображаются как символы, поэтому шифровка выводится в кодировке Base64: латинскими буквами, цифрами и знаками «+», «/», «=». Для расшифровки вставьте эту строку и укажите тот же ключ.
Пример шифрования по битам
Зашифруем слово «Hi» ключом «ok». В кодировке ASCII (и UTF-8) буква H — байт 01001000, i — 01101001, o — 01101111, k — 01101011:
| 1-й байт | 2-й байт | |
|---|---|---|
| Текст | 01001000 (H) | 01101001 (i) |
| Ключ | 01101111 (o) | 01101011 (k) |
| XOR | 00100111 | 00000010 |
Шифровка — байты 00100111 и 00000010, в Base64 это «JwI=». Сложив их снова с ключом «ok», получим исходные байты 01001000 и 01101001, то есть «Hi».
Требования к ключу
Шифр Вернама абсолютно стоек — его нельзя взломать даже перебором всех ключей, — только при трёх условиях:
- ключ случайный — не слово и не фраза, а случайная последовательность байтов;
- ключ не короче сообщения — если ключ короче, он повторяется, и шифр становится уязвимым, как шифр Виженера;
- ключ используется один раз — две шифровки одним ключом, сложенные по XOR, дают XOR двух исходных текстов, и по нему тексты восстанавливаются.
Отсюда второе название шифра — «одноразовый блокнот»: у отправителя и получателя были одинаковые блокноты со случайными ключами, и каждый лист использовался для одного сообщения и уничтожался. Главная трудность — заранее и тайно передать получателю ключ такой же длины, как все будущие сообщения.
Кнопка «Случайный ключ» создаёт ключ из случайных латинских букв и цифр длиной не меньше текста в байтах — это хорошее учебное приближение, но не настоящий одноразовый блокнот: у такого ключа в каждом байте всего 57 вариантов из 256, и по шифровке видно, где в тексте русские буквы, а где латинские. Для настоящей секретности ключ должен состоять из случайных байтов во всём диапазоне, а шифровать такие данные лучше не на сайте, а у себя на компьютере.
История
Гилберт Вернам, инженер американской телеграфной компании AT&T, в 1917 году придумал шифровать сообщения телетайпа, складывая их с перфолентой ключа, и в 1919 году получил на это патент. Джозеф Моборн предложил брать для ключа случайную ленту и не использовать её повторно — так появился одноразовый блокнот. Клод Шеннон в работе 1945 года, опубликованной в 1949-м, доказал, что такой шифр абсолютно стоек. Одноразовые блокноты применяли дипломаты и разведки, а по одной из версий, на них работала и «горячая линия» Москва — Вашингтон.
Вопросы и ответы
Как расшифровать шифр Вернама?
Вставьте шифровку в Base64, укажите ключ, которым шифровали, выберите «Расшифровать» и нажмите «Рассчитать». Ключ нужен точно тот же, с учётом регистра и пробелов. С чужим ключом получится бессмыслица, а байты, которые не складываются в буквы, будут показаны знаком «�».
Можно ли расшифровать шифр Вернама без ключа?
Если ключ случайный, не короче сообщения и использован один раз — нельзя: при подходящем ключе шифровка превращается в любой текст той же длины, и узнать, какой из них настоящий, невозможно. Если ключ — короткое слово, которое повторяется, или один ключ использован для нескольких сообщений, шифр взламывают так же, как шифр Виженера.
Как решить школьную задачу на шифр Вернама?
В учебниках текст обычно записывают в двоичном коде (по таблице ASCII или по номерам букв алфавита) и складывают по модулю 2 с двоичным ключом, как в примере выше. Сервис выдаёт шифровку в Base64 и работает с байтами UTF-8, поэтому для задач с другой кодировкой букв результат может не совпасть с ответом учебника — используйте пример по битам как образец.
Работает ли шифр с русским текстом?
Да. Русские буквы в UTF-8 занимают по 2 байта, и каждый из них складывается с байтом ключа. Ключ тоже может быть на русском: шифр работает с любыми символами ключа.
Чем шифр Вернама отличается от шифра Виженера?
Оба складывают текст с ключом, но шифр Виженера сдвигает буквы по алфавиту, а шифр Вернама складывает биты по модулю 2. Шифр Виженера с коротким повторяющимся ключом взламывается, а шифр Вернама со случайным одноразовым ключом длиной с сообщение — нет.
Комментарии к сервису
Зашифровать или расшифровать текст шифром Виженера онлайн по ключу: русский алфавит с Ё и без Ё, английский и другие. Таблица (квадрат) Виженера для русского алфавита и пример расшифровки по шагам.
Перейти к расчету
Расшифровать или зашифровать текст шифром Цезаря онлайн с любым сдвигом, а если ключ неизвестен — подобрать все сдвиги. Русский алфавит с Ё и без Ё, английский, ROT13, таблица шифра.
Перейти к расчету
Зашифровать и расшифровать текст шифром Гронсфельда онлайн: числовой ключ, русский алфавит с Ё и без Ё, английский и другие. Пример шифрования по шагам и отличие от шифра Виженера.
Перейти к расчету