Почему меня это волнует: Я хочу реализовать несколько безопасных сеансов для связи через Интернет, и, поскольку я полный любитель в этом и не хочу тратить много времени на изучение криптографии или конкретных библиотек (поскольку я делаю это только для удовольствия), я хотите иметь минимальную подготовку со стороны программирования. С математической точки зрения я хорош в этом, так что дополнительное время на размышления (в отличие от гугления и чтения документации) не является проблемой.
Мое предположение/вопрос: Самое интересное начинается, когда я понял, что имея только один асимметричный шифр (блочный или потоковый), назовите его $Х$, достаточно для всех основных криптографических нужд.Другими словами, все остальные базовые криптографические категории (другие типы шифров, хеш-функций и подписей, никакие другие) могут быть сведены к этому алгоритму; вы можете сделать алгоритм хеширования, используя только $Х$и алгоритм подписи, использующий только $Х$. Это будет означать, что сочетание таких алгоритмов, как RSA+ChaCha+Poly1305 или что-то еще, устарело, когда скорость не имеет значения. Я не стремлюсь выше интернет-общения. FHE и подобные не входят в область применения. Тогда разве недостаточно реализовать только $Х$ когда время и скорость не имеют значения? Зачем тогда люди изобретают все эти алгоритмы, кроме скорости?
Мое доказательство:
Превращение потокового шифра в блочный шифр:
Просто обработайте поток фиксированной длины с помощью потокового шифра и назовите его блочным шифром.
Превращение блочного шифра, действующего на множестве произвольного размера, в блочный шифр, действующий на множестве размера степени $2$.
Позволять $А$ быть набором $\{1,\dots,N\}$. Позволять $Х$ быть блочным шифром с двумя функциями $Е$ и $Д$ (функция шифрования и дешифрования), которые отображают элементы из $А$ к $А$. Позволять $2^к$ быть величайшей силой $2$ меньше или равно $N$. Позволять $В$ быть набором $\{1,\dots,2^k\}$. Позволять $х$ быть числом из $А$. Последовательность $х,Е(х),Е(Е(х)),...$ предполагается случайным и равномерно распределенным на множестве $А$ (также длинный цикл, так как это асимметричный шифр), который дает, что число из $В$ происходит в среднем после каждого $\frac{|B|}{|A|}$ элементы. Мы можем взять первое такое вхождение как образ новой функции $E'$ что теперь карты из $В$ к $В$. Определять $D'$ быть обратным $E'$. Пара $(Е',D')$ это новый блочный шифр, который действует на наборе размера $2^к$, другими словами, на блоках $к$ биты. Это так же безопасно, как $Х$ потому что если мы сможем взломать этот шифр, то это означает, что мы можем найти результат применения исходного шифра несколько раз, скажем $м$ раз.Тогда мы можем просто повторно применить шифр $м-1$ больше раз на зашифрованное сообщение, а затем используйте этот взлом, чтобы отменить его $м$ раз. С $м$ ожидается меньше, чем $к$, это осуществимо.
Превращение блочного шифра размера $2^к$ в потоковый шифр.
Предположим $к$ четно (понятие проще объяснить). Технически я только шифрую и расшифровываю сообщение произвольного размера, что не совсем является потоковым шифром. Во-первых, расширьте сообщение, чтобы оно имело длину, кратную $\фрак{к}{2}$. Думайте об этом сообщении как о последовательности блоков размером $\фрак{к}{2}$. Мы можем зашифровать пары этих блоков на месте: первый и второй блоки вместе, затем второй и третий и так далее... до конца. До сих пор это напоминало потоковый шифр. При желании мы можем добавить к сообщению случайное начало, если изначально сообщение было слишком коротким. Мы также можем, при желании, изменить порядок этих блоков и применить ту же последовательность шифрования. Теперь мы можем либо расшифровать все сообщение, либо ничего: если мы потеряем его часть, мы ничего не сможем расшифровать. Точно так же, как должен вести себя первоначальный блочный шифр. Это так же безопасно, как и исходный блочный шифр, потому что, если мы сможем взломать все сообщение, мы сможем повторно запустить шифрование и создать все промежуточные продукты, включая расшифровку последних 2 блоков, зашифрованных шифровальщиком.
Превращение блочного шифра в хеш-функцию.
Я отредактировал эту часть, потому что первая идея была неправильной...
Создайте две пары ключей и выбросьте закрытые ключи, а открытые ключи жестко закодируйте в алгоритме. Как и в предыдущей части, подготовьте блоки. Теперь зашифруйте первый $к$ биты на место сначала одним ключом, потом другим, удалить $л<<к$, $л|к$ «случайные» (псевдослучайные, засеянные некоторым простым хэшем сообщения) биты из этого произведенного $к$ биты и объединить остальные биты. Продолжайте делать это, пока не останется только $к$ оставшиеся биты, то назовите это сильным хэшем.Это так же безопасно, как и шифр, потому что, если мы предположим, что нашли другое сообщение с таким же выводом, то пока мы перешифровываем их оба одновременно, в какой-то момент мы получим то же самое. $к-л$ бит (после удаления случайных $л$ биты). Вот почему это сложно: $к-л$ биты могут быть заполнены до $к$ биты не более $2^l\binom{k}{l}$ способов (которых мы можем ограничить небольшим числом), то большинство из них не будут давать одинаковые $к-л$ битов, что помогает его ограничить, то даже если бы мы могли расшифровать другую комбинацию $к$ биты (что, возможно, возможно, потому что они напоминают оригинал $к$ биты), расшифрованное $к$ биты пришлось бы заново расшифровывать, но теперь они не похожи на оригинал $к$ битов, поэтому нам в основном придется взломать шифр на этом этапе. Мы используем два разных шифра (два разных открытых ключа), потому что хотим устранить любую гибкость.
Превращение блочного шифра в функцию подписи.
Мы можем сначала вычислить хэш сообщения, а затем зашифровать хэш. Очевидно, что это безопасно, поскольку именно так работают современные алгоритмы.
Прошу прощения за использование разных тегов, я просто не знал, что использовать.