С появлением достаточно мощных квантовых компьютеров, многие криптографические алгоритмы становятся уязвимыми и перестают обеспечивать необходимую секретность данных. Есть один алгоритм, который будет работать и в постквантовую эру - шифр Вернама или одноразовые шифроблокноты. Но у него есть существенный недостаток - длина ключа должна быть равна количеству шифруемых данных.
Введение
Для связи шифроблокноты мало пригодны - необходимо хранить большой объем случайных данных, обновлять шифроблокноты по мере исчерпания. Хотя в наше время не проблема для каких-нибудь дипломатических миссий иметь хранилище с ключами на пару петабайт, но хлопоты на организацию защиты хранилища не избавят от проблемы исчерпания ключей. Для хранения Новый способ шифрования позволяет увеличить продолжительность использования предварительно созданных ключей при помощи генератора случайных чисел. В идеальных условиях даже двух бит хватит для бесконечного использования.
Определения
Шифроблокнот - предварительно сгенерированные случайные данные.
Поток сообщений - зашифрованные данные, передаваемые последовательно или параллельно между собеседниками.
Базовый ключ - очередная часть шифроблокнота, используемая для шифрования первого сообщения в потоке.
Ключ сессии - ключ шифрования следующего сообщения в потоке, создается при помощи ГПСЧ по мере необходимости.
Поле данных - полезная нагрузка, шифруемая ключом предыдущей сессии.
Алгоритм
Минимальное количество передаваемой информации определяет блок данных в сообщении, это может быть один бит или байт, или гигабайт, это зависит от конкретной реализации. Ключ должен быть длинной два блока, т. к. он шифрует блок данных и первую часть следующего ключа, вторая часть ключа шифруется первой частью предыдущего. Благодаря тому, что для ключей используются случайные данные, расшифровать настоящий ключ не получится, ибо все возможные комбинации равновероятны.
Алиса и Боб создают общий шифроблокнот.
Чтобы передать сообщение, Алиса берет символ из шифроблокнота в качестве базового ключа, создает ключ для следующей сессии, шифрует данные и ключ базовым ключем. Передает шифротекст Бобу.
Боб расшифровывает сообщение, используя тот же символ из шифроблокнота, получает данные и ключ сессии. После этого шага шифроблокнот не используется.
Боб использует ключ сессии вместо базового ключа, создает ключ следующей сессии, шифрует его и данные текущим ключом, отправляет шифротекст Алисе. Алиса повторяет те же действия, что и Боб.
Шифроблокнот с базовыми ключами используетя для инициализации сеанса или восстановлении связи при обрыве.
Алиса и Боб могут использовать индивидуальные сессионные ключи (т. е. генерировать их только для своего потока сообщений), тогда они могут передавать данные асинхронно, не ожидая ответа собеседника с новым ключом.
Для контроля целостности шифротекста при передаче, в поле данных можно передавать биты, указывающие на текущую сессию и информацию, компактно описывающую зашифрованные данные.
Пример
Самый простой случай для однобитного сообщения.
Алиса и Боб создают одинаковые шифроблокноты, первый ключ [10]
Алиса хочет послать Бобу бит [1]. Генерирует два случайных бита для ключа следующей сессии [00]. Шифрует данные и ключ базовым ключом.
101 xor 100 => 001
Получает шифротекст [001] и отправляет его Бобу.
Боб берет первый ключ из своего блокнота (тот же, что у Алисы) и расшифровывает полученное сообщение.
101 xor 001 => 100, 00
Теперь Боб хочет отправить Алисе бит [1]. Создает ключ следующей сессии [01]. Берет ключ, полученный из сообщения Алисы и шифрует им свое сообщение.
000 xor 101 => 101
Дальше алгоритм повторяется по такой же схеме.
Более сложный пример. Зашифруем слово habr. Каждое слово это один байт в кодировке ASCII.
h = 68, a = 61, b = 62, r = 72
В качестве базового ключа пусть будет [01 23]
Создаем для первого сообщения в качестве полезной нагрузки случайные данные [B6]
Создаем ключ сессии, ГПСЧ выдает [5C E4]
Шифруем...
012301 xor b65ce4 => b77fe5
Ключ текущей сессии известен, теперь генерируем ключ для следующей [b4 cd], начинаем шифровать сообщение.
5CE45C xor 68B4CD => 345091
Повторяем предыдущий шаг, генератор выдал новый ключ [A4 E8]
B4CDB4 xor 61A4E8 => D5695C
Продолжаем операции для оставшихся символов с ключами сессии [E0 9A] и [B0 51]. И получаем следующую последовательность в качестве результата.
B77FE5345091D5695CC6083EC26382
Достаточно удалить первые два байта и даже имея доступ к шифроблокноту расшифровать исходное сообщение не получится из-за того, что каждый ключ зашифрован предыдущим.
А вот интересное сообщение, зашифрованное тем же способом, в качестве базового ключа [7B D0]
33A7C016D2519BF4EBDF241ACED9541CCEDCD77108B6BD7858475C19B9475A4D5B85415DEE28A02F1F5250C04C55398F6CB561469291654E74BA19D98C104440913755