擬似乱数と真の乱数はどのように異なるのですか?なぜ重要なのですか?


665

私はこれをまったく持っていません。サイコロを転がす小さな言語のプログラムを書くと言うだけです(例としてサイコロを使用します)。600,000のロールの後、各数字は約100,000回ロールされていたはずです。

「真のランダム性」専用のWebサイトがあるのはなぜですか?確かに、上記の観察を考えると、任意の数を取得する可能性は、どれだけ多くの数を選択できるかよりもほぼ正確に1です。

Pythonで試してみました:これが6,000万回のロールの結果です。最も高い変動は0.15のようなものです。それは手に入れるほどランダムではありませんか?

1 - 9997653 2347.0
2 - 9997789 2211.0
3 - 9996853 3147.0
4 - 10006533 -6533.0
5 - 10002774 -2774.0
6 - 9998398 1602.0

1
上のWikipediaの記事を見てみましょうハードウェア生成された乱数を -また、この参照stats.stackexchange.com/questions/32794/...
steadyfish

21
「サイコロを振る」とはどういう意味ですか?ロボットアームとカメラが接続されていますか?
スターブルー14

3
私はあなたの口調の一般的な要点に同意しますが、私たちはしばしばこれについてあまりにも心配していますが、実際には悪用されています:en.wikipedia.org/wiki/Ronald_Dale_Harris
Grady Player 14

3
重要な理由については、真のランダム性を欠くオンラインポーカーゲームについてのこの記事を参照してください。
バラキレックス14

1
0〜5のカウンターを保持し、それに応じてサイコロを666ゴーリオン回振ると、均等に分配されます。
jcora 14

回答:


1384

コンピューターポーカーをプレイしましょう。あなたと私と私たちが信頼するサーバーだけです。サーバーは、プレイする直前に32ビットシードで初期化される擬似乱数ジェネレーターを使用します。約40億のデッキがあります。

私の手には5枚のカードがあります。どうやらテキサスホールデムをプレイしていないようです。カードが私に1枚、あなたに1枚、私に1枚、あなたに1枚、というように配られているとします。だから、デッキには1枚目、3枚目、5枚目、7枚目、9枚目のカードがあります。

先ほど、シードごとに1回、疑似乱数ジェネレーターを40億回実行し、それぞれに対して生成された最初のカードをデータベースに書き留めました。私の最初のカードがスペードの女王だとします。これは、これらの可能なデッキの52枚に1枚の最初のカードとしてのみ表示されるため、40億枚から約8,000万枚程度にデッキを削減しました。

私の2番目のカードが3つのハートであるとします。今、私は最初の数としてスペードの女王を生成する8000万の種子を使用して、RNGをさらに8000万回実行します。これには数秒かかります。私は3枚目のカード、つまり私の2枚目のカードとして、3つのハートを生み出すすべてのデッキを書き留めます。これもデッキの約2%に過ぎないため、現在では200万デッキになりました。

私の手札の3枚目のカードが7枚のクラブだとします。2枚のカードを配る200万のシードのデータベースがあります。RNGをさらに200万回実行して、3枚目のカードとして7枚のクラブを生産するデッキの2%を見つけました。たった4万枚のデッキです。

これがどうなるかわかります。RNG 40000をさらに実行して、4番目のカードを生成するすべてのシードを見つけ、800デッキまで下げ、さらに800回実行して、5番目のカードを生成する〜20シードを取得します。 20枚のカードデッキを生成すると、20の可能なハンドの1つを持っていることがわかります。さらに、次に描画するものについて非常に良いアイデアを持っています。

真のランダム性が重要である理由がわかりましたか?あなたがそれを説明する方法で、あなたは分配が重要であると思いますが、分配はプロセスをランダムにするものではありません。 予測不能性はプロセスをランダムにするものです。

更新

(非構造的な性質のため削除された)コメントに基づいて、これを読んだ人の少なくとも0.3%が私の点に関して混乱しています。人々は私が作った、または悪化していないポイントに反論すると、主張のために私がポイントでした私はそれをしなかったことを前提に行い、その後、私はより明確にし、慎重に説明する必要があることを知っています。

単語の分布については特に混乱しているようですので、用法を注意深く呼び出したいと思います。

手元にある質問は次のとおりです。

  • 擬似乱数と真の乱数の違いは何ですか?
  • なぜ違いが重要なのですか?
  • 違いはPRNGの出力の分布に関係していますか?

ポーカーをプレイするためのカードのランダムなデッキを生成する完璧な方法を検討することから始めましょう。次に、デッキを生成する他の手法がどのように異なるか、そしてその違いを利用できるかどうかを確認します。

まず、というラベルの付いた魔法の箱があると仮定してみましょうTRNG。入力として1以上の整数nを指定し、出力として1からnまでの真の乱数を指定します。ボックスの出力は完全に予測不可能であり(1以外の数を指定した場合)、1からnまでの任意の数は別の数と同じ可能性があります。つまり、分布均一であるということです。(実行できるランダム性のより高度な統計チェックがあります。この点は私の議論と密接な関係がないため、この点は無視しています。TRNGは仮定により完全に統計的にランダムです。)

シャッフルされていないカードのデッキから始めます。ボックスに1〜52の数字を入力しますTRNG(52)。つまり、。それが返す数字が何であれ、ソートされたデッキからその数のカードを数えて、そのカードを取り除きます。シャッフルされたデッキの最初のカードになります。次にTRNG(51)、2番目のカードを選択するために同様の操作を行います。

別の見方をすると、52個あります。= 52 x 51 x 50 ... x 2 x 1可能なデッキ、これはおよそ2 226です。そのうちの1つを本当にランダムに選択しました。

次にカードを配ります。私が自分のカードを見たとき、どんなカードを持っているのか全く分かりません。(あなたが私が持っているカードを持っていないという明らかな事実は別として。)それらは同じ確率でどんなカードでもありえます。

それで、これを明確に説明するようにします。の個々の出力は一様に分布していTRNG(n)ます。それぞれが確率1 / nで1からnまでの数を選びます。また、このプロセスの結果、52の1つが選択されました!1/52の確率で可能なデッキ!そう分布可能デッキのセット上であるにも均一。

大丈夫。

ここで、のラベルが付いた魔法の箱が少ないと仮定しますPRNG。使用する前に、32ビットの符号なし数値をシードする必要があります。

サイド:なぜ32?64ビット、256ビット、または10000ビットの数値をシードできませんでしたか?承知しました。しかし、(1)実際にはほとんどの市販のPRNGには32ビットの数値がシードされます。(2)シードを作成するために10000ビットのランダム性がある場合、PRNGを使用する理由は何ですか?すでに10000ビットのランダム性のソースがあります!

