暗号学的に安全なPRNG
/dev/urandom、ChaCha20-CSPRNG、Fortunaについて学びます。
「暗号学的に安全なPRNG」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。
CSPRNG要件のまとめ
CSPRNGは、次の要件を満たす必要があります。(1)次ビット予測不可能性:過去のすべてのビットを知っていても、次のビットを 1/2 + negligible より大きい確率で予測できないこと。(2)状態侵害時の拡張耐性:現在の状態を知られても、過去の出力について何も明らかにならないこと。
/dev/urandom と getrandom()
Linux の /dev/urandom は、エントロピープールをシードにした CSPRNG を使用します。初期シード処理(エントロピー 128 ビット)の後は、プールが「空」であっても安全に使用できます。CSPRNG が独自の内部状態を維持するためです。getrandom() は、これに相当する最新のシステムコールです。
ChaCha20 ベースの CSPRNG
Linux カーネル 5.17 以降では、CSPRNG が ChaCha20 ベースの設計に置き換えられました。ChaCha20 は高速で(ハードウェアアクセラレーションが不要)、256 ビットの安全性を提供し、十分に理解された安全性証明があります。ノンスにはカウンターを使用し、鍵はエントロピープールから取得します。
Fortuna
Fortuna(Ferguson と Schneier、2003 年)は、32 個のエントロピープールを維持し、エントロピーを継続的に蓄積する CSPRNG の設計です。プールが満たされると、そこからジェネレーターを再シードします。RNG のリセット攻撃や、状態の一部が漏えいする攻撃に耐性があります。
DUAL_EC_DRBG のバックドア
NIST SP 800-90A には当初、楕円曲線に基づく DUAL_EC_DRBG が含まれていました。スノーデン文書によって、NSA がバックドアを組み込んだことが明らかになりました。楕円曲線上の点が、NSA ならどのシードからでも出力を予測できるように選ばれていたのです。DUAL_EC_DRBG は絶対に使用しないでください。NIST は 2014 年にこれを削除しました。
CTR_DRBG
CTR_DRBG(NIST SP 800-90A)は、カウンターモードの AES を CSPRNG として使用します。シード = 256 ビットの鍵 + 128 ビットのノンスです。呼び出すたびにカウンターが進みます。OpenSSL、BoringSSL、Windows BCrypt で広く実装されています。AES-NI 対応 CPU ではハードウェアアクセラレーションを利用できます。
HASH_DRBG と HMAC_DRBG
HASH_DRBG は、ハッシュ関数(SHA-256)をシード値に対して反復的に使用します。HMAC_DRBG は、混合処理に HMAC を使用します。HMAC_DRBG は正しく実装しやすく、多くの組み込みシステム(mbedTLS、WolfSSL)で使用されています。
再シードとエントロピー注入
CSPRNG であっても、定期的に再シードする必要があります。CTR_DRBG の再シード間隔は 2^48 回のリクエストです。Fortuna はエントロピープールから再シードします。手動で再シードする場合は、起動時と fork() の後に、新しいエントロピー(getrandom で取得したバイト列)を CSPRNG の状態に追加します。
フォークの問題
プロセスが fork すると、親プロセスと子プロセスは同じ CSPRNG の状態を引き継ぐため、同一の出力を生成します。対策として、fork() の直後に getrandom() を呼び出して再シードします。最近のバージョンの OpenSSL では、pthread_atfork() によってこの処理が自動的に行われます。
実践での CSPRNG: Python
import secrets key = secrets.token_bytes(32) # 256-bit key nonce = secrets.token_bytes(12) # 96-bit nonce for AES-GCM pin = secrets.randbelow(10**6) # 6-digit PIN # Never use random module for cryptography
ブラウザーの暗号機能
window.crypto.getRandomValues(typedArray) は、ブラウザーの CSPRNG です。OS のエントロピー源を呼び出します。鍵の生成には WebCrypto API が使用します。セキュリティ目的で Math.random() を使用しないでください。これは暗号学的ではない PRNG であり、システム時刻をシードにしているためです。
確認問題
暗号学的に安全なランダムバイトを生成するには、どの Python モジュールを使用すべきですか。
まとめ
ChaCha20、CTR_DRBG、Fortuna などの CSPRNG は、エントロピーをシードとして予測不能な出力を生成します。DUAL_EC_DRBG、random.random()、Math.random() は避けてください。Python では secrets を、ブラウザーでは window.crypto を使用します。次は、実際のエントロピー障害について学びます。
よくある質問
「暗号学的に安全なPRNG」レッスンは無料ですか?
はい。「暗号学的に安全なPRNG」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。
「暗号学的に安全なPRNG」で何を学びますか?
/dev/urandom、ChaCha20-CSPRNG、Fortunaについて学びます。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cryptology Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「暗号学的に安全なPRNG」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCryptology Academyレッスンでコードを書いて実行できますか?
はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 真の乱数と擬似乱数
- 暗号学的に安全なPRNG
- エントロピー枯渇と脆弱な鍵のバグ
- 鍵、ノンス、IVを安全に生成する