web-dev-qa-db-ja.com

乱数ジェネレータのランダム性をチェックする方法は?

コマンドの受信時に(たとえば)8バイトのランダムな値を返すスマートカードがあるとします。問題は次のとおりです。

この値が本当にランダムかどうかを確認するにはどうすればよいですか?(実装とメカニズムにアクセスできません。8バイトの16進数が表示されます。)

別の世界では、出力に基づいてランダムジェネレーターの出力のランダム性をチェックする方法はありますか?または唯一の方法は、ジェネレータの実装とメカニズムを分析することですか?

13
TheGoodUser

NISTは NIST Special Publication 800-22 で、ランダム性の原因を検証するための広範な統計テストのセットを定義しています。

ただし、これはRNGが明らかに壊れていないと断言するには十分ですが、RNGが「良好」であることを断言するだけでは不十分です。 very微妙な欠陥がRNGの破壊につながる可能性があるのは、RNGの性質です。 RNGの堅牢性をチェックする唯一の適切な方法は、実装を見ることです。

16
user10211

実際の「ランダムさ」は、サンプルのエントロピーの量に帰着します。そして、エントロピーは、他の人が指摘したように、ブラックボックステストで資格を得るのは多かれ少なかれ不可能です。優れたコンディショニング機能と情報がほとんどない単純な入力は、統計的検定に合格できます。したがって、テストは、数値が生成された方法に固有の統計的弱点があるかどうかを指摘することしかできず、実際に予測できないことを確認することはできません。

RNGのランダム性、予測不能性、またはそのエントロピーを評価する上で重要な要素がいくつかあります。

  1. ライブエントロピーソースを使用した真のRNGと、初期シード(または2つの組み合わせ)を使用したDRNGのどちらを話しているのかを判断する必要があります。
  2. ライブノイズソースがある場合は、必ずノイズ(エントロピー)ソースの実装と基礎となる理論を確認する必要があります。これには、物理​​モデルまたは確率モデルが使用されます。
  3. 上記のRNGによって生成された出力で統計テストを実行する場合、調整/圧縮関数を適用する前に収集されたデータに対して実行して、作業している実際のエントロピーの量を明確に把握する必要があります。
  4. RNGが真のRNGではない場合、つまり確定的RNGを検討している場合は、DRNGアルゴリズムの実装を検証する必要があります。これはテストベクターで行うことができます。
  5. 最後に、ライブエントロピーソースがないDRNGの場合、初期シード品質を評価する必要があります。シードが真のRNGからのものである場合、上記の1〜3が適用されます。

RNGの評価は最近非常に注目されており、基準はより厳しくなっています。 RIST設計の概要についてはNIST SP800-90A/B/Cシリーズを、特にエントロピーソースの評価についてはSP800-90B(ドラフト版)をご覧ください。 BSIは、AIS20/31にRNGの評価方法を説明するガイドラインもあります。

そして最後に、すでに指摘したように、NISTのSTS 800-22aは優れたテストスイートです。 BSIのAIS20/31テストスイートとDieharderテストスイートもあります。

2
thera

できません。意図されたランダムジェネレーターの出力が暗号化に対して十分ランダムであることを確認することは不可能です。 (モンテカルロ数値法などの一部のアプリケーションでは十分ランダムであることを確認できますが、暗号化キーを生成することはできません。)

暗号的に安全な疑似乱数ジェネレータ 、つまり、決定論的であるが、それでも真にランダムなシーケンスと区別できない乱数ジェネレータが存在します。 CSPRNGの出力を真にランダムなシーケンスから区別する方法がわかりません。CSPRNGの出力の一部が与えられた場合、与えられていない出力を再構築する方法がわかりません。

(実際には、CSPRNGが存在することを数学的に証明することはできませんが、AESがSPR-2から暗号化アルゴリズムを導出するのに適しているという同じ仮説の下のCSPRNGである、AESやSHA-2などの暗号プリミティブ上に構築されたCSPRNGがあります。暗号化ハッシュ関数。)

