コンピューターポーカーをプレイしましょう。あなたと私と私たちが信頼するサーバーだけです。サーバーは、プレイする直前に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の数値が返されます。さらに、その出力の分布はほぼ均一です。つまり、PRNG
1から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回呼び出すだけで、任意の多くの呼び出しに対して良好な結果を提供します。マイナス面はもちろん、その種を秘密にしておかなければならないことです。
第二に、予測可能性が必要な場合がありますが、私たちが気にするのは良い分布だけです。テストスイートのプログラム入力として「ランダムな」データを生成していて、バグが表示されている場合、テストスイートを再度実行するとバグが再び生成されると便利です。
これでもっと明確になることを願っています。
最後に、これを楽しんだ場合は、ランダム性と順列の問題についてさらに読むことができます。