数値ジェネレーターが実際にランダムではないことをどのようにして検出できますか?


20

コンピューターでの乱数生成は実際にはランダムではないと聞いたが、それを検出する効率的なアルゴリズムはない。どうやってそれを検出できますか?


1
この投稿はあなたを助けるかもしれません。
アントン

6
物足りなさを感じる危険性があるので、出力を調べるだけであれば、特定のソースがランダムではないと確実に言うことはできません。あなたは公正なコインを反転することができます行で時間をし、頭を毎回取得し、上の尾を得ることのあなたのチャンス10の100 + 1番目のトスはまだ50%です。ソースを調べることにより、通常、非ランダムなもの(たとえば、疑似乱数ジェネレーター...シードとアルゴリズムからシーケンスを予測できます)を識別できます。ランダム性の多くの見かけ上の原因は、確実に予測するには十分に理解されていない場合があります。しかし、これは哲学的です。1010010100+1
Patrick87

@ Patrick87「確実性」で数学的に意味する場合、それは本当です。ただし、統計的検定があり、それにより任意の有意性が得られます(データが「良好」である場合)。
ラファエル

@ Patrick87平凡に聞こえる危険性があります...あなたは「あなたは、フェアコインを100回ひっくり返し、毎回頭を得ることができます」と言います...いいえ、私はできません。10 3個の頭を並べて見ることができても、それが公正なコインだと信じているモデルは、現実をあまりよく捉えていません。しかし、これは確かに哲学的です。;-)10100103
ドンハッチ

回答:


15

本当にランダムなコンピューター:

理論的な意味では、チューリングマシンにとって真のランダム性は不可能であり、ほとんどのコンピューターは真にランダムな出力を生成できません。したがって、一部の最新のコンピューターには、コンピューターが外部ソースにアクセスできるようにするハードウェアが含まれています。これを実現する方法の1つの例は、コンピューター内部の温度の小さな変動を追跡することです。ランダム性は、外部ソースからも取得できます。しかし、あなたの投稿の口調から、ランダム性の外部ソースがあなたが興味を持っているものだとは思いません。

種:

外部からの追加がなければ、コンピューターが行うことはすべて確定的です。これは大きな問題につながります。乱数生成プログラムを呼び出すと、同じ入力を与えると毎回同じ結果が得られます。明らかに、実行するたびに振る舞いを変えるために乱数を出力するプログラムが必要です(そうでなければ、同じ「乱数」を取得し続けますが、これは特に役に立ちません)。1つのアイデアは、プログラムに入力を与えることです。これは、プログラムが実行されるたびに変化するため、異なる数が出力されます。この入力を「シード」と呼びます。乱数ジェネレーターは、シードを取得し、いくつかの操作を実行し、乱数を提供する必要があります。

現在のシステム時刻は、シードの典型的な例です。これにより、高いエントロピーを持つ長い文字列が得られ、時間が十分にきめ細かく追跡されている場合(つまり、システムクロックが時間を使用している場合、「時間」はかなり悪いシードです)、擬似乱数を供給することはほとんどありません同じ番号を2回生成します。

十分にランダムなアルゴリズム:

これで、実行するたびに異なる方法を少なくとも持つアルゴリズムができました。それにシードを与え、同じシードでプロンプトが出されたときにアルゴリズムが同じ番号を与えるのに対して、それ以外の場合は生成する番号がランダムになるようにします。これは上記のように動作します-入力を受け取り、出力を生成します(入力と「ランダム」になるのに十分なほどうまくいけば)。

ここで、これを行うための独自のアルゴリズムを思いついたとしましょう。さまざまなシードを与えたとき、思いついた数字はランダムに近いと主張します。それがどれほど良いかをどのようにテストしますか?

ここで、シードを取得し、いくつかの操作を行い、乱数を生成するアルゴリズムが必要です。最も単純な場合、アルゴリズムはシードを出力するだけです。毎回同じ数を与えるわけではなく、ランダムシードはランダムな出力を与えます。しかし、明らかにそれは私たちが望んでいるものではありません。一方、アルゴリズムは、多くの実際の疑似ランダムジェネレーターのように、かなり複雑になる可能性があります。どのアルゴリズムが不必要にランダムなシードから「ランダムな」数値を提供するかをどのように確認できますか?正確に取得できない場合、どれが最良かをどのように判断できますか?

1n

攻撃者をだますのに十分なランダム:

今あなたが言及しているのは、暗号学的に安全な擬似乱数ジェネレータです。これを説明する最良の方法は、上記のコンテキストであると思います-ここでは、暗号化にランダム性を使用しているため、テストを設計するとき、私たちが本当に気にするのは、誰かが破ることができないことです選んだ乱数を予測することでセキュリティを確保します。あなたの暗号技術の習熟度はわかりませんが、単純な置換暗号を実行していると想像してください。各文字は他の文字に置き換えられます。これらの置換をランダムに選択するため、攻撃者が推測するのは困難です。しかし、彼が私の乱数ジェネレーターがどのように機能するかを理解できれば、彼は暗号全体を解くことができるでしょう!したがって、暗号化アルゴリズムには、特に推測が難しい乱数ジェネレータが必要です。

このため、CSPRGは、他のアルゴリズムがどれだけうまく解決するかという観点で定義されています(最終的に質問に答えます)。具体的には、Rと呼ぶCSPRGがあるとします。Rは、次に出力するビットを推測できる実行可能なアルゴリズムがない場合にのみCSPRGです。これは、出力する前のビットをすべて知っていても当てはまります!

したがって、CSPRGが出力する最初の5ビットは10100だとしましょう。プログラムに使用した入力はわかりませんが、CSPRGの作成に使用したコードにはアクセスできます。そして、次のビット出力が101000か101001かを決定するプログラムを書くことは不可能だという主張です。

そのため、暗号化の理由から、擬似乱数ジェネレーターの性能は、他のプログラムに対してどの程度予測可能かという観点から定義される場合があります。これはまだ「ランダム性」の直感の多くを与えていることに注意してください。ランダム出力のすべてが奇数であることがわかっている場合、暗号的に安全ではなく、常識的なランダム性テストにも合格しません。


7
これは全体的には良い(ただし不完全な)回答ですが、いくつかの点が間違っています。「コンピュータが行うことはすべて決定論的であるため、真のランダム性は不可能です。」必ずしもそうとは限りません。一部のプロセッサにはハードウェアRNGが含まれています。コンピューターは、ランダムな外部入力にも反応します。「...暗号化のため、分布に関してどのように「ランダム」であるかはあまり気にしません」:実際には、CBCのIVやDSAのkパラメーターなど、暗号化では均一な分布が重要な場合があります。
ジル「SO-悪であるのをやめる」

彼は「外部からの追加がなければ、コンピューターが行うことはすべて決定論的です」と書いています。外部からの追加は、言及したようにRNGなどのデバイスへの参照です。これらの追加がない場合、計算能力は、真のランダム性が不可能なTMの計算能力と同等です。
ケントムンテキャスパーセン14年

正しく思い出せば、Gillesのコメントの後に追加しました。
SamM 14年

4

最近、MIT CSAIL Theory of Computation Groupブログで計算のランダム性に関する素晴らしい投稿を見つけました。ビットがランダムかどうかわかりますか?

投稿は、Avi Wigdersonの 計算におけるランダム性のパワーと制限、ランダム化アルゴリズムの美しい領域の調査、および疑似ランダム性と計算の難易度の驚くべき関係に関する素晴らしい話から抽出されたいくつかのアイデアから始まります。

次に、量子暗号に関する最近の結果をまとめます。特に、特定の種類のデバイスの出力が真にランダムかどうかを効率的にテストする方法(ランダム拡張プロトコル)。

たとえば、Umesh Vazirani、Thomas Vidick、Certifiable Quantum Dice(または、テスト可能な指数ランダム展開)の最近の研究を参照してください。

要約: 一対の量子力学デバイスを使用して、O(log n)均一ビットのシードから真のランダム性のnビットを生成するプロトコルを紹介します。生成されたビットは、ユーザーが実行できる単純な統計テストと、デバイスが無信号の原則に従うという仮定に基づいて、証明可能なほどランダムです。デバイスの内部動作には他の仮定はありません。


3

