オペレーティングシステムは、ハードウェアのエントロピーをシードとする CSPRNG を提供しています。Linux では getrandom(2) と /dev/urandom、macOS と BSD では getentropy と arc4random、Windows では BCryptGenRandom です。各言語の API はこれらをラップしています。ブラウザーの crypto.getRandomValues()(1 回の呼び出しで最大 65,536 バイト)、Node.js の crypto.randomBytes、Python の secrets、Go の crypto/rand、Java の SecureRandom などです。Math.random()、Python の random などの汎用の乱数生成器は予測可能であり、秘密情報の生成に決して使ってはいけません。
NIST SP 800-90A Rev. 1 は承認済みの決定的乱数生成器(Hash_DRBG、HMAC_DRBG、CTR_DRBG)を、SP 800-90B はエントロピー源を、SP 800-90C はそれらの組み合わせ方を規定しており、FIPS 140-3 のモジュールはこれらを使わなければなりません。取り下げられた Dual_EC_DRBG は、バックドアが疑われた乱数生成器の典型例です。
現実の乱数生成器の失敗のほとんどは、アルゴリズムではなくシードの問題です。十分なエントロピーが得られる前に鍵を生成する組み込み機器、同じ状態のまま再開するクローンされた仮想マシン、同じ乱数生成器を共有するフォークされたプロセスなどです。ECDSA は特に影響を受けやすく、予測可能な nonce から鍵が露呈します。決定的な nonce やヘッジ付きの nonce を使えば、この依存関係をなくせます。