真の乱数はどう生成されるのか:TRNG・PRNG・CSPRNGをわかりやすく解説

A simple 3-step pipeline: Physical Source -> Sensor/Digitizer -> Binary Output.

真の乱数生成は、熱雑音・大気ノイズ・量子崩壊といった物理的なエントロピーを採取し、そのカオス的なアナログ信号をデジタルビットへと変換する仕組みです。アルゴリズムベースの生成器とは異なり、ハードウェア方式は非決定論的な環境変数を測定することで、数学的に予測不可能でパターンのない数列を生み出します。

この技術がどのように動作するのか、どこで失敗しうるのか、そしてユースケースに合った正しい選び方を紹介します。

TRNGの仕組み:物理的なカオスからデジタルビットへ

真乱数生成器(TRNG)——ハードウェア乱数生成器(HRNG)とも呼ばれます——は、数式に従いません。予測不能な物理世界と、厳格なデジタルの論理世界とを橋渡しする装置で、外部のエントロピー源を取り込み、そのアナログ信号をバイナリのストリームへと変換します。

ジョン・フォン・ノイマンは1951年にこう警告しました。「乱数を算術的な方法で作ろうとする者は、もちろん、罪を犯している状態にある。」

代表的な3つのエントロピー源

Source What It Measures Device Example
熱雑音 回路内の電子の動きによる電圧変動 スマートフォンのセキュアエンクレーブ(Apple Aシリーズ、Google Tensor)
大気ノイズ 雷などの自然現象による無線ノイズ 専用RNGサーバー
量子現象 放射性崩壊、真空ゆらぎ ANU Quantum RNG、エンタープライズサーバー

物理的な乱数生成の3ステップパイプライン:Physical Source -> Sensor/Digitizer -> Binary Output。

パイプラインはシンプルです。物理的な源 → センサー/デジタイザー → バイナリ出力。一方の端から生のエントロピーが入り、もう一方の端からきれいな乱数ビットが出てきます。

TRNG vs PRNG:決定論という分水嶺

乱数生成における根本的な分断は、物理エントロピーとアルゴリズム論理のどちらを使うかにあります。

Property TRNG (Hardware) PRNG (Algorithmic) CSPRNG (Hybrid)
Source 物理エントロピー 数式 ハードウェアシード+アルゴリズム
Predictable? いいえ はい(シードが分かれば) 極めて困難
Speed 遅い(ブロッキング) 非常に速い 速い
Reproducible? いいえ はい(同じシード=同じ出力) いいえ
Use case 暗号鍵、セキュリティトークン シミュレーション、ゲーム 本番のセキュリティシステム

PRNGが失敗するとき:Hot Lotto詐欺事件

PRNGはシード値を数式の出発点として使います。出力は乱数らしく見えますが、完全に決定論的です。シードと数式を知っていれば、すべての数を予測できます。

これは理論上の話ではありません。Hot Lotto詐欺事件では、内部犯がマルウェアを仕込み、メンテナンス中にPRNGへ予測可能なシードを使うよう強制することで、1650万ドルのジャックポットを不正に当てていました。

PRNG(決定論的/高速)とTRNG(非決定論的/安全)の明確な比較。

PRNGが適しているケース

実はPRNGのほうが適しているタスクもあります。スピードと再現性が重要な場合です。モンテカルロ・シミュレーションでは、科学者は結果を検証するために同じ数列を何度も再現する必要があります。同じシードを再利用できるためシミュレーションは一貫性を保ちます——これはブロッキングを伴うTRNGにはできないことです。

ハイブリッドの解決策:CSPRNG

最近のシステムの多くは、暗号学的に安全な疑似乱数生成器(CSPRNG)を使っています。これは、少量の真のハードウェアエントロピーを取り込んで高速なアルゴリズムをシードするハイブリッド方式で、TRNGの予測不能性とPRNGのスピードを両立します。

業界標準はNIST SP 800-90Aで、政府や産業用途向けにこれらの生成器がどう設計されるべきかを定めています。