あなたが統計的ランダム性について話していると仮定すると-暗号には他のニーズがあります!- 一連の数値が特定の分布に適合するかどうかを検出できる適合度テストが多数あります。これらを使用して、(擬似)乱数ジェネレーターが正常かどうかをテストできます(テストの品質と選択した重要度まで)。

ダイハードテストスイートはさまざまな方法を組み合わせています。


0

これは、コンピューターサイエンスにおける広範で複雑なトピックであり、SamMによる他の回答では、この問題に対処しています。あなたの特定の質問は、コンピューターがPRNGと呼ばれるもの、つまり擬似乱数ジェネレーターを持っているかどうかについてのようです。どうすればそれを検出できますか?

簡単な答えは、自明でないPRNGは、アルゴリズムを検出(派生)できないように構築されているということです。一般に、PRNGが「セキュア」と呼ばれるものである場合、攻撃者が擬似ランダムシーケンスの生成に使用されるアルゴリズムを知っていても、シーケンスの生成に使用される特定のパラメーターを推測できません。このように、擬似ランダム性は暗号化と多くの深い結びつきがあり、暗号化アルゴリズムを「破壊」できるのとほぼ同じ方法でPRNGを「破壊」することについて話すことができます。この分野には多くの研究論文があり、暗号学の最前線にある活発な分野です。

線形合同ジェネレータ」などの「自明な」PRNGの場合、攻撃者が生成に使用するアルゴリズムを知っていて、「bignums」で生成されない場合、検索スペースは「比較的小さく」、攻撃者は理論的にパラメータを見つけることもできます特定のPRNGが基本的にブルートフォースによって使用し、すべての組み合わせを試行します。

PRNGは、それらに対して統計的ランダム性テストの大規模なスイートを実行することにより、実際には(「セキュリティ」に応じて)破壊される場合があります。例えば、これはプログラム「Dieharder」(ブラウン作)の理論的根拠です。NISTスイートもあります

PRNGを壊すの固有の難しさ/硬さはまだ厳密に理論的に証明されていませんが、基本的には「落とし戸」またはと呼ばれるものに関連している「一方向関数」を一方向に効率的に計算が、反転に「ハード」ですすることができます(逆) 。暗号には、ランダム性の硬度に関する未解決の問題がいくつかあります。これらの質問は、複雑なクラスの分離、たとえば有名なP =?NP質問に密接に関連しています。

PRNGの破壊に関する質問は、シーケンスを生成できる最小のチューリングマシンを研究するKolmogorovの複雑性にも関連しています。PRNGを破ることは、擬似ランダムシーケンスを計算するための「最短」プログラムを見つけることと密接に関連しています。また、コルモゴロフの複雑さは一般的に計算することはできません。

Gillesがコメントで指摘しているように、量子ノイズに関連するような物理的な電子プロセスから構築されたハードウェアベースのRNGが存在します。正しく設計されていれば、これらは壊れません。


「非自明なPRNGは、そのアルゴリズムを検出(派生)できないように構築されています」-私はそうは思いません。実際、次の文はそれと矛盾します。これを修正するために回答を編集しますか?
DW

より正確に肉付けすることはできますが、従わない場合、あなたの具体的な異議は何ですか?ポイントは、シーケンスを生成しているアルゴリズムは、ブルートフォースによる場合を除き、データのシーケンスのみから決定することはできず、アルゴリズムが安全であり、その場合ブルートフォースが成功する可能性は低いということです。
vzn 14年

1
私の特定の異論は、文が私にとって間違っているように聞こえるということです:あなたがPRNGは彼らの出力を観察する誰かがアルゴリズムが何であるかを推測できないように設計されていると言っているように聞こえますが、それは物事が実際にどのように機能するかではありません。ほとんどのPRNGは、誰かがアルゴリズムを学習するのを妨げるようには構築されていません。通常、アルゴリズムはパブリックです。おそらく、PRNGは、出力を真のランダムビットと区別できないように構築されているということですか?
DW

1
「アルゴリズムが安全である場合、ブルートフォースによる場合を除き、データシーケンスのみからシーケンスを生成しているアルゴリズムを決定することはできません」-これも正しくありません。このアルゴリズムは、一般的に公開されています。非公開であるのはシードのみであり、出力から導出するのが難しいと想定されるのはシードのみです。
DW

