Random Number Generator выдаёт значения для определённой цели. Криптографическое применение требует, чтобы противник практически не мог их предсказать при указанных предположениях. Физический источник энтропии, детерминированный генератор и интерфейс операционной системы — разные уровни; само название RNG не определяет их свойства.
Источник энтропии даёт неопределённость, обработка подготавливает вход, а детерминированный генератор формирует выход из внутреннего состояния. NIST SP 800-90C объединяет механизмы 90A с источниками по 90B. Поэтому каждый выданный бит необязательно соответствует новому физическому измерению. [NIST SP 800-90C — RBG constructions]
Последовательность может пройти статистические тесты и при этом быть известной атакующему. RFC 4086 предостерегает от часов, серийных номеров и предсказуемых начальных значений. Название или распределение результатов генератора для моделирования сами по себе не делают его подходящим для криптографии. [RFC 4086 — Unpredictability and weak inputs]
NIST SP 800-90B оценивает источник шума, обработку и проверки работоспособности при запуске и во время работы. Они выявляют неисправности источника, но не доказывают безопасность всего кошелька. Обработка отказов входит в проектирование: результат неисправного тракта нельзя молча выдавать за проверенную случайность. [NIST SP 800-90B — Source health and failure handling]
Linux getrandom() обычно ждёт инициализации источника urandom. С GRND_NONBLOCK вместо ожидания может вернуть EAGAIN. После инициализации запросы urandom до 256 байтов гарантируют полное чтение без прерывания сигналом; для больших запросов гарантии нет. Приложение должно учитывать возвращаемый статус. [Linux getrandom(2) — Initialization and return behavior]
Web Crypto getRandomValues() заполняет поддерживаемые целочисленные массивы криптографически стойкими значениями; объём свыше 65536 байтов вызывает QuotaExceededError. Для создания ключей спецификация рекомендует generateKey(). Наличие интерфейса не подтверждает надёжность страницы и не защищает секреты от кода, имеющего к ним доступ. [W3C Web Crypto — getRandomValues and key generation]
BIP39 сначала кодирует от 128 до 256 бит начальной энтропии с производной контрольной суммой. Затем из слов и необязательной passphrase через PBKDF2 выводит 512-битовый seed. Ни контрольная сумма, ни более длинный результат не исправляют предсказуемый вход; самостоятельный выбор слов не заменяет случайную генерацию. [BIP39 — Initial entropy and mnemonic-to-seed derivation]
Детерминированному генератору нужны защищённое состояние и правильная инициализация. NIST SP 800-90A различает создание экземпляра, генерацию, повторное засевание и удаление экземпляра. Восстановление после раскрытия состояния требует подходящего механизма и свежей энтропии, неизвестной атакующему; один следующий вызов в общем случае этого не гарантирует. [NIST SP 800-90A Rev. 1 — DRBG lifecycle and reseeding]
Проверка должна установить источник, алгоритм, инициализацию, интерфейс и поведение при ошибке в оцениваемой версии. Обозначения аппаратный или офлайн сами не подтверждают эту цепочку. Приведённые стандарты объясняют требования к генерации; они не сертифицируют конкретный кошелёк и не предотвращают последующую утечку его резервной копии. [NIST SP 800-90C — RBG constructions] [RFC 4086 — Unpredictability and weak inputs]
Для полной картины прочитайте эту статью вместе с Cryptographic Entropy, CSPRNG, Seed Generation, Brute Force Search Space. На эту статью также ссылаются CSPRNG, Deterministic RNG, True Random Number Generator, Seed Generation.