とにかく、PRNGの仕組みに戻りますTRNG。シード後は、使用方法と同じ方法で使用できます。つまり、数値nを渡すと、1〜nの数値が返されます。さらに、その出力の分布はほぼ均一です。つまり、PRNG1から6の間の数を要求すると、シードが何であったかに関係なく、およそ1/6の時間でそれぞれ1、2、3、4、5、または6が得られます。

この点をいくつか強調したいのは、それが特定のコメント者を混乱させているようだからです。PRNGの分布は、少なくとも2つの点で均一です。最初に、特定のシードを選択するとします。PRNG(6), PRNG(6), PRNG(6)...数百万回のシーケンスにより、1〜6の数の一様分布が生成されると予想されます。2つ目は、100万の異なるシードを選択し、各シードに対して1 PRNG(6) 呼び出され場合、1から6. これらの操作のいずれかでのPRNGの均一性は、私が説明している攻撃とは関係ありません

ボックスの動作は実際には完全に決定的であるため、このプロセスは擬似ランダムと呼ばれます。シードに基づいて、2 32の可能な動作の1つから選択します。つまり、シードされると、均一な分布を持つ一連の数値がPRNG(6), PRNG(6), PRNG(6), ... 生成されますが、その順序はシードによって完全に決定されます。PRNG(52)、PRNG(51)などの指定された一連の呼び出しでは、2 32の可能なシーケンスしかありません。シードは、基本的にどちらを取得するかを選択します。

デッキを生成するために、サーバーはシードを生成するようになりました。(どのように?その点に戻ります。)その後、彼らはを呼び出してPRNG(52)PRNG(51)前と同様にデッキを生成します。

このシステムは、私が説明した攻撃を受けやすい。サーバーを攻撃するには、まず事前にボックスの独自のコピーに0をシードし、それを求めPRNG(52)て書き留めます。次に、1で再シードし、を要求しPRNG(52)、それを2 32 -1 まで書き留めます。

現在、PRNGを使用してデッキを生成しているポーカーサーバーは、何らかの方法でシードを生成する必要があります。彼らがどのようにそうするかは問題ではありません。彼らはTRNG(2^32)真にランダムな種を得るために呼び出すことができます。または、現在の時刻をシードとして使用することもできますが、これはほとんどランダムではありません。私はあなたと同じくらいの時間を知っています。私の攻撃のポイントは、データベースを持っているので、それは重要ではないということです。最初のカードを見たときに、可能性のある種の98%を除去できます。2枚目のカードを見ると、98%以上を除去できます。その後、最終的には少数の可能なシードに到達し、手に何があるかを高い確率で知ることができます。

繰り返しになりますが、ここでの仮定は、100万回呼び出しPRNG(6)た場合、おおよそ6分の1の時間で各番号が取得されるということです。その分布は(多かれ少なかれ)均一であり、その分布の均一性が気になるなら、それで問題ありません。質問のポイントは、私たちが気にしPRNG(6)ているものの分布以外のものがあるということでしたか?そして答えはイエスです。予測不能性にも注意を払っています。

問題を見る別の方法は、PRNGが2 32の可能な動作から選択しているだけPRNG(6)ので、 100万の呼び出しの分配は問題ないかもしれませんが、すべての可能なデッキを生成することはできません。2 226の可能なデッキのうち 2 32のみを生成できます。ほんの少し。そのため、すべてのデッキのセットでの分布は非常に悪いです。しかし、繰り返しますが、ここでの基本的な攻撃は、出力の小さなサンプルから過去および将来の動作を正常に予測できることに基づいています。 PRNG

これが確実に収まるように、これを3回または4回言ってみましょう。ここには3つのディストリビューションがあります。まず、ランダムな32ビットシードを生成するプロセスの分布。それは完全にランダムで、予測不可能で均一であり、攻撃は引き続き機能します。第二に、への百万の呼び出しの分布PRNG(6)。これは完全に均一であり、攻撃は引き続き機能します。第三に、私が説明した擬似ランダムプロセスによって選択されたデッキの分布。その分布は非常に貧弱です。IRLの可能なデッキのごく一部しか選択できない可能性があります。攻撃はその出力の部分的な知識に基づく PRNGの振舞いの予測可能性によります

ASIDE:この攻撃では、攻撃者がPRNGで使用されている正確なアルゴリズムを知っているか、推測できる必要があります。それが現実的かどうかは未解決の問題です。ただし、セキュリティシステムを設計する場合、攻撃者がプログラム内のすべてのアルゴリズムを知っている場合でも、攻撃に対して安全であるように設計する必要があります。別の言い方をすれば、システムを保護するために秘密にしておく必要があるセキュリティシステムの部分は「キー」と呼ばれます。システムのセキュリティが、秘密であるアルゴリズムに依存している場合、キーにはそれらのアルゴリズムが含まれています。それは非常に弱い立場にあります!

続けて。

では、というラベルの付いた3番目のマジックボックスがあるとしCPRNGます。これはの暗号強度バージョンですPRNG。32ビットシードではなく256ビットシードを使用します。PRNGシードが2 256の可能な動作のいずれかから選択するプロパティと共有します。また、他のマシンと同様に、CPRNG(n)1からnの間で結果の均一な分布を生成するために多数の呼び出しを行うという特性があります。それぞれが1 / nの時間で発生します。それに対して攻撃を実行できますか?

元の攻撃では、シードからに2 32個のマッピングを保存する必要がありPRNG(52)ます。しかし、2 256ははるかに大きい数です。CPRNG(52)何度も実行して結果を保存することは完全に実行不可能です。

しかし、種子の事実を推測し、そこから価値を引き出す他の方法があると仮定しCPRNG(52)ますか?私たちはこれまでかなり愚かで、可能な組み合わせすべてを強引に強制していました。魔法の箱の中を見て、その仕組みを理解し、出力に基づいてシードに関する事実を推測できますか?

いいえ詳細を説明するにはあまりにも複雑であるが、推測しないように実行不可能であるようにCPRNGsを巧みに設計されているすべての最初の出力からのシードについての有用な事実をCPRNG(52)かから任意の出力のサブセットどんなに大

では、サーバーがCPRNGデッキの生成に使用していると仮定しましょう。256ビットのシードが必要です。それはどのようにその種を選ぶのですか?攻撃者が予測できる値を選択すると、突然攻撃が再び実行可能になります。2 256の可能なシードのうち、サーバーによって選択される可能性が高いのは40億のみであると判断できれば、ビジネスに戻ります。発生する可能性のある少数のシードにのみ注意を払って、この攻撃を再度実行できます。

したがって、サーバーは256ビットの数値が均一に分散されるようにする必要があります。つまり、可能性のある各シードは1/2 256の確率で選択されます。基本的に、サーバーはTRNG(2^256)-1のシードを生成するために呼び出す必要がありますCPRNG

