Добрый день!

Что вы знаете о криптографии? Знакомы ли вам Алиса и Боб? Если вы впервые об этом слышите, то, скорей всего, вы откроете для себя много интересного. Если же у вас есть мало-мальское математическое образование, вы хоть раз слышали о криптографии или умеете складывать числа по модулю — добро пожаловать в команду!

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

Слишком сложно? Тогда смотри видео! Там я рассказываю всё очень простым и понятным языком!











Пáрит? Посмотри видео! Это же намного удобнее!











Всё ещё читаешь? Молодец! Держи печеньку за это!

Постановка задачи проста до безобразия: два человека в сети (назовём их Алиса и Боб) хотят установить друг с другом шифрованное соединение для передачи секретных данных, защищённое от прослушивания третьим лицом, скажем, Зорро. Задача: обменяться данными (текстом, картинками, программами, чем угодно; всё это — данные) так, чтобы Зорро ничего не понял и не смог расшифровать прослушанные данные за ощутимый промежуток времени. Скажем, необходимо сделать так, чтобы даже за миллион лет, используя все компьютеры человечества, Зорро не смог бы расшифровать подслушанный трафик. Пусть Зорро в посталвенной задаче является пассивным атакующим, который не может влиять на трафик (подменять его, прерывать, менять местами пакеты), а может только подслушивать со стороны и пытаться расшифровать: что же Алиса и Боб пересылают друг другу или обсуждают. Случай, когда Зорро является активным атакующим и может подменять трафик, прерывать его, менять местами пакеты и тому подобное, я оставляю вам, дорогие гости, в качестве домашнего задания. И вообще: случай, когда Зорро может производить семантические атаки или рандомно-детерминистические атаки оставим в стороне: всё-таки это любительский проект для частного использования, а не претендент на шифрование по ГОСТу.

Итак, вначале Алиса и Боб должны создать симметричный ключ шифрования, с помощью которого они будут зашифровывать и расшифровывать свои данные, чтобы обмениваться ими по открытому каналу связи, который прослушивает Зорро. Имея такой ключ, любой может зашифровать и расшифровать данные как Алиса или Боб. Но у Зорро нет такого ключа и (по постановке задачи) не будет / не должно быть. Как только Алиса и Боб получили такой ключ, они могут приступать к безопасному обмену сообщениями по открытому каналу, не опасаясь за то, что Зорро что-то узнает. Но пока у Алисы и Боба нет такого ключа. Основной трюк заключается в том, чтобы создать такой ключ по прослушиваемому каналу связи!

Есть много очень быстых и эффективных алгоритмов создания такого ключа, например, протокол Диффи — Хеллмана, который проходят курсе на третьем любого достаточно технического ВУЗа. Протокол основан на свойствах функций с коллизиями и логарифмированию по модулю (и прочих неизвестных для вас дебрях) и позволяет в мгновение ока создать непосильный для взлома ключ. Раз «такое уже есть», то на кой хрен изобретать велосипед? Не знаю... но это не совсем велосипед. Протокол Диффи — Хеллмана строго рандомно-детерминистический, а мой протокол континуусно-рандомный.

Вся суть заключается в том, что Алиса и Боб, не сговариваясь, начинают вместе заполнять так называемый динамический обновляемый крипто пул (ДОКП). Заполненный ДОКП и будет ключом! ДОКП — это просто массив из 256 байт, который в начале не заполнен. В заполненном ДОКП каждый байт от 0 до 255 включительно должен быть заполнен одним уникальным значением от 0 до 255 включительно, и ни одно значение не должно повториться дважды. По сути, ДОКП — это биективная перестановка. Значит, во-первых, она является инвертируемой, и, во-вторых, замыкание её саму на себя порождает новую биективную перестановку. Продолжим. Заполнение ДОКП происходит в 256 раундов, в каждом из которых стороны обмениваются друг с другом по открытому каналу связи одним единственным байтом. В каждом раунде каждая сторона (и Алиса и Боб) случайным образом выбирает, что она будет создавать: указатель или значение. Указатель — это число от 0 до 255 включительно, которое указывает на ещё не заполненную ячейку ДОКП. Значение — это число от 0 до 255 включительно, которое ещё ни разу не встретилось ни в одной ячейке ДОКП. Далее стороны обмениваются сгенерированными сущностями (только числами), не указывая по открытому каналу связи, чем по сути сущности являются — ключом или значением. Стороны предугадывают суть полученного по сети числа, ориентируясь на свой собственный выбор: «если я выбрал значение, значит оппонент прислал указатель», и наоборот. Далее они заполняют свободную ячейку ДОКП, на которую указывает созданный/полученный указатель созданным/полученным значением. Если происходит коллизия, то стороны обмениваются информацией о сбросе, и создание ДОКП начинается заново.

Но если вы шарите в математике, вы скажете, что вероятность создания такого ключа чудовищно мала. Согласен! Но и я не все карты раскрыл! Именно поэтому в алгоритм введена рандомно-детерминистичная обусловленность при реализации выбора Алисой и Бобом между генерацией указателя и генерацией значения. Это и обсулавливает дополнительную суть вероятностного разделения секрета в построении ключа. Как именно введена такая обусловленность я рассказал в сопутствующем видео и документе.

В случае успеха и у Алисы и у Боба есть абсолютно одинаковый ДОКП, который теперь является ключом! Зорро же надолго остаётся в размышлении над подслушанным трафиком, ибо не зная сути переданных сущностей реконструировать ключ у него врядли получится: в каждом раунде у него есть два выбора относительно пары подслушанных чисел — это «указатель и значение» или это «значение и указатель». Так как в каждом новом раунде выбор Алисы и Боба не зависел от выбора, сделанного в предыдущем раунде, то у Зорро есть 2256 = 115 792 089 237 316 195 423 570 985 008 687 907 853 269 984 665 640 564 039 457 584 007 913 129 639 936 вариантов различных ключей, которые ему необходимо перебрать, чтобы понять о чём говорят Алиса и Боб. Но это ещё не вся степень защиты алгоритма...

После получения ключа Алиса и Боб начинают активно использовать шифрованный канал связи. И тут всплывает ещё один ньюанс защиты. В большинстве существующих алгоритмов ключ с течением времени или не меняется вовсе (знаменитые схемы с XOR-ингом со счётчиками или рандомно-детерминистичным нонсенсом), или меняется через определённое количество отосланных блоков (для обеспечения семантической безопасности). В моём же случае ключ меняется каждый раз, когда происходит передача данных между Алисой и Бобом. И ещё более занятный факт: ключ меняется не каким-любо алгоритмически случайным образом, а с помощью алгоритма, использующего фактически переданную информацию, что вносит ещё больший хаос в энтропию!

Круто?! Надеюсь, я вас заинтересовал!

Более просто и подробно о том, как и почему работает Kripptx, я рассказываю в этом видео:

Скачивание Kripptx в архиве и ссылка на репозиторий: