コンピューターが乱数を生成する方法

コンピューターは、暗号化からビデオゲームやギャンブルまで、あらゆるものに対して乱数を生成します。乱数には、「真の」乱数と疑似乱数の2つのカテゴリがあり、その違いは暗号化システムのセキュリティにとって重要です。

コンピューターは、マウスの動きやファンのノイズなど、予測できない外部データを観察し、そこからデータを作成することで、真に乱数を生成できます。これはエントロピーとして知られています。また、アルゴリズムを使用して「疑似乱数」を生成するため、結果はランダムではなくてもランダムに表示されます。

このトピックは最近、より物議を醸すようになり、多くの人々が、Intelの組み込みハードウェア乱数ジェネレータチップが信頼できるかどうかを疑問視しています。なぜそれが信頼できないのかを理解するには、最初に乱数がどのように生成され、それらが何に使用されるのかを理解する必要があります。

乱数の用途

乱数は何千年もの間使用されてきました。コインを投げる場合でも、サイコロを振る場合でも、目標は最終結果をランダムなチャンスに任せることです。コンピューターの乱数ジェネレーターは似ています—それらは予測できないランダムな結果を達成するための試みです。

関連:暗号化とは何ですか、そしてそれはどのように機能しますか?

乱数ジェネレーターは、さまざまな目的に役立ちます。ギャンブルを目的とした乱数の生成や、コンピューターゲームでの予測できない結果の作成などの明らかなアプリケーションは別として、暗号化にはランダム性が重要です。

暗号化には、攻撃者が推測できない数値が必要です。同じ番号を何度も使用することはできません。攻撃者が推測できないように、これらの数値を非常に予測できない方法で生成したいと考えています。これらの乱数は、独自のファイルを暗号化する場合でも、インターネット上のHTTPS Webサイトを使用する場合でも、安全な暗号化に不可欠です。

真の乱数

コンピュータが実際にどのようにして乱数を生成できるのか疑問に思われるかもしれません。この「ランダム性」はどこから来るのでしょうか。それが単なるコンピューターコードである場合、コンピューターが生成する数値を予測できる可能性はありませんか?

通常、コンピューターが生成する乱数は、生成方法に応じて、「真の」乱数と疑似乱数の2つのタイプにグループ化されます。

「真の」乱数を生成するために、コンピューターはコンピューターの外部で発生するある種の物理現象を測定します。たとえば、コンピュータは原子の放射性崩壊を測定できます。量子論によれば、放射性崩壊がいつ起こるかを確実に知る方法はないので、これは本質的に宇宙からの「純粋なランダム性」です。攻撃者は放射性崩壊がいつ発生するかを予測できないため、ランダムな値を知りません。

より日常的な例として、コンピューターは大気ノイズに依存するか、キーボードのキーを押した正確な時間を予測不可能なデータまたはエントロピーのソースとして使用する可能性があります。たとえば、コンピュータは、午後2時からちょうど0.23423523秒後にキーを押したことに気付く場合があります。これらのキーの押下に関連する特定の時間を十分に把握すると、「真の」乱数を生成するために使用できるエントロピーのソースが得られます。あなたは予測可能なマシンではないため、攻撃者はこれらのキーを押した正確な瞬間を推測することはできません。Linux上の/ dev / randomデバイスは、乱数を生成して「ブロック」し、真の乱数を返すのに十分なエントロピーを収集するまで結果を返しません。

疑似乱数

疑似乱数は、「真の」乱数の代替手段です。コンピューターは、シード値とアルゴリズムを使用して、ランダムに見えるが実際には予測可能な数値を生成できます。コンピューターは、環境からランダムなデータを収集しません。

これは、すべての状況で必ずしも悪いことではありません。たとえば、ビデオゲームをプレイしている場合、そのゲームで発生するイベントの原因が「真の」乱数であるか疑似乱数であるかは問題ではありません。一方、暗号化を使用している場合は、攻撃者が推測する可能性のある疑似乱数を使用したくありません。

たとえば、攻撃者が疑似乱数ジェネレータが使用するアルゴリズムとシード値を知っているとします。そして、暗号化アルゴリズムがこのアルゴリズムから疑似乱数を取得し、それを使用して、ランダム性を追加せずに暗号化キーを生成するとします。攻撃者が十分に知っている場合、攻撃者は逆方向に作業し、その場合に暗号化アルゴリズムが選択したはずの疑似乱数を判別して、暗号化を破ることができます。

NSAとIntelのハードウェア乱数ジェネレーター

開発者が物事を簡単にし、安全な乱数を生成できるようにするために、IntelチップにはRdRandと呼ばれるハードウェアベースの乱数ジェネレーターが含まれています。このチップは、プロセッサ上のエントロピーソースを使用し、ソフトウェアが要求したときにソフトウェアに乱数を提供します。

ここでの問題は、乱数ジェネレーターが本質的にブラックボックスであり、その内部で何が起こっているのかわからないことです。 RdRandにNSAバックドアが含まれている場合、政府は、その乱数ジェネレーターによって提供されたデータのみで生成された暗号化キーを解読できます。

これは深刻な懸念です。 2013年12月、FreeBSDの開発者は、RdRandをランダム性のソースとして直接使用するためのサポートを削除し、信頼できないと述べました。 [ソース] RdRandデバイスの出力は、エントロピーを追加する別のアルゴリズムに送られ、乱数ジェネレーターのバックドアが問題にならないようにします。 Linuxはすでにこのように機能しており、RdRandからのランダムデータをさらにランダム化して、バックドアがあったとしても予測できないようにしました。 [出典] Redditに関する最近のAMA(“ Ask Me Anything”)で、IntelCEOのBrianKrzanichはこれらの懸念についての質問に答えませんでした。 [ソース]

もちろん、これはおそらくIntelチップの問題だけではありません。FreeBSDの開発者たちは、Viaのチップを名前で呼びました。この論争は、真にランダムで予測不可能な乱数を生成することがなぜそれほど重要であるかを示しています。

「真の」乱数を生成するために、乱数ジェネレーターは「エントロピー」、つまり周囲の物理的な世界から一見ランダムなデータを収集します。していないランダムな番号については、本当にランダムである必要があり、彼らはただアルゴリズムとシード値を使用することができます。

画像クレジット:Flickrのrekre89、FlickrのLisa Brewster、FlickrのRyan Somma、Flickrのhuangjiahui