Недавно прочитал в Wikipedia про шифр Вернама, который теоретически взломать невозможно. Узнал оттуда, что на практике он не используется из-за того, что для него требуется генерировать случайный ключ, равный по длине самому сообщению, который не будет ни повторяться, ни повторно использоваться. И тогда возникла мысль: а что если использовать для генерации такого ключа криптографические хеш-функции. В этом случае взяв некоторое начальное значение (мастер-ключ), взять хеш от получившейся последовательности и зашифровать им первый блок (длина которого равна длине хеш-функции) сообщения, затем добавить получившееся значение к мастер-ключу и случайному числу, и зашифровать следующий блок и т.д. В результате получаем, что ключ для шифрования каждого следующего блока однозначно и просто генерируется из предыдущего при знании мастер-ключа, но получить мастер-ключ из хеша является сложной задачей в виду необратимости хеш-функций.
Однако у шифра Вернама есть еще одно требование: ключ должен использоваться однократно. Чтобы обеспечить это, при шифровании добавим к мастер-ключу достаточно длинное случайное число, которое будет уникальным для каждого шифруемого сообщения. При этом возникает необходимость как-то сохранить или передать это случайное число для того, чтобы можно было расшифровать сообщение. Очевидно, что сохранять его в открытом виде нельзя, но можно наложить на него мастер-ключ с помощью операции "исключающее ИЛИ", и добавить получившийся результат в начало или конец сообщения. При расшифровке при знании мастер-ключа это случайное значение можно будет снова легко получить, тогда как без знания оказываемся перед необходимостью сделать исключающее ИЛИ для двух неизвестных величин.
В итоге я получил следующий алгоритм шифрования:
Читать далее…