Рассмотрим блочный шифр в режиме CTR. И давайте рассмотрим PRNG с ключом или просто хороший PRNG с начальным числом в качестве ключа. PRNG должен быть очень быстрым.
Является ли хорошей идеей отказаться от расписания ключей и выполнить «бесконечное» планирование ключей, создав поток ключей? Тогда каждый блок в шифре будет зашифрован другим ключом.
Конечно, даже быстрому ГПСЧ нужно некоторое время, чтобы сгенерировать несколько 128
-битные ключи для шифра. Но разве это не сильно повышает безопасность такого алгоритма? Если алгоритм сам по себе является очень быстрым примитивом (скажем, таким же быстрым, как Chacha20), он должен обладать отличной безопасностью и хорошей скоростью, если он связан с таким «ключевым потоком расписания».
Однако я подозреваю, что скорость такого решения может быть существенным препятствием. Итак, давайте вносить изменения каждый раз, когда алгоритм повторяется (одиночное шифрование) — переворачивая только один бит ключа за раунд. Если алгоритм требует один ключ на раунд и имеет десять раундов, нам нужно только десять бит. PRNG будет генерировать такие биты очень быстро. Затем ключи меняются после каждого шифрования, немного (мы меняем только один бит в каждом ключе), но это должно стать огромным препятствием для злоумышленника.
Возможно, мы могли бы использовать что-то простое, например, два раунда AES, но не добавлять еще два раунда к шифру. Итак, давайте воспользуемся этим, чтобы сгенерировать поток ключей для смешивания с ключами в новом шифровании.
Мой вопрос о недостатках такого решения. Насколько я знаю, не используется - почему? Другими словами, почему мы используем константы и одни и те же ключи в раундах (при шифровании огромного количества сообщений), когда ключи можно модифицировать с небольшими затратами после каждого шифрования; например, добавив один бит по модулю 2 (после очередного шифрования мы добавляем еще один бит на более высокую позицию и так далее, меняя все 128-битные ключи после 128 шифрования).