Когда мы разрабатываем криптографический генератор случайных чисел, мы хотим, чтобы он прошел больше, чем просто статистические тесты. Золотым стандартом здесь является тест следующего бита, который говорит, что, учитывая все выходные данные до определенной точки, это лишь незначительно легче, чем даже угадать следующий бит. Это не статистический тест, а тест, подразумевающий, что злоумышленник обладает полным знанием алгоритма и способностью его криптоанализа, и все же не может найти лучшего решения, чем грубая сила.
Чтобы показать пример небезопасной CSPRNG, которая вполне может пройти любой статистический тест, но не пройдет проверку следующего бита, представьте себе секретное начальное число. $ С $, безопасная хэш-функция $ Н(х) $, и PRNG, который выводит $ H(S) || Н(Н(S)) || Н(Н(Н(С))) || ... $. Поскольку наша хеш-функция безопасна, ее вывод выглядит случайным, но на самом деле очень легко угадать следующий вывод, зная существующий вывод.
Конечно, вполне возможно создать CSPRNG, который выводит по одному байту за раз. RC4 — это потоковый шифр, который имеет такую конструкцию и использовался как CSPRNG во многих системах, хотя он больше не считается безопасным. Мы вполне могли бы разработать другие CSPRNG, которые были бы безопасными и ориентированными на байты. Однако с практической точки зрения обычно более эффективно работать с большими блоками данных, поэтому такие алгоритмы, как ChaCha20 или NIST DRBG, как правило, используются чаще.
Что касается преимуществ быстрого некриптографического ГПСЧ, то причин для их использования немного. ChaCha20 может выводить данные со скоростью 3 ГБ/с в моей системе и криптографически безопасен. В маловероятном случае этого недостаточно быстро, можно было бы использовать меньшее количество раундов (например, ChaCha12), и производительность была бы выше, но при этом сохраняя криптографическую безопасность. Генерация случайных чисел с помощью подходящего алгоритма почти никогда не является узким местом, поэтому почти во всех случаях достаточно использования CSPRNG, который всегда проходит проверку следующего бита и, следовательно, имеет максимально возможное качество.