Невзламываемый шифр Вернама
medium

Невзламываемый шифр Вернама

Его нельзя взломать даже теоретически.

Продолжается цикл статей о шифровании и криптографии. В предыдущих сериях:

Сегодня разберём невзламываемый симметричный шифр. 

Вся криптография основана на том, что для взлома шифра злоумышленнику потребуются десятки или сотни лет даже при доступе к большим вычислительным ресурсам. Но в симметричном шифровании есть алгоритмы, которые при правильном использовании вообще невозможно взломать. Один из таких алгоритмов — шифр Вернама.

Как работают такие алгоритмы

Общие правила для абсолютно стойких шифров в симметричном шифровании такие:

  1. Одно шифрование — один уникальный ключ. Второе сообщение шифровать этим же ключом уже нельзя.
  2. Ключ состоит из случайных битов, и каждый бит не зависит от другого. Это значит, что нельзя использовать в качестве ключа, например, отрывок из книги, потому что это резко снижает устойчивость шифра ко взлому.
  3. Длина ключа должна быть равна длине сообщения или ключ должен быть чуть длиннее. Если ключ короче сообщения, которое нужно зашифровать, то абсолютной стойкости не получится.

Если в алгоритме соблюдаются все три правила, то такой шифр взломать нельзя даже теоретически.

Шифр Вернама — это просто

В 1917 году телеграфист Гильберт Вернам изобрёл шифр, который основан на побитовом исключающем ИЛИ. Если коротко и просто, то на каждую букву вашего сообщения накладывается другая маскирующая буква, которая делает исходную букву нечитаемой.

Шифр Вернама — это сложно

Теперь попробуем объяснить подробнее. 

1. Сообщение хранится в виде битов данных. Допустим, мы шифруем текст. Компьютер не умеет работать с текстом как таковым, он этот текст хранит как набор числовых кодов (проще говоря, у компьютера все буквы пронумерованы и он помнит только эти номера).

Числа, в свою очередь, компьютер хранит в виде двоичного кода, то есть битов данных. Это пока что не относится к шифрованию, это просто то, как хранится любая текстовая информация в компьютере.

БукваКод в ASCIIБиты данных
K7501001011
O7901001111
D6801000100

Если мы напишем KOD в кодировке ASCII, то для компьютера это будет последовательность из трёх чисел, а каждое число — это набор битов: 

01001011 01001111 01000100

2. Берём случайные биты в качестве ключа шифрования. На входе у нас три числа по 8 бит. Чтобы их зашифровать, нам нужны 24 случайных бита. Возьмём их с потолка, они ничего не значат: 

10101101 01111010 10101011

3. Накладываем коды друг на друга и применяем алгоритм шифрования. Шифр Вернама построен на принципе «исключающего ИЛИ», он же XOR. Он смотрит на каждую пару битов и пытается понять, они одинаковые или разные. Если биты одинаковые, результат проверки будет 0, если разные — 1.

Можно проверить себя так: XOR задаёт вопрос «Эти биты разные»? Если да — то 1, если нет — то 0.

Буква K01001011
Ключ10101101
XOR (Они разные?)11100110

Если мы таким образом закодируем три буквы, мы получим три новых набора битов: 

KOD (сообщение)010010110100111101000100
Ключ101011010111101010101011
Результат шифрования с помощью XOR111001100011010111101111

Получается, что на входе у нас было 24 бита данных и на выходе 24 бита данных. Но эти данные теперь совсем другие. Если перевести эти числа обратно в текст, мы получим: 

KOD  →  æ5ï

Расшифровка шифра Вернама

Если у нас есть закодированное сообщение и ключ от него, то раскодировать его не составит труда. Мы просто пишем алгоритм, который применяет операцию XOR как бы в обратном порядке к каждому биту сообщения. Например: 

  1. Если в ключе шифрования в каком-то бите стоит 1, то мы берём этот же бит в зашифрованном сообщении и меняем его. Если был 1, то меняем на 0. Если был 0, то меняем на 1. 
  2. Если в ключе шифрования в каком-то бите стоит 0, то этот же бит в зашифрованном сообщении мы не меняем.
  3. Проходим так по каждому биту сообщения и получаем исходный текст.

Компьютер может совершать миллиарды таких операций в секунду. Главное — иметь на руках ключ для расшифровки. 

Почему этот шифр невзламываемый

Для начала договоримся, что под взломом мы понимаем прочтение этого сообщения без ключа. Если бы у нас был ключ, мы бы прочитали это сообщение почти сразу, и это уже не взлом. 

Теперь посмотрим, почему без ключа этот шифр невозможно взломать. 

  • Каждый бит нашего исходного сообщения шифруется соответствующим битом, который берётся из ключа шифрования.
  • Ключ шифрования — это случайные биты, такой «цифровой шум». Он не имеет смысла и в нём нет никакой логики. Каждый следующий бит может быть каким угодно. 
  • Шифрование происходит на самом низком уровне — на уровне битов. Мы даже не знаем, что перед нами: буквы, цифры, числа, картинки или аудио. Просто какой-то набор битов, которые выглядят как цифровой шум. 

Единственный способ расшифровать целое сообщение — это получить целый ключ. Если мы получим лишь часть ключа, мы не сможем угадать или восстановить недостающую часть. Сколько ключа у нас есть — столько битов сообщения мы и расшифруем. Нет ключа — нет расшифровки. 

Пример работы

Если мы зашифруем так фразу «Привет, это журнал Код!», то можем получить что-то такое:

hi857ов9njg5jоlр6;p0ора

Штука в том, что одна и та же буква в шифровке не означает одинаковые буквы в исходном сообщении, потому что биты шифрования выбраны случайным образом. Поэтому при попытке расшифровки злоумышленник получит такие варианты:

Срочно подпишись на код

Верни деньги, а то вилы

мама, я сдал зачёт, ура

Ваш зам предатель и вор

Ваш зам ни при чём, вот

Также он может получить любые другие сочетания букв, цифр и пробелов в рамках тех 23 символов, которые у нас были в исходном сообщении. Может быть, это не текст вовсе, а набор цифр. Может быть, это текст на каком-то другом языке. Может быть, это не текст вовсе, а очень маленькая картинка. Все эти варианты можно получить из нашей зашифрованной строки, потому что злоумышленник не знает ключ. 

Минусы шифра Вернама

Если бы у этого шифра не было минусов, все бы пользовались только им, но сейчас этот шифр используется редко. Всё дело в том, что им очень неудобно пользоваться, чтобы выполнить все условия.

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

Даже если удастся заранее передать набор ключей каждой стороне для будущих шифровок, их нужно держать в полной физической безопасности, чтобы нельзя было их украсть, подсмотреть, потерять или перепутать.

Именно из-за таких требований к безопасности ключа этот шифр сейчас используется очень редко. 

Что дальше

Поиграем в шпионов и напишем свой алгоритм шифра Вернама на JavaScript. Заодно и посмотрим, как работает XOR.

Текст

Миша Полянин


Редактор

Максим Ильяхов


Корректор

Ира Михеева


Иллюстратор

Даня Берковский


Вёрстка

Маша Дронова


Доставка

Олег Вешкурцев

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
medium