開発者ガイド:どのライブラリを使うべきか

Language Insecure (PRNG) Secure (CSPRNG)
Python random(メルセンヌ・ツイスタ) secrets/dev/urandomから読み出し)
JavaScript Math.random() crypto.getRandomValues()
Go math/rand crypto/rand
Java java.util.Random java.security.SecureRandom

鉄則:セキュリティ関連のあらゆる場面では secretscryptoSecureRandom を使いましょう。randomMath.random() はゲームやシミュレーション専用です。

2026年のコンシューマハードウェアにおけるTRNG

2026年までに、ハードウェアエントロピーはエンタープライズサーバーから日常のデバイスへと普及しました。最近のスマートフォンチップはセキュアエンクレーブ内に専用TRNGを内蔵し、プロセッサから直接熱雑音を採取して、FaceIDやデジタルウォレット、セキュアメッセージング用の暗号鍵を生成しています。

エンタープライズセキュリティにおける最前線は、量子乱数生成です。オーストラリア国立大学などのシステムは、量子の真空ゆらぎから数を生成します。これは将来の量子コンピュータでさえ容易には破れない水準の乱数性です。

ホワイトニング:生のノイズからきれいなデータへ

生のエントロピーが一様であることはほぼありません。温度ドリフトのせいで、熱センサーは0より1をわずかに多く出力することがあります。このバイアスを補正するため、データはホワイトニング(通常はXOR演算か暗号学的ハッシュ)を通され、パターンを平滑化して均一な分布を保証します。

このポスト処理は、認証済みシステムで使われるあらゆるエントロピー源に対し、NIST SP 800-90Bが要求しているステップです。

カオスの採取:簡単な歴史

  • 1927年: L.H.C. Tippettが、国勢調査の記録から手作業で抽出した41,600桁の表を発表しました。
  • 1955年: RAND Corporationが、電子パルス装置を使って A Million Random Digits を発行しました。
  • 2013年: Dual_EC_DRBG事件で、NSAがNIST認証済みの生成器にバックドアを仕込み、SSL接続を解読できる状態にしていたことが発覚しました。この件が業界を「単一障害点のないマルチソース・エントロピーミキシング」へと向かわせました。

結論

真の乱数は、デジタルの信頼の基盤です。予測可能なコードとカオス的な現実とを橋渡しするために、物理的なハードウェアが必要です。スマートフォンの中の熱雑音であれ、サーバールームの量子ゆらぎであれ、疑似乱数からハードウェア検証済みのエントロピーへの移行は、2026年のセキュリティにとって不可欠です。

開発者へ:セキュリティ用途では randomMath.random() ではなく、必ず secrets(Python)か crypto.getRandomValues()(JavaScript)を使いましょう。組織へ:ハードウェアTRNGはもはやオプションではなく、暗号化のための基本要件です。

FAQ

パソコンの内部時計は真の乱数源になりますか?

いいえ。時計は予測可能であり、変化するからこそPRNGのシードとしてよく使われます。しかし攻撃者が数が生成された時刻を大まかに知っていれば、可能性を絞り込めてしまいます。真の乱数には、キー入力の間隔や熱雑音といった非決定論的な事象のタイミングと、それに続く統計的なホワイトニングが必要です。

人間は真に乱数な数列を作れますか?

人間は乱数が苦手です。「1, 1, 1」のような連続は、乱数列では自然に現れるにもかかわらず、私たちはそれを避けようとし、選択肢を切り替えすぎる傾向があります。統計検定はこうしたパターンを簡単に見抜くため、人間の入力はシードとしては許容されても、セキュリティ上重要なタスクには不十分です。

真の乱数性を検証する統計検定には何がありますか?

NIST Statistical Test Suite(STS)がデファクトスタンダードです。そのほか、DieharderテストやAIS 31規格などもあります。これらの検定は、繰り返しパターン、同じビットの長い連続、その他バイアスや予測可能性を示す異常を探し出します。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です