-1

実際、古典的なコンピューターが行うことはすべて決定論的です。つまり、いくつかのタスクを与えると、決定論的な方法でそれらに従うという意味です。したがって、1つの乱数が必要な場合は、時間に応じて(ユーザーの入力時間に基づいて)計算できますが、乱数のセットが必要な場合は、次の数字に時間を使用できません。数値は独立しなくなります。

人々が行うことは、シードを持つ疑似乱数ジェネレーター、つまり、疑似乱数ジェネレーターのすべての数値を計算するために使用される数値を使用することです(シミュレーションやその他のタスクのより洗練されたケースでは、より多くのシードが必要になる場合があります、複数の独立した乱数のセットが必要な場合)。シードは通常、再現可能な結果が必要な場合は0または特定の数値であり、再現できない結果が必要な場合は時間です。

擬似乱数ジェネレータが十分に優れているという事実は、効率的に計算され、実際の乱数のように動作するために、「擬似乱数生成の基本的な特性」に従うという事実にあります。

  • 生成された数値は均一な分布に従う必要があります(この分布から、他の分布を実現できます)。
  • 生成される数値は統計的に独立している必要があります。
  • シーケンスは再現性があります(この点は、古典的なコンピューターのハードウェアの特性のために課せられ、それが「擬似乱数」と呼ばれる理由です)。
  • シーケンスの周期は十分に大きくなければなりません。
  • 数字の生成は高速でなければなりません。

擬似乱数のシーケンスの各数から、新しい数が計算されます(通常、整数を使用します)。ただし、特定のベースで動作するように準備された擬似乱数ジェネレータのシーケンスには、数を表現するために有限数の利用可能なビットを持つピリオドnがあります(バイナリなど)。このnが十分に大きくなくても深刻な問題がある場合でも、心配する必要はありません。コンピューター科学者は、良いnを得るために、疑似ランダムジェネレーターのシードとその他のパラメーターを適切に選択します。

たとえば、最も古く、最もよく知られている擬似乱数生成アルゴリズムの1つである線形合同法を使用した可能な擬似乱数生成アルゴリズムは、次のように定義できます。

それは、4つの値を有する
:- X_0≥0
- A≥0
- C≥0
- M> X_0、ここで:

x0は初期値、a、c、およびmは定数です。m> a、m> cであり、次の式でシーケンスを生成します。

x_ {i + 1} =(a * x_i + c)MOD m

これらの定数の値は慎重に選択する必要があります。1つの可能性は次のとおりです。

x_ {i + 1} =(1664525 * x_i + 1013904223)MOD 2 ^ 32、参照[1-2]

乱数を生成するためにより洗練された他のアルゴリズムがあり、以前のアルゴリズムの問​​題のいくつかを回避します:[3]

  • 一部のシード状態の予想期間よりも短い(このコンテキストでは、このようなシード状態は「弱い」と呼ばれる場合があります);
  • 大量の生成された数値の分布の均一性の欠如;
  • 連続する値の相関。
  • 出力シーケンスの低次元分布。
  • 特定の値が発生する場所間の距離は、ランダムなシーケンス分布の距離とは異なります。

将来的には、古典的なコンピューターは、実際に乱数を提供して配信できる量子システムに統合される可能性があります。[4]

参考文献:
[1] http://en.wikipedia.org/wiki/linear_congruential_generator
[2] William H.、et al。(1992)。「Fortran 77の数値レシピ:科学計算の技術」(第2版)。ISBN 0-521-43064-X。
[3] http://en.wikipedia.org/wiki/pseudorandom_number_generator
[4] http://www.technologyreview.com/view/418445/first-evidence-that-quantum-processes-generate-truly-random-numbers /


これは本当に質問に答えません。特定のRNGがランダムかどうかを検出するのではなく、乱数を生成する方法を説明します。それでもあなたの説明はやや欠けており、線形合同は「最高のもの」ではありません。ハードウェアRNGは現在存在しているため、量子コンピューティングは不要です。PCに1つ、電話に1つ、クレジットカードに1つさえいる可能性があります。
ジル 'SO-悪であるのをやめる' 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.