CSPRNGは確定的であるため、初期状態がわかっていれば出力もわかります。より一般的には、ある時点でその内部状態がわかっていれば、その後のすべての出力がわかります。したがって、CSPRNGは、攻撃者が内部状態を知らない場合にのみ、暗号化のための暗号化キーとその他のランダム値を生成するのに適した方法です。

内部状態が敵対者に知られている(暗号化に適していません)CSPRNGは、内部状態がスマートカードの外部に知られていない(暗号化に適しています)CSPRNGと区別できません。したがって、出力のみからRNGの品質をテストすることは不可能です。出力からわかるのは、いくつかの重大な欠陥を検出することだけですが、すべての重大な欠陥を検出するわけではありません。

RNGが機能することを確認するために、内部を調べる必要があります。これは2つの部分で行われます。

  • CSPRNGが適切なアルゴリズムを使用し、正しく実装されていることを確認します。
  • CSPRNGが敵に知られていない材料からシードされていることを確認します。

(物理プロセスのみに基づくRNGは、ほぼ常に検出可能なバイアスを持っているため、物理RNGは直接使用されませんが、エントロピー入力(つまりシード)としてCSPRNGに供給されます。)

CSPRNGの実装は、ソースコードを調べ、アルゴリズムが適切であることを確認することで検証されます(通常、 NIST SP 800-90A などの標準のアルゴリズムが推奨されます。必須)、そして、間違ったアドレスに結果を保存するなどの実装エラーを検出するためにいくつかのテストを実行します。

RNGのシードは、検証がよりデリケートです。一部のシステムには、「真の乱数ジェネレータ」、つまり放射性崩壊やカオス振動子などの予測不可能な物理プロセスに基づいて予測不可能なビットを返すハードウェアが含まれています。これらの検証は、TRNGの出力に十分な エントロピー があることを示す統計テストで行われます。

TRNGは実際には「真にランダム」ではない可能性があることに注意してください。バイアスがある可能性があります。重要なのは、それが十分にランダムであるため、次の出力を正しく予測する確率が非常に低いため、攻撃者は情報に基づいた推測を行うことができないということです。これらのバイアスが、CSPRNGがTRNGの出力に適用される理由です。暗号化の「混合」関数を使用すると、観測可能な相関関係(たとえば、ビットが0の場合、次のビットも52%の確率で0になる可能性があります)を相関関係に変換します計算することは不可能です。

また、CSPRNGにシークレット値を一度にシードすることでRNGを作成することもできます。これは、PRNGの内部状態がリークしないことを確信している場合にのみ実行できます。シード値自体は、最終的には何らかの形式のTRNGからランダムに生成する必要があります。ただし、このようにして、TRNG RNGが実行されるデバイスではなく、ファクトリー内にある可能性があります。

スマートカードの購入者は、カードの内部を見てカードの機能を確認することはできません。 (内部を見ることができないことはスマートカードの重要な特性です。)ただし、使用しているカードはセキュリティ研究所によって評価された可能性があります。 Common Criteriaprotection profiles など、スマートカードのセキュリティを評価するための標準があります。カードが 認証済み であるかどうかを確認できます。 CCだけがそのような認定ではありません。 VisaやMastercardなどのクレジットカード会社は、独自の認証プロセスを持っています。カードが評価されている場合、ベンダーは証明書を指摘する必要があります。これはマーケティングの議論です。多くのスマートカード認証があり、それらはさまざまなものをテストするため、証明書が保証するものを正確に確認してください。 RNGがどのように機能するかは正確にはわかりません(通常は取引回路です)が、セキュリティラボが調査したところ、欠陥は見つかりませんでした。

それを使用して画像を生成します。ランダムなx、y、r、g、b ...任意のパターンを見つけます。

更新:私は1)これはあまり科学的な方法ではないこと、2)RNGが暗号的に安全であることを証明していないことに同意しますが、RNGかどうかを確認する迅速かつ簡単な方法ですはではないランダム...例これが.netのSystem.Randomの視覚化です。

random scatter with x/y/argb generated from System.Random

0
KristoferA