サーバーをハックし、それを覗いて、どのシードが選択されたかを確認できるとしたらどうでしょうか その場合、攻撃者はCPRNGの完全な過去と未来を知っています。サーバーの作成者は、この攻撃から保護する必要があります!(もちろん、この攻撃を成功させることができれば、おそらく銀行口座に直接送金することもできるので、それはおそらく面白くないかもしれません。真にランダムな256ビットの数値は推測するのがかなり困難です。)

多層防御に関する以前のポイントに戻ります。256ビットシードは、このセキュリティシステムのです。CPRNGの考え方は、キーが安全である限りシステムが安全であることです。アルゴリズムに関する他のすべての事実がわかっていても、キーを秘密にしておけば、相手のカードは予測できません。

シードは秘密であり、均一に分散されている必要があります。そうでない場合、攻撃を仕掛けることができます。の出力分布CPRNG(n)は均一であると仮定しています。考えられるすべてのデッキのセットでの配布についてはどうですか?

あなたは言うかもしれません:CPRNGによって出力される2 256の可能なシーケンスがありますが、2 226の可能なデッキしかありません。したがって、デッキよりも多くの可能なシーケンスがあるので、大丈夫です。このシステムでは、すべての可能なIRLデッキが(高い確率で)可能になりました。そしてそれは良い議論です...

2 226は52!の近似値にすぎません。それを分割します。2 256/52!おそらく52であるため、整数にすることはできません。3で割り切れますが、2の累乗はありません!これは整数ではないので、すべてのデッキが可能な状況になっていますが、あるデッキは他のデッキよりもありそうです

それが明確でない場合は、数字が小さい状況を検討してください。A、B、Cの3枚のカードがあるとします。8ビットのシードでPRNGを使用すると、256のシードが考えられます。PRNG(3)シードに応じて256の可能な出力があります。256は3で割り切れないため、3分の1をA、3分の1をB、3分の1をCにする方法はありません。

同様に、52は2 256に均等に分割されないため、最初のカードとして選択されたカードに偏りがあり、他のカードから偏りがあります。

32ビットシードを使用した元のシステムでは、大きな偏りがあり、可能なデッキの大部分は作成されませんでした。このシステムでは、すべてのデッキを作成できますが、デッキの配布にはまだ欠陥があります。一部のデッキは、他のデッキよりもわずかに高い可能性があります。

質問は次のとおりです。この欠陥に基づいた攻撃はありますか?答えは実際にあり、おそらくそうではありません。そのようCPRNGsに設計されている種子が真にランダムであれば、その後、違い教えて計算上不可能であるCPRNGとをTRNG

OK、だから要約しましょう。

擬似乱数と真の乱数の違いは何ですか?

それらは、それらが示す予測可能性のレベルが異なります。

  • 真の乱数は予測できません。
  • シードを決定または推測できる場合、すべての擬似乱数は予測可能です。

なぜ違いが重要なのですか?

システムのセキュリティが予測不可能性に依存しているアプリケーションがあるためです。

  • TRNGを使用して各カードを選択すると、システムは攻撃されません。
  • CPRNGを使用して各カードを選択する場合、シードが予測不能で不明な場合、システムは安全です。
  • シードスペースが小さい通常のPRNGが使用される場合、シードが予測不能か不明かに関わらず、システムは安全ではありません。十分に小さいシードスペースは、私が説明した種類のブルートフォース攻撃を受けやすくなります。

この違いは、PRNGの出力の分布に関係していますか?

配布またはその欠如の均一個々のコールにはRNG(n)、私が説明してきた攻撃には関係ありません。

これまで見てきたように、可能性のあるすべてのデッキの中から個々のデッキを選択する確率の分布は、a PRNGとの両方でCPRNG劣っています。PRNGかなり悪いですが、両方は問題を抱えています。

もう1つの質問:

TRNGがCPRNGよりもはるかに優れており、さらにCPRNGがPRNGよりもはるかに優れている場合、なぜCPRNGまたはPRNGを使用するのですか?

2つの理由。

最初:費用。TRNGは高価です。真に乱数を生成することは困難です。CPRNG は、シードに対してTRNGを1回呼び出すだけで、任意の多くの呼び出しに対して良好な結果を提供します。マイナス面はもちろん、その種を秘密にしておかなければならないことです。

第二に、予測可能性が必要な場合がありますが、私たちが気にするのは良い分布だけです。テストスイートのプログラム入力として「ランダムな」データを生成していて、バグが表示されている場合、テストスイートを再度実行するとバグが再び生成されると便利です。

これでもっと明確になることを願っています。

最後に、これを楽しんだ場合は、ランダム性と順列の問題についてさらに読むことができます。


20
はい、男の子と女の子。現時点ではこれで十分です。これについてさらに議論したい場合は、チャットルームkthnxbyeを手に入れてください!
イヴォFlipse

1
@Ericしかし、新しいデッキを引く前にシードはリセットされませんよね?したがって、サンプリングしている軌跡が比較的少ないことは正しいですが、現時点で軌跡のどこにいて、軌跡が交差しているかは正確にはわかりません。
AS


関連する問題の適切な(ただし密な)扱いは、KnuthのTAOCP vol 2、セクション3.5「ランダムシーケンスとは」(p。149)にあります。疑似ランダムシーケンスについては、3.5.F(p。170)で説明しています。複雑性理論ドイツのBSIからの疑似ランダム性の基準も参照してください。
シュリーバツァー

160

Eric Lippertが言っているように、それは単なる配布ではありません。ランダム性を測定する方法は他にもあります。

初期の乱数ジェネレーターの1つは、最下位ビットにシーケンスがあります-0と1を交互に使用しました。したがって、LSBは100%予測可能でした。しかし、それ以上のことを心配する必要があります。各ビットは予測不能でなければなりません。

問題について考える良い方法がここにあります。64ビットのランダム性を生成しているとしましょう。結果ごとに、最初の32ビット(A)と最後の32ビット(B)を取得し、配列x [A、B]へのインデックスを作成します。テストを100万回実行し、結果ごとに、その数で配列をインクリメントします。つまり、X [A、B] ++;

次に、2Dダイアグラムを描画します。数値が大きいほど、その位置のピクセルは明るくなります。

それが本当にランダムな場合、色は均一なグレーでなければなりません。しかし、パターンを取得する場合があります。たとえば、Windows NTシステムのTCPシーケンス番号の「ランダム性」の図をご覧ください。

Windows NT

または、Windows 98からのこれも:

Windows 98

そして、これがCiscoルーター(IOS)実装のランダム性です。 シスコISO

これらの図は、MichałZalewskiの論文の好意によるものです。この特定のケースでは、システムのTCPシーケンス番号を予測できる場合、別のシステムに接続するときにそのシステムになりすますことができます。これにより、接続のハイジャック、通信の傍受などが可能になります。次の数値を100%予測することはできません。新しい接続を制御下で作成できる場合、成功の可能性を高めることができます。また、コンピューターが数秒で100,000の接続を生成できる場合、攻撃が成功する確率は天文学から可能または可能性が高くなります。


30
これはとても素晴らしいので、私の目に涙を浮かべます。すべてのOS(モバイル/デスクトップ/サーバー)およびプラットフォーム(JVM / Javascript /など)に対してこれらを作成するアプリが必要です。
HDave

5
Windowsのrand()関数は非常に優れています!明らかなパターンのないクラウドを生成します。それを試すために私の実装を参照してください(および他のアルゴリズム):github.com/Zalastax/visualize_random
Zalastax

93

コンピューターによって生成される擬似乱数は、コンピューターユーザーが遭遇する大部分のユースケースで受け入れられますが、完全に予測不可能な乱数を必要とするシナリオがあります。

暗号化などのセキュリティに敏感なアプリケーションでは、擬似乱数ジェネレーター(PRNG)が値を生成する場合がありますが、外観はランダムですが、実際には攻撃者が予測できます。暗号化システムをクラックしようとする人は、PRNGが使用され、攻撃者がPRNGの状態に関する情報を持っている場合、暗号化キーを推測できる可能性があります。したがって、このようなアプリケーションでは、本当に推測できない値を生成する乱数ジェネレーターが必要です。一部のPRNGは暗号的に安全であるように設計されており、そのようなセキュリティに敏感なアプリケーションに使用できることに注意してください。

RNG攻撃の詳細については、このウィキペディアの記事を参照してください


9
暗号PRNGが存在し、広く使用されています。適度なサイズのシードから、事実上無制限の乱数ストリームを生成できます。そのようなストリームを真の乱数と区別することは計算上実行不可能であるため、このようなストリームのどの部分からも追加情報を取得することはできません。
aaaaaaaaaaaa 14

これを説明する最も簡単な方法は、乱数生成アルゴリズムをプログラムする必要があることだと思います。つまり、従う一連の指示があるということです。一連の指示がある場合、ランダムにすることはできません。
ケルタリ14

6
あなたはエントロピーの要素が欠落している@Keltari ...(少なくとも暗号のもので)ほとんどのRNGは、外部ソース(例えば、マウスの動き)からの入力を収集し、開始条件の一部としてそれを使う-したがって、からの変換Aには、Bプログラムされているが、の初期状態はA(推測すべき)推測不可能です。Linux /dev/randomは、利用可能なエントロピーの量の近似値を保持し、エントロピーが低くなりすぎると数値の提供を停止します。
基本的な14

好奇心から-なぜ溶岩ランプは「本当にランダム」と見なされますか?私はそれがかなり予測不可能な行動を示すことを理解していますが、流体力学をしっかりと把握し、それらの流体が地球の重力環境でどのように相互作用するかは「予測可能な」結果を確実に生み出すことができますか?確かに、溶岩ランプは予測不可能ですが、私にとっては、ランダムではありませんが、非常に予測可能です。
theGreenCabbage 14

1
@theGreenCabbage:溶岩ランプは混oticとしていると思います。十分に優れたコンピューターモデルと十分な桁数の精度があれば、(原則として)しばらくの間、動作を予測できます。しかし、システムは混oticとしているため、初期状態の変化が最も小さい2つの溶岩ランプは、すぐに動作が異なります。(そして、このコメントは
混otic

76

Pythonで試してみました:6,000万回のロールの結果です。最も高い変動は0.15のようなものです。それは手に入れるほどランダムではありませんか?

実際、それはとても「良い」、「悪い」 ...すべての既存の答えは、初期値の小さなシーケンスが与えられた場合の予測可能性に焦点を当てています。別の問題を提起したい:

    あなたの分布は、ランダムなロールよりもはるかに小さい標準偏差を持っているべきです

真のランダム性だけでかなり来ていないという「ほぼ正確に1、それはから選択することができますどのように、これまで多くの数字の上に」あなたは品質の指標として使用していることを平均に近いです。

あなたが見れば、複数のサイコロのロールのための確率分布については、このスタック為替問題、あなたは(純粋にランダムな結果を想定)Nダイスロールの標準偏差の計算式が表示されます:

 sqrt(N * 35.0 / 12.0).

その式を用いて標準偏差のために:

  • 100万ロールは1708です
  • 6,000万ロールは13229

結果を見ると:

  • 100万ロール:stddev(1000066、999666、1001523、999452、999294、999999)は804です
  • 6,000万ロール:stddev(9997653、9997789、9996853、10006533、10002774、9998398)は3827です

有限サンプルの標準偏差が式と完全に一致するとは期待できませんが、かなり近い値になるはずです。しかし、100万のロールでは、適切なstddevの半分以下であり、6000万では3分の1未満です-悪化しつつあり、それは偶然ではありません。

疑似RNGは、シードから始まり、特定の期間元の数値を再訪せずに、一連の個別の数値を移動する傾向があります。たとえば、古いCライブラリrand()関数の実装は通常2 ^ 32の期間を持ち、シードを繰り返す前に0から2 ^ 32-1までのすべての数値を1回だけアクセスします。したがって、2 ^ 32のサイコロをシミュレートすると、前モジュラス(%)結果には0から2 ^ 32までの各数値が含まれ、1-6の結果ごとのカウントは715827883または715827882(2 ^ 32は6の倍数ではない)であり、したがって標準偏差は0をわずかに上回っています。上記の式では、2 ^ 32ロールの正しい標準偏差は111924です。とにかく、擬似ランダムロールの数が増えると、標準偏差0に収束します。ロールの数が期間のかなりの部分である場合、この問題は重大であると予想されますが、一部の疑似RNGは他よりも悪い問題、またはサンプルが少ない場合でも問題を示す場合があります。

そのため、暗号化の脆弱性を気にしなくても、一部のアプリケーションでは、結果が過度に人工的に均一にならない分布を気にする場合があります。いくつかの種類のシミュレーションは、個々のランダムな結果の大きなサンプルで自然に発生する不均一な結果の結果をうまく処理しようとしていますが、一部のpRNGの結果では不十分です。巨大な人口が何らかのイベントにどのように反応するかをシミュレートしようとしている場合、この問題は結果を根本的に変えて、非常に不正確な結論に導く可能性があります。


具体例を挙げましょう:数学者がポーカーマシンプログラマーに、6,000万回のシミュレートされたロールの後、数学者が期待する10,013,229以上の6があった場合、画面の周りに何百もの小さな「ライト」を点滅させると言います平均から1 stddev、少額の支払いがあるはずです。68–95–99.7ルール(ウィキペディア)によれば、これは時間の約16%で発生するはずです(〜68 は標準偏差内に収まりますが、上半分は外にあります)。乱数ジェネレーターの場合、これは平均を上回る標準偏差の約3.5から得られます。確率が0.025%未満 -このメリットを享受できる顧客はほとんどいません。具体的には、前述のページの高偏差の表をご覧ください。

| Range    | In range   | Outside range | Approx. freq. for daily event  |
| µ ± 1σ   | 0.68268... | 1 in 3        | Twice a week                   |
| µ ± 3.5σ | 0.99953... | 1 in 2149     | Every six years                |

ここでリンゴとオレンジを比較しています。2つの標準偏差は、互いにまったく関係ありません。
Jbeuh

50

ダイスロールを生成するためにこの乱数ジェネレーターを作成しました

def get_generator():
  next = 1
  def generator():
    next += 1
    if next > 6:
      next = 1
    return next
  return generator

このように使用します

>> generator = get_generator()
>> generator()
1
>> generator()
2
>> generator()
3
>> generator()
4
>> generator()
5
>> generator()
6
>> generator()
1

などサイコロゲームを実行するプログラムにこのジェネレーターを使用してもよろしいですか?その分布は、「真にランダムな」ジェネレーターに期待するとおりです。

擬似乱数ジェネレーターは本質的に同じことを行います-正しい分布で予測可能な数値を生成します。これらは、上記の単純な乱数ジェネレーターが悪いのと同じ理由で悪いです。正しい分布だけでなく、真の予測不可能性が必要な状況には適していません。


2
「擬似乱数生成器...正しい分布で予測可能な数を生成する」-それがPRNGであるからといって、それが完全な分布を保証するわけではありません(実際、商業的なものは、一般的に、これらの回答に記載されている理由)。十分な情報(使用されているアルゴリズム、開始シード、出力値、w / e)を考えると予測可能ですが、まだ分散があります。
ブライアンS 14

3
ポイントのほかに、私は知っているが、get_generator = lambda: itertools.cycle(range(1,7))generator = get_generator()next(generator) # and so on:)言及しないようにあまりにもエレガントです
ヤヌスTroelsen

2
@BrianS実際には、時間の経過とともに配布テストに失敗したPRNGは、定義により予測可能です。そのため、いくつかの大きなNで、NコインフリップでN / 2のヘッドから少しでも手に入れば、ヘッドにベットを開始でき、負けるよりも勝つことができます。同様に、ヘッドとテールの完全な分配を得たが、ヘッドが常にペアで来た場合、再び勝つためのレシピがあります。配布テストは、PRNGが良いことを知る方法です。
ジョンキパルスキー14

1
忘れてたnonlocal next:-)。
コス14

5
さらに良い例:Piは正常であると考えられています。つまり、任意のベースで指定された長さの数字のシーケンスは、そのベースでその長さの他のシーケンスよりも頻繁に表示されません。n個のランダムビットを要求されたときに、piの次のnビットを取得して返すアルゴリズム(「シード」は開始ビットです)は、長期的には完全に均等な分布を生成するはずです。しかし、あなたはまだあなたのジェネレータにそれを望んでいません-あなたが生成したビットの最後の束を知っている人は、シーケンスが最初に発生したときを見つけ、シードがそこにあると仮定し、おそらく正しいかもしれません。
cpast

26

コンピューターが実行できる乱数生成は、ほとんどのニーズに適しており、真に乱数が必要な時期に出くわすことはほとんどありません。

ただし、真の乱数生成には目的があります。コンピュータセキュリティ、ギャンブル、大規模な統計サンプリングなど。

乱数の適用に興味がある場合は、ウィキペディアの記事をご覧ください


12
大きな問題は、攻撃者がセキュリティ上の理由で予測できない乱数が必要な場合です。
デビッドシュワルツ14

16
本当にランダムな数字が必要な時が来るでしょう。それはで始まるWebページを開くには十分だhttps://...
ジャン・ヒューデック

3
@JanHudec:さて、日常使用では、プログラムを開いた瞬間、アドレスバーに入力するかなり前に、安全な乱数が必要になります。アドレススペースレイアウトのランダム化を参照してください。このようなことが起こるのはそのためです
リード14

5
@JanHudec私は、オンラインの乱数ジェネレーターを使用する必要があるという意味で具体的に話していました。真の乱数は頻繁に使用されますが、実際に自分で生成する必要がある人はほとんどいません。
アレックスマッケンジー14

2
スロットマシンもTRNGではなくPRNGを使用します。ジェネレータは常に実行され、スピンボタンが押された正確な時間に数字が選択されます。PRNGと真にランダムなボタンの押下時間の合計は、TRNGになります。
ロジャーダー14

26

ほとんどのプログラミング言語の典型的な関数によって生成される乱数は、純粋に乱数ではありません。それらは擬似乱数です。それらは純粋に乱数ではないので、以前に生成された数に関する十分な情報で推測できます。それで、これは暗号のセキュリティにとって災害になるでしょう。

たとえば、以下で使用される次の乱数ジェネレーター関数は、glibc純粋な乱数を生成しません。これにより生成される擬似乱数は推測できます。これはセキュリティ問題の失態です。これが悲惨になる歴史があります。これは暗号化では使用しないでください。

glibc random():
    r[i] ← ( r[i-3] + r[i-31] )  % (2^32)
    output  r[i] >> 1

このタイプの疑似乱数ジェネレーターは、統計的には非常に重要ですが、セキュリティに敏感な場所では決して使用しないでください。

擬似ランダムキーに対する有名な攻撃の1つは、802.11b WEPに対する攻撃です。WEPには104ビットの長期キーがあり、24ビットIV(カウンター)と連結されて128ビットキーが作成され、これがRC4アルゴリズムに適用されて擬似ランダムキーが生成されます。

( RC4( IV + Key ) ) XOR (message)

キーは互いに密接に関連していました。ここでは、IVのみが各ステップで1増加し、他のすべては同じままでした。これは純粋にランダムではなかったため、破滅的で、簡単に分解されました。キーは、約40000フレームを分析することで回復できますが、これは数分です。WEPが純粋にランダムな24ビットIVを使用した場合、約2 ^ 24(ほぼ1680万)フレームまで安全です。

そのため、可能な場合は、セキュリティに敏感な問題で純粋な乱数ジェネレーターを使用する必要があります。


3
私は、弱い暗号を使用して設計が不適切なプロトコルでWEPを非難しました。最新のストリーム暗号では、IVとしてカウンターを使用できます。
CodesInChaos 14

2
WEPの主な問題は、キーを2 ^ 24(ほぼ1600万)フレームで繰り返すことでした。関連キーを使用するとさらに悪化し、約40000フレームでコードを解読できました。ここでの主要なポイントは、キーがランダムではないということです。密接に関連しているため、簡単にクラックできます。
プラブー14

1
暗号化では、暗号鍵を生成する場合にのみ、疑似乱数性が悪い。それを超えて完全に問題ありません。実際、RC4は、メッセージのプレーンテキストにXORされたキーの128ビット拡張でシードされた疑似乱数ジェネレーターにすぎません。
マット14

12

違いは、疑似乱数が生成される数は、真の乱数が得られないしばらく後に予測可能(繰り返し)になることです。繰り返すのにかかる長さは、その生成に使用されるシードの長さに依存します。

そのトピックに関する非常に素晴らしいビデオがあります:http : //www.youtube.com/watch?v=itaMNuWLzJo


予測可能性!=繰り返し。メルセンヌ・ツイスターはその良い例です。624 Int32以降のほとんどの実装では、次のすべての数値を予測できますが、Mersenne Twisterシーケンスはそれよりはるかに長くなります(2 ^ 19937-1)。
HoLyVieR 14

これが少なくとも部分的には質問に対する正確かつ簡潔な答えであるように思えるので、なぜこの答えがスタックに押し上げられないのか理解できません。擬似乱数は、いくつかのドロー後に簡単に予測できます。ドローの数は、擬似ランダムアルゴリズムの「品質」によって異なります。「良い」アルゴリズムの選択は、アスペクトに注目しています。1。すべての値は同じ頻度(分布)で描画されます。同じ順序。

「真の乱数は[予測不可能]」です。今日ではこれは事実です。ビッグバン理論を信じており、物理学に基づいてBB後の任意の時点で宇宙の状態を計算する多くの力がある場合、...この非常に正確なコメントを書いています。右?

それは仮説的には事実ですが、実際の身体の実際の動作に含まれるエントロピーの広大な程度を考慮すると、必要な計算能力は途方もなく巨大になります。コンピューターで覆われた大陸を考えてください。プラス、理由は以前の状態への依存のため、時間内にすべての点で、宇宙のすべての体の状態は完全に記憶装置で満たされ、定義によって宇宙に利用可能であるよりも多くのスペースを必要と思われる、保存する必要があるだろう
TheEnvironmentalist

@TheEnvironmentalist-ああ!「コンピューターで覆われた大陸」...「銀河へのヒッチハイクガイド」のすべてではありませんか?;-)
ysap 14

10

擬似乱数は、生成される前に誰でも推測できると仮定します。

あなたの例のように、ささいなアプリケーションの場合、擬似ランダム性は問題ありません、あなたはいくつかの小さな変動(あなたがサイコロを転がすことになっていたかどうかを見るだろう)回);

ただし、コンピューターのセキュリティなどに関しては、真のランダム性が必要です。

たとえば、RSAアルゴリズムは、コンピューターが2つの乱数(PとQ)を選択し、それらの数字に対していくつかの手順を実行して、公開キーと秘密キーとして知られる特別な数字を生成することから始まります。(秘密鍵の重要な部分は、それが秘密であり、誰もそれを知らないということです!)

攻撃者が、コンピューターが選択する2つの「ランダムな」数字を知ることができれば、同じ手順を実行して秘密鍵(他の誰も知らないはずの鍵)を計算できます。

攻撃者はあなたの秘密鍵を使って、a)あなたになりすまして銀行に話しかける、b)あなたの「安全な」インターネットトラフィックを聞き、それを解読できる、c)あなたとインターネット上の他の関係者の間のマスカレード。

真のランダム性(つまり、推測/計算できないこと)が必要なのは、そのためです。


10

私が今までに使用した最初の乱数は、2つの連続した乱数の優れた特性を持ち、2番目の乱数は0.6の確率で大きくなりました。0.5ではありません。そして、3番目は確率0.6で2番目よりも大きくなりました。それがシミュレーションで大混乱をどのように演じるか想像できます。

乱数が均等に分散されていることでこれが可能だとさえ信じられない人もいますが、シーケンス(1、3、5、2、4、1、3、5、2、4、 ...)ここで、2つの数値のうち2番目の数値は確率0.6で大きくなります。

一方、シミュレーションでは、乱数を再現できることが重要です。あなたが交通シミュレーションを行い、あなたが取るかもしれないいくつかの行動が交通を改善することができる方法を見つけたいとしましょう。その場合、トラフィックを改善しようとするさまざまなアクションで、まったく同じトラフィックデータ(町に入ろうとする人など)を再作成できるようにしたいと考えています。


8

簡単な答えは、通常、人々は悪い理由で「真のランダム性」を必要とする、つまり暗号を理解していないということです。

ストリーム暗号CSPRNGなどの暗号化プリミティブを使用して、予測不可能な数ビットが供給されると予測不可能なビットの巨大なストリームを生成します。

注意深い読者は、ここでブートストラップの問題があることに気付くでしょう。すべてを開始するには、エントロピーを少し収集する必要があります。次に、それらをCSPRNGにフィードして、必要なすべての予測不能なビットを喜んで提供します。したがって、CSPRNGをシードするにはハードウェアRNGが必要です。これは、エントロピーが実際に必要とされる唯一のケースです。

(これはセキュリティまたは暗号化に投稿されるべきだったと思います。)

編集:最後に、想定されたタスクに十分な乱数ジェネレーターを選択する必要があります。乱数生成に関する限り、ハードウェアは必ずしも良いとは限りません。悪いPRNGと同様に、ハードウェアランダムソースには通常バイアスがあります。

編集:一部の人々は、攻撃者がCSPRNGの内部状態を読み取ることができる脅威モデルを想定しており、そこからCSPRNGは安全なソリューションではないという結論に至ります。これは、不十分なスレッドモデリングの例です。攻撃者がシステムを所有している場合、ゲームオーバー、単純明快です。この時点でTRNGを使用してもCSPRNGを使用しても、違いはありません。

編集:だから、これをすべてまとめると... CSPRNGをシードするにはエントロピーが必要です。これが完了すると、CSPRNGは、(通常)エントロピーを収集できるよりもはるかに高速に、セキュリティアプリケーションに必要な予測不可能なビットをすべて提供します。シミュレーションのように予測不能性が必要でない場合、メルセンヌツイスターはより高いレートで良好な統計特性を持つ数値を提供します。

編集:安全な乱数生成の問題を理解したい人は誰でもこれを読むべきです:http : //www.cigital.com/whitepapers/dl/The_Importance_of_Reliable_Randomness.pdf


2
必ずしもセキュリティ上の質問ではありません。セキュリティを伴わない真の乱数を使用する理由があると思います。乱数に依存する科学的な研究を行っていて、何らかの理由で数値が可能な限りランダムであることが重要であった場合、ハードウェアRNGを確実に利用して、観測されたプロパティが原因ではないことを確信できますRNGの癖に。
ケフシェクター

3
@KefSchecter彼らが聞いたハードウェアPRNGには、一般に、偏った出力や相関した出力があります。統一された独立した出力に変換するには、後処理ステップが必要です。この後処理手順が最新のストリーム暗号よりも信頼できると信じる理由はありません。私は確かにストリーム暗号をもっと信頼するでしょう。追加のボーナスとして、それは再現可能であり、科学において価値があります。
CodesInChaos 14

OK、結構です。しかし、暗号化アプリケーションにも同じことが当てはまりませんか?ここでのgievnの答えでさえ、CSPRNGをシードするにはハードウェアRNGが必要だと言っています。
ケフシェクター14

2
@KefSchecterはい、暗号化アプリケーションはCSPRNGをシードするために真の乱数を必要とします。しかし、他のすべての場合、そのCSPRNGを使用できます。
CodesInChaos 14

@KefSchecter:暗号化アプリケーションでは、ストリームが世界中で再現可能でないことが必要です。対照的に、科学的な用途では、使用している「ランダムな」数字が単に良い分析で分析を示すために選ばれたのではないことを示すことができることは役に立ちます。たとえば、メソッドをアナウンスした後、翌日の州の宝くじ番号を使用して特定の方法でデータを生成することを発表した場合、読者は、平日の図面に数十個しかなかったとしても、結果をごまかしていないとある程度確信することができますエントロピーのビット。
supercat 14

7

すべてのPRNGがすべての用途に適しているわけではありません。たとえば、Java.util.SecureRandomは、160ビットの出力サイズを持つSHA1ハッシュを使用します。それは、そこから来ることができる乱数の2 160の可能なストリームがあることを意味します。そのような単純な。内部状態の2 160を超える値を取得することはできません。したがって 、シードがどこから来たとしても、1つのシードから2 160個を超える乱数の一意のストリームを取得することはできません。Windows CryptGenRandomは40バイトの状態を使用すると考えられており、2 320の乱数ストリームがあります。

標準の52カードデッキをシャッフルする方法の数は52!で、約2 226です。したがって、シードに関係なく、Java.util.SecureRandomを使用してカードのデッキをシャッフルすることはできません。生成できないシャッフルは約2 66あります。もちろん、彼らがどれであるかはわかりません...

したがって、たとえば256ビットの真のランダム性のソースがある場合(たとえば、Quantis RNGカードから)、CryptGenRandom()などのPRNGにそのシードをシードし、PRNGを使用してデッキをシャッフルすることができますカード。シャッフルごとに真のランダム性で再シードすると、これは問題ありません。予測不可能で、統計的にランダムです。Java.util.SecureRandomで同じことを行った場合、256ビットのエントロピーをシードできないため、生成できないシャッフルがあり、その内部状態はすべての可能なシャッフルを表すことができません。

java.util.SecureRandomの結果は予測不可能であり、統計的にランダムであることに注意してください。問題を特定する統計的検定はありません!しかし、RNGの出力は、カードのデッキをシミュレートするために必要なすべての可能な出力の完全な領域をカバーするのに十分な大きさではありません。

ジョーカーを追加すると、54になります。あなたがカバーしなければならないこと、それは約2 238の可能性を必要とします。


2
シャッフルができないことをどうして気にしますか?この制限には、目に見える効果はありません。
CodesInChaos 14

2
私はこの質問にちょっと腹を立てています。厳しく規制されているゲーム会社の場合、このようなバイアスは、カードゲームで勝つチャンスがコンピューターの場合と紙のデッキの場合では異なることを数学的に証明します。チャンスが良いか悪いかは関係ありません。彼らは異なっています。コンピューターは、実際のデッキと道徳的に同等ではありません。さらに、違いを特徴付けることができません。厳しい規制罰金に直面しているゲーム会社は大いに気にかけるでしょう。
パコ・ホープ

1
しかし、それは検出可能です。ソースコードのレビューと問題ドメインの知識という既知のプロセスを使用して検出します。それは驚くべきことです。自動統計分析を使用できません。java.util.RandomまたはMersenne Twisterを使用している人と同じように検出できます。統計分析は、RNG /問題ドメインの不一致の唯一の有効な検出メカニズムではありません。その検出器を通過する失敗は、定義により、成功ではありません。
パコホープ14

1
私はその声明に決して異議を唱えませんでした。私が言ったことは、統計分析は、RNG / PRNGが正しいという確実な証拠ではないということです。これは、偽陰性の例です。正しくないはずですが、統計出力テストは合格です。SHA1(1)、SHA1(2)、SHA1(3)... SHA1(n)を統計テストにも合格する「RNG」として使用する場合。それも間違っています。正解の定義は、「統計的テストに合格」の定義を超えています。統計テストに合格する必要がありますが、十分ではありません。
パコ・ホープ

4
@CodesInChaos:「可能な大部分のIRLシャッフルが生成されないという事実を利用できる攻撃については知らない」という議論は、そのような攻撃が不可能であることを意味するものではありません。それが何であるか、またはそれに対してどのように防御するかを知りません。その場合の正しい姿勢は、条件を排除することで攻撃の可能性を排除することです。実際にすべての可能なデッキを生成できる十分な品質のRNGを作成します。
エリックリッパー14

6

擬似乱数は、数学関数と初期値(シードと呼ばれる)を使用して生成されますが、乱数は生成されません。予測可能性により、シードとプレイヤーの入力を保存するだけでよいため、ゲームのリプレイに非常に役立ちます。AIは毎回まったく同じ「ランダム」な方法で応答します。


6

「真の」乱数と「疑似」乱数の違いは予測可能性です。この回答はすでに提供されています。

ただし、ほとんどの例が示すように、予測可能性は必ずしも悪いことではありません。以下は、予測可能性が良好なまれなケースの1つであるグローバルポジショニングシステムの実用的な例です。

各衛星は、信号伝搬時間の測定に必要な自動相関または相互相関に適した個別のPRNコード(ゴールドコード)を使用します。これらのゴールドコードでは、相互の相関が特に弱いため、衛星の明確な識別が可能になりますが、放射シーケンスと受信機との相関による距離計算が可能になります。


2

ランダム性を迅速にチェックするには、[0; 1)のランダム座標を持つポイントを取得し、k次元キューブに配置します。次に、このキューブをサブキューブにスライスする手順を実行します。サブキューブ(またはサブスフィア)の各ボリュームは、この手順で、よく知られた定理による変動を使用して正しく測定する必要があります。

偶然性の質はあなたが出会う場所で重要です...

  1. セキュリティ目的。キー生成のパラメーターとして使用する数値を生成すると、予測可能性が高くなります-敵は100%の確率でそれを見つけ出し、検索フィールドをより小さくします。

  2. 科学目的。科学では、平均状態が良好であるだけでなく、さまざまな乱数間の相関を排除する必要があります。したがって、(a_i-a)(a_ {i + 1} -a)を取得し、その分布を見つけた場合、統計に対応する必要があります。

ペア相関は、いわゆる「弱いランダム性」です。実際のランダム性が必要な場合は、2つ以上の分散を持つ高次相関が必要です。

今日、量子力学ジェネレータのみが真のランダム性を提供します。


1

真のランダム性が重要なのはなぜですか?

基本的に、真のランダム性が必要な主な理由は2つあります。

  1. 暗号化にRNGを使用している場合(リアルマネーギャンブルや宝くじの実行など)、PRNGを使用すると、数学的分析(TRNGを想定)が信じられないほど暗号が弱くなります。PRNGは実際にはランダムではありませんが、パターンがあります-敵はパターンを悪用して、解読できないはずの暗号を解読できます。
  2. RNGを使用して、たとえばバグテストやシミュレーションなどの「ランダムな」入力をシミュレートしている場合、PRNGはアプローチを弱くします。バグが発見されない場合、そのしつこい疑念が常にあります。PRNGのパターンでは目立たないが、TRNGのみを使用した場合に現れるバグはありますか?私のシミュレーションの発見は現実を正確に説明していますか、それとも私が発見した現象は単にPRNGのパターンのアーティファクトですか?

これらの領域以外では、それは実際には重要ではありません。警告:PRNGが非常に悪い場合、まだ不適切な可能性があります。サイコロが常に出てくるクラップスゲームを作りたくない場合、プレイヤーはそれを好まないでしょう。

PythonのPRNGはどうして十分ではないのですか?

このような単純な方法論を使用して、実際のP​​RNGの落とし穴を検出できることはほとんどありません。RNGの統計分析は、それ自体が科学の分野であり、アルゴリズムの「ランダム性」をベンチマークするために、いくつかの非常に高度なテストを利用できます。これらは、単純な試みよりもはるかに高度です。

Python開発者など、実際のライブラリを作成するすべてのソフトウェア開発者は、これらの統計テストを尺度として使用して、PRNGの実装が十分かどうかを確認します。したがって、実際の開発者による監視の場合を除き、実際のP​​RNGのパターンを簡単に検出できる可能性はほとんどありません。それはパターンがないことを意味するものではありません-PRNGには定義上パターンがあります。


0

基本的に、出力の数学的分析によってソースがランダムであることを証明することはできません。たとえば、ソースがランダムであると言う物理モデルが必要です(放射性崩壊のように)。

バッチテストを実行するだけで、出力データの統計的相関を見つけることができます。その場合、データは非ランダムであることが証明されます(ただし、ランダムソースは非ランダム出力を持つことができます。出力)。それ以外の場合、テストに合格すると、データは擬似ランダムであると言えます。

いくつかのランダム性テストに合格するということは、優れたPRNG(疑似乱数ジェネレーター)があることを意味します。これは、セキュリティが関係しないアプリケーションに役立ちます。

セキュリティが関係する場合(つまり、暗号化、キーソルトの生成、ギャンブル用の乱数生成など)、追加の品質が必要な良いPRNGを用意するだけでは不十分です。たとえば、前の出力から関数出力が簡単に推測されない、関数には、望ましい計算コスト(使用可能に制限されていますが、ブルートフォース試行を無効にするのに十分な高さ)、関数を実行するハードウェア、または今日の奇妙なケースではアナログデバイスであるデバイスが必要です簡単に改ざんされるなど

優れたPRNGを持つことは、ゲームで新しい予測不可能なパターンを作成するのに役立ちます。また、暗号化では、単一の投稿で説明するのは面倒すぎます。以前の暗号化されたデータを次の暗号化されたデータに関連付けるか、プレーンテキストデータを暗号化されたデータに関連付けるか、2つの異なる暗号文を互いに関連付けることができます(したがって、プレーンテキストで推測を行うことができます)....


-5

ショートストーリー:

システムの現在のマイクロ秒を使用して、ランダムシードを生成します。

このトリックはかなり古く、まだ機能しています。

フォースブルートファクターを除くと、すべての可能な数で「ベット」することですべての組み合わせを決定できます。特に、使用前にほとんどの乱数が丸められる場合、この質問のポイントではありません。

例として、10個の値のみを使用して、使用するシードを決定できます。ですから、種を知っていれば、次の値を推測できます。

seed = 1を使用する場合、次のシーケンスを取得できます。

1、2、3、4、5、6、7、8、9 ...(シードがid 1と次の値10を使用したことを差し引きます)

しかし、送信を「n番目」の値ごとに変更するとどうなりますか?現在のマイクロ秒単位でシードを変更することは安価なトリックです(つまり、多くのCPUサイクルを必要としません)。

したがって、シーケンスは次のようになります:(seed = 1)1、2、3、4、5、(seed = 2)、7、9、11、13 ...(15?)

この場合:

a)どのシードが使用されたかを推測することはできません。

b)エルゴ、次の値は推測できません。

c)私ができる唯一の推測は、次のシードがメジャー番号になる可能性があることを差し引くことです。

とにかく、ほとんどの最新のランダムジェネレーターアルゴリズムは、既にこのトリックを内部で使用しています。

本当の事実は、「真の」乱数を作成するために量子コンピューターを必要とせず、コンピューターの水晶振動子の不正確さがランダムジェネレーターとして機能し、CPUのランダム効率も考慮せずに可変であるということです。通常、CPUは複数のタスクを同時に実行します。


2
これはかなり悪い考えであり、非常に予測不可能なシーケンスを必要とするものの脆弱性の原因です。マイクロ秒をとると、シードの可能性は10 ^ 6しかなく、かなり低いです。
HoLyVieR 14

@HoLyVieR:セキュリティに関心があるなら、それは確かに悪い考えですが、気づくほど悪くはありません:通常、システムの開始(またはUNIXエポック...)からマイクロ秒を使用し、可能な値の範囲を大幅に増やします。
mikera 14

1
@mikeraそれはましではありません。リクエストが処理された時間は予測可能です。これは、多数のパスワードリセット機能に対する脆弱性のベクトルです。それらのスクリプトはあなたのテクニックで「ランダム」トークンを生成し、攻撃者は実行された時間を見つけることはかなり簡単であるため、生成されたトークンを見つけることができます...それはパスワードリセットのリクエストが+ -150ミリ秒送信されたのと同じです。
HoLyVieR 14

確かに、その状況は非常に悪いです。しかし、システムの起動時に状態がシードされ、攻撃者起動時間を推測する良い方法を持っていない状況は、それほど悪くはありません。簡単に選択できる10 ^ 12個のマイクロソコンがあり、これにより一部のタイプの攻撃が実行不能になる可能性があります。明確にするために、これらのソリューションはすべて暗号化の観点からはかなり悪いですが、定数は重要です。
mikera 14

オンラインサーバーの場合、システムのアップタイム情報が公開される場合があります。または、ステータスページ「Incidents。Server up up。」から取得できます。または、pingを実行し、大きなダウンタイムを待って、マシンの再起動である可能性があることを確認できます(これにより、チェックに数億の時間がかかりますが、かなり短いです)。
デレクソン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.