Помнится, я где-то читал, что иногда в некоторых потоковых шифрах необходимо пропускать первые значения, которые они выдают.
Не какие-то потоковые шифры, а один конкретный шифр: RC4. RC4 относится к более ранней эпохе, когда криптографические примитивы не подвергались тщательному изучению — фактически, изначально это был секретный алгоритм. После того, как дизайн RC4 был обнародован, был обнаружен ряд слабых мест. Основная слабость заключалась в том, что смещение в начале ключевого потока. RC4 был популярен в то время, когда была впервые обнаружена атака, основанная на этой предвзятости, и контрмерой было отбрасывание первых нескольких байтов. Со временем анализ смещения был улучшен, что сделало отбросы недостаточными, и RC4 постепенно терял популярность.
RC4 имеет очень простую структуру: каждый раунд состоит из простого скремблирования внутреннего состояния и выдает один байт вывода. Получается, что пока не набралось достаточно раундов, результат несколько предсказуем.
Большинство шифров выполняют несколько раундов скремблирования, прежде чем выдать какой-либо вывод. И общеупотребительные шифры были подтверждены годами исследований в криптографическом исследовательском сообществе.
Точно так же, как хеш-функция должна сделать много раундов, прежде чем она вернет случайный результат, CSPRNG требуется некоторое количество итераций, чтобы начальное число и ключевая информация не могли быть получены из первых результатов.
Да и нет. Это правда, что CSPRNG требует достаточного скремблирования из семени.Но это скремблирование встроено в основные составляющие алгоритма. Типичные современные CSPRNG основаны либо на хеше (в котором уже много раундов), либо на блочном или потоковом шифре (в котором уже много раундов).
Моя идея проверить, сколько итераций нам нужно пропустить, состоит в том, чтобы рассматривать CSPRNG как хеш-функцию с ключом и кормить ее числами 1,2,3,... как начальное число с некоторыми ключами.
Это действенный и популярный подход для ключевые производные функции - детерминированное генерирование псевдослучайного материала из начального числа. (Обратите внимание, что я говорю о получении ключа из материала с высокой энтропией, а не о получении ключа на основе пароля, также известном как растяжение ключа, которое имеет другие требования.) Примеры алгоритмов получения ключа, которые следуют этой парадигме: NIST SP 800-108 KDF в режиме счетчика и ХКДФ.
Однако в качестве генератора случайных чисел этому подходу чего-то не хватает — чего, кстати, не хватает и RC4 (что делает его плохим выбором для CSPRNG, несмотря на его популярность). Не хватает сопротивление возврату: свойство, согласно которому, если состояние скомпрометировано, это скомпрометирует будущие выходные данные RNG, но не прошлые выходные данные. Сопротивление обратному отслеживанию требует одностороннего преобразования состояния ГСЧ каждый раз, когда он выдает выходные данные. Любая конструкция, использующая постоянный секрет и общедоступную переменную для генерирования выходных данных, не обладает устойчивостью к возврату.