Для CSPRNG я бы сказал, что тот факт, что он может повторять блоки, является хорошая вещь; предсказать, что шаблон не может повториться, проблематично. Единственная причина, по которой это обычно приемлемо, заключается в том, что вероятность повторения больших блоков в любом случае незначительна.
Скажем, вы использовали бы CSPRNG для создания набора 128-битных блоков, размер блока которых соответствует AES. Миллион примерно $2^{20}$. вы ожидаете шанса $1 - (1 - {1 \более 2^{128}})^{1000000} \приблизительно 2^{-108}$ для повторения начального блока, и ${1000000 \более 2^{128}} \приблизительно 2^{-(128 - 20)} = 2^{-108}$ для любого столкновения в первом миллионе блоков. Причина, по которой эти значения примерно одинаковы, заключается в том, что миллион почти ничего не значит для 128-битных значений. Как видите, вероятность столкновения настолько мала, что ею можно пренебречь. Вот почему поточный шифр, такой как AES-CTR, можно рассматривать как сам CSPRNG.
Как правило, CSPRNG имеют большое внутреннее состояние, а это означает, что его невозможно узнать. когда ГПСЧ повторяется. Что еще более важно, вероятность того, что они попали в цикл чрезвычайно низкий (если цикл сработает, CSPRNG будет генерировать один и тот же - большой - шаблон в повторении). Поэтому из-за непредсказуемости вы можете использовать CSPRNG в качестве потокового шифра. Это верно и для AES / CTR, конечно, если вы посмотрите на шаблоны, отличные от 128 бит точно в нужном месте. Очевидно, что шаблон одного бита будет повторяться очень сильно часто - просто вы не можете знать, какое значение бита вы найдете в данной позиции. Проблема с AES-CTR заключается в том, что он попадет в цикл точно после того, как счетчик будет исчерпан.
Однако, поскольку многие CSPRNG реализации не были разработаны чтобы создать такой же детерминированный поток, вы должны чрезвычайно осторожный использования одного в качестве потокового шифра. Например, они могут повторно заполнить, использовать заданное начальное значение в качестве дополнительной энтропии, генерировать другой результат, когда методы вызываются по-другому, или даже изменить алгоритм. Если вам не повезет, вы никогда не сможете восстановить тот же ключевой поток, и ваши данные будут потеряны (см., например, получитьRawKey()
на Android-устройствах).
Конечно, AES-CTR, как правило, будет намного быстрее, чем CSPRNG. Если вам не нравится AES или у вас нет аппаратного ускорения, то вам обычно подойдет потоковый шифр, такой как ChaCha. Обычно вы должны использовать эти шифры в режиме аутентификации с использованием GMAC (AES-GCM) или Poly1305.
В литературе по криптографии вы часто обнаружите, что термины «потоковое шифрование» и «CSPRNG» используются взаимозаменяемо, но будьте осторожны с практическими различиями в последних двух разделах.