XORを使用して2つ以上の安全性の低い乱数ジェネレータアルゴリズムを組み合わせることで、(たとえば、暗号化の目的で)より安全な乱数ジェネレータを作成することは可能ですか?これが私が話していることの例です:
// Create random numbers using weak algorithms
weak_random1 = WeakRandomAlgorithm1(seed1);
weak_random2 = WeakRandomAlgorithm2(seed2);
...
// Combine the random numbers into something stronger with XOR
stronger_random = weak_random1 XOR weak_random2 ...;
これはまだ行われていないようですので、純粋に情報理論的な観点からの回答を提案します。
X、Yを{0,1} ^ nの2つの確率変数とする。 f(x、y)= x XOR yとする
ここで、H(X、Y)= H(X)+ H(Y | X)= H(Y)+ H(X | Y)であり、情報エントロピーは常に非負であるため、H(X、Y) > = H(X)およびH(X、Y)> = H(Y)。したがって、結合確率変数(X、Y)は、個々の確率変数単独と少なくとも同じくらいのエントロピーを持っています(1つの確率変数が他の確率変数に完全に依存している場合に同等になります)。
ただし、ランダム変数に関数を適用すると、エントロピーが減少します(fが全単射の場合は減少しませんが、これは確かに私たちのケースでは当てはまりません)。したがって、H(f(X、Y))<H( X、Y)。証明は here (質問2)です。
ここで、OPの問題は、H(f(X、Y))をH(X)とH(Y)の両方よりも大きくすることができるかどうかですか?)答えは「はい」です。
Xは(X_1、...、X_n)と、Yは(Y_1、...、Y_n)と表記します。次に、X_1が一定で、残りのビットがp = 0.5のiidベルヌーイであり、Y_1がp = 0.5でXに依存しないベルヌーイであるという極端な場合を考えます。Yの他のビットは一定で、H(X) = n-1、H(Y) = 1、and H(f(X、Y))= n、両方よりも大きいH(X)およびH(Y)。
これはそれほど興味深い答えではないかもしれませんが、OPが要求することには正確に答えると思います。
編集:
OPも考慮している質問は次のとおりです。これを行うと、両方の入力よりも乱数が悪くなる可能性はありますか?答えもイエスです。 p = 0.5のXベルヌーイを考えます。そして、Y = NOT Xです。XとYを組み合わせる前に、H(X) = H(Y) = 1となります。ただし、X XOR Y == 1、so H(f(X、Y))= 0!Oops ...したがって、絶対に恣意的にしないでくださいXOR 2つの乱数で、より良いものを得ることが期待されます。
編集2:
XとYが独立している場合、X XOR Yは少なくともXとYの両方と同じくらいランダムですか?マークは完全に正しいです。答えは「はい」です。
理由は次のとおりです。
まず、任意の2つの確率変数UおよびVについて、H(U)> = H(U | V)があることに注意してください。 UとVが独立している場合、等式が成立します。直感的には、これは、Uがどこにあるかを調べようとしても、Vについて何かを知っていても害はないことを意味します。形式的証明は、H(U)-H(U | V)を常に負ではないKLダイバージェンスに削減します。
これで、上記と同じ表記を使用して、次のようになります。
H(f(X,Y),X) = H(f(X,Y)|X)+H(X) = H(X|f(X,Y))+H(f(X,Y))
任意の固定xであるため、H(f(x、Y))= H(Y)(警告:任意のfには当てはまりませんが、f(x 、y)をx XOR y)とすると、H(f(X、Y)| X)= H(Y)が得られ、これにより次のようになります。
H(X)+H(Y) = H(X|f(X,Y))+H(f(X,Y))
しかし、H(X)> = H(X | f(X、Y))なので、次のようになります。
H(Y)<=H(f(X,Y))
そして対称性によって:
H(X)<=H(f(X,Y))
いいニュースです。悪いニュースは次のとおりです。独立性のテストは、ランダム性のテストよりも難しくないとしても、おそらく簡単ではありません。ですから、それは見た目ほど私たちを助けません。
ところで、SEにここでMathJaxを有効にして、必要なときに本格的な計算を行えるように依頼することについて、誰もがどのように感じていますか?
私はあなたのケースをサポートするためのいくつかの根本的な理論がなければ、この方法で乱数ジェネレータを組み合わせることをお勧めしません。
問題を説明する簡単な方法は、乱数を生成するための一般的な「ワンライナー」スキームであるローエンドLCGアルゴリズムの動作を検討することです。
これらは、特定の統計テストに合格するシーケンスを生成するために作成できますが、暗号化アプリケーションには適していません。このようなジェネレータの既知の問題の1つは、下位ビットがランダムでないことです。たとえば、私は低ビットが0/1の間で振動するのを観察しました。このような2つのジェネレータがあり、XORその低ビットであり、ジェネレータが同相または出力外の場合XORの結果はどちらかと言えば予測可能です。状況が改善されたかは明らかではありませんが、さらに悪化した可能性があります。
乱数生成に関するKnuthの議論では、「超デラックス」ジェネレーターを構築しようとする彼の試みのユーモラスな例を示しています。
これは恐ろしく聞こえるかもしれませんが、2つのPRNG自体が十分なランダム性で選択されている場合にのみ、ソリューションは状況を改善します。弱いPRNGは安全でないと見なしている理由を考えてください。結果は統計的に一部またはすべてを推測するのが簡単であり、その結果、暗号およびその他の操作が発生し、入力データ。1つのPRNG= 2つのPRNGに移動する場合、攻撃者は両方のPRNGを知っている(または数回推測する)必要があります。より多くのランダム入力データ)を他の弱点に(推測可能な入力データを提供)それはあなたが始めたのと同じ弱点からただ一つの要因ですおそらく、より安全な単一のPRNGを調べる方が良いでしょう。
提案された方法を使用してより強力なRNGを作成することは十分に可能ですが、より弱いRNG、または改善されないRNGを作成することも可能です。最終結果は、より弱いRNGの特性に依存します。ビットの分布とバイアスは、エントロピーレベルと同じくらいの効果があります。強度全体が向上するかどうか、および潜在的な問題がある場合にセキュリティを危険にさらす可能性があるかどうかを判断できるのは、スキーム全体を注意深く分析して理解した場合のみです。
次の2つの弱いRNG、[〜#〜] a [〜#〜]と[〜#〜] b [〜#〜]を考えます。
[〜#〜] a [〜#〜]は、すべての奇数ビットが0であり、すべての偶数ビットが暗号的に疑似ランダムであるビットストリームを生成します。
[〜#〜] b [〜#〜]は、すべての偶数ビットが0であり、すべての奇数ビットが暗号的に疑似ランダムであるビットストリームを生成します。
結果のXOR stream [〜#〜] c [〜#〜]は完全な暗号の擬似ランダム性を持ち、明らかに他のものよりも強いと仮定します独立した種子。
次のことを考えてみましょう。
[〜#〜] a [〜#〜]は、Dual_EC_DRBGからのビットストリーム出力であり、NSAバックドア定数が含まれます。将来の出力は、ビットストリームの生の出力を観察できる攻撃者。
[〜#〜] b [〜#〜]は、乱数の循環MD5ハッシュからのビットストリーム出力で、将来の出力は現在の出力のハッシュです。将来の出力は、ビットストリームの生の出力を観察できる攻撃者にとって予測可能です。
結果のXOR stream [〜#〜] c [〜#〜]は、コンポーネントと同じ方法で予測できなくなりました。攻撃者は[〜#〜] a [〜#〜]または[〜#〜] b [〜#〜]の出力を自分で表示できます- [〜#〜] c [〜#〜]は安全ではありません。MD5のシードをリカバリすると、将来のすべての出力がすぐに予測可能になります。ブルートフォース攻撃を防ぐのに十分な大きさである必要があります。ストリームは、MD5シードまたは反復ハッシュ値の1つを回復および検証する作業量よりも優れていません。
そして最後に。
[〜#〜] a [〜#〜]は、キーがNSAに認識されているAES-CTRからのビットストリーム出力です。
[〜#〜] b [〜#〜]は、鍵がKGBに認識されているAES-CTRからのビットストリーム出力です。
結果のXOR stream [〜#〜] c [〜#〜]は、共謀がない場合、どちらの機関にとっても安全で予測不可能です。出力を完全に予測可能にします。
これらの例は、適切なプロパティと条件が与えられた場合、弱いエントロピーまたは予測可能な出力のビットストリームをXORすることでより安全にすることができることを示しています。それは必ずしも完全に安全にするわけではありません。
完全にランダムでない限り、 最終結果は不明確です。しかし、1つが完全にランダムであったとしても、それは弱くはありません。
編集:2つが互いに完全に独立していることが確実でない限り、利点は不明確かもしれません。
あなたの元の質問に対する素早いがあいまいな答えは:はい。
ただし、ほとんどの人が示しているように、より安全です!=安全です。
RNG/PRNGの背後にある目的は、攻撃者が十分回復する情報十分保護されたデータを推測できないようにするのに十分なエントロピーを生成することです。
ほとんどのエントロピーソースは、2進数の0と1の十分に混合されたシーケンスが含まれているかどうかを判断するためにテストされ、次の2進数を単に「推測」するだけで約50%間違います。
「十分に混合された」という意味を決定する基本的な要素がいくつかあります。
最初、これは出力における1と0の実際の比率です。
たとえば、PRNGが110110101011101を生成した場合、生成した15ビットのうち10ビットが1に設定され、エントロピー空間の66%になります。この種のPRNGを予測する攻撃者は、1が0よりも全体で1多いと推測して、各ビットについて、正しい時間の1と2/3に設定することを好むでしょう。 。
逆に、011011000100110を生成したPRNGには8つの0と7つの1があり、53%:47%で1ビットに対して0ビットが優先されます。したがって、このシステムを打ち負かそうとする攻撃者は、基本的に1よりも0を推測してもほとんどメリットがありません(オッズは約6%向上)。
理想的には、50:50に近いほど、この最初の保護特性の保護が強化されます。
Seconds、patternを識別できないようなエントロピーのランダム性です。たとえば、PRNGが0から1の50:50の完全なビット比を出力したが、パターンが観察された場合、システムの利点は減少します。
次の16ビットエントロピーを考えてみましょう。ただし、ごく簡単に確認できるように、これは安全ではありません。同じことが0011001100110011または0000000011111111についても言えます。
エントロピー出力には識別可能なパターンがあります。パターンは、アルゴリズムの全体的な有効性を低下させる情報を漏らすため、暗号操作の悩みの種です。
次に、より良い例として、次の16桁のPRNGシーケンスを見てみましょう。0001011011000111この出力は、このセクションの前のいくつかの例よりも「ランダムに見える」ものです。確かに、3つの0が連続する2つのシーケンスがありますが、これらの最初の16桁を考えると、3つの0の3番目のシーケンスがいつ現れるか簡単に推測できますか?それはそれほど簡単ではありません。
したがって、これを元の質問に戻すには、2つの弱いエントロピーソースを組み合わせ、その後、その結果のXORが0と1のほぼ等しい比率を生成し、出力に明らかなパターンがないことを確認した場合、 [〜#〜] could [〜#〜]は、2つのうちのいずれかが単独で使用する場合よりも強力な疑似乱数ジェネレータを生成します。
注:他の人が引用したいくつかの問題(予測可能な下位ビット状態など)を回避するには、weak_random1とweak_random2XORを実行する前に、いくつかのビット数。たとえば、work_random1を3ビット位置シフトし、weak_random2を5ビットシフトします。ビット位置。シフト値(それぞれ3と5)を開示したという事実を除いて、これは、それぞれのPRNG文字列のさまざまな場所に従来から推測/予測可能な値を "スクランブル"することになります前 XOR演算により、予測可能性がさらに困難になります。
以上のことから、まずはより良いランダムソースを使用することをお勧めします。あなたが求めていることを達成することは可能ですが、達成するのは簡単で、安全なソリューションであると考える少数の数学者を私は知っています。
幸運を :)
私が目にする1つの潜在的な問題は、最初の乱数ジェネレータが2番目の乱数ジェネレータと同じまたは同様の乱数を生成するかどうかです。アルゴリズムによって生成された数値が完全に一致する場合、結果の数値は0になり、あまり安全ではありません。アルゴリズムが十分に異なっている限り、この落とし穴はおそらく起こらないはずです。これについてのさらなる議論を歓迎します。