CSPRNG — детерминированный генератор для криптографического применения. Псевдослучайность не означает слабость: важна стойкость к противнику при заявленных предположениях. Алгоритм, источник энтропии и использующий выход код оцениваются отдельно.
RFC 4086 отличает криптографически сильные последовательности от обычных генераторов для моделирования. Знание части выхода не должно позволять угадать остальное. Одни статистические тесты этого не доказывают; предсказуемый seed может обесценить даже сложно выглядящий выход. [RFC 4086 — Cryptographically strong sequences]
NIST SP 800-90A Rev. 1 определяет Hash_DRBG, HMAC_DRBG и CTR_DRBG. Название CSPRNG не сертифицирует каждую реализацию. Нужно установить механизм, параметры и получение энтропии, а не только название хеш-функции. [NIST SP 800-90A Rev. 1 — DRBG mechanisms and compromise resistance]
Backtracking resistance защищает прошлые выходы после раскрытия текущего состояния. Prediction resistance относится к будущим; NIST SP 800-90A связывает её с эффективным добавлением свежей энтропии. Одно свойство не означает автоматически другое или восстановление лишь следующим вызовом. [NIST SP 800-90A Rev. 1 — DRBG mechanisms and compromise resistance]
OpenSSL 3.5 указывает для RAND_bytes() и RAND_priv_bytes() 1 при успехе, 0 при другой ошибке и -1 для неподдерживаемого метода. Сбой источника энтропии может остановить генерацию. Приложение должно проверять результат, а не использовать непроверенный буфер. [OpenSSL 3.5 — RAND_bytes return values and errors]
libsodium randombytes_buf_deterministic() выдаёт одинаковую последовательность для одинакового seed, например для тестов. Восстановление снимка виртуальной машины может повторить состояние и выход. Воспроизводимость тестов не гарантирует независимых секретов между копиями. [libsodium — Random data and deterministic testing]
libsodium randombytes_uniform() выбирает равномерно ниже верхней границы без смещения от простого остатка деления. Хорошие входные байты не гарантируют правильного отображения в целевой диапазон. Ключи также должны соответствовать правилам своего алгоритма. [libsodium — Random data and deterministic testing]
RFC 8439 требует не повторять nonce с одним ключом; случайный вид не доказывает уникальности. RFC 6979, напротив, описывает детерминированное создание значения k для подписи. Поэтому CSPRNG не заменяет правила протокола универсальным образом. [RFC 8439 — Nonce uniqueness] [RFC 6979 — Deterministic signing]
Зафиксируйте версию библиотеки, механизм, инициализацию, ошибки и поведение после восстановления или клонирования состояния. OpenSSL и libsodium описывают конкретные функции, не безопасность любого кошелька. Хорошая генерация также не предотвращает последующую утечку резервной копии. [OpenSSL 3.5 — RAND_bytes return values and errors] [libsodium — Random data and deterministic testing]
Для полной картины прочитайте эту статью вместе с Cryptographic Entropy, Random Number Generator, Deterministic RNG, Seed Generation. На эту статью также ссылаются Dice Roll Entropy, Cryptographic Entropy, Random Number Generator, Deterministic RNG.