私は(教育目的で)私的な暗号化プロジェクトに基づいて乱数を生成するコードを書きました。ここで、乱数ジェネレーターの品質を確認したいと思います。
私がすでに行ったテスト:
- すべての数値を一緒に数え、ゼロまでの距離を確認します(数値は負と正の場合があります)
- 乱数を
System.Random
クラスと比較します(重複した数は.NETのランダムジェネレーターの半分にあります)
アルゴリズムがどの程度うまく機能しているかを確認するために、さらに何ができますか?
TestU01は、ANSI C言語で実装されたソフトウェアライブラリであり、均一な乱数ジェネレーターの経験的な統計テストのためのユーティリティのコレクションを提供します。
参照:P。L'Ecuyer and R. Simard、TestU01:AC Library for Empirical Testing of Random Number Generators ACM Transactions on Mathematical Software、Vol。33、記事22、2007。
カイ二乗検定は、ランダム性の質の標準的な統計的検定です。実装については、http://en.wikibooks.org/wiki/Algorithm_Implementation/Pseudorandom_Numbers/Chi-Square_Testを参照してください。
それが暗号的にも強力であることを証明する必要がある場合...まあ、それははるかに難しい問題です。
アルゴリズムがどの程度うまく機能しているかを確認するために、さらに何ができますか?
究極の方法は、この疑似ランダムシーケンスを真にランダムなシーケンスと区別するのが難しいという正式な証明を与えることです。たとえば、この区別する問題を、難しいことが証明された(または少なくとも強く信じられている)別の問題に減らすことによって(たとえば、離散対数を取るように)。
暗号化のこの部分は証明可能安全性と呼ばれ、いくつかの優れた証明手法と概念(ハードコア述語、一方向性関数、識別攻撃、ハイブリッド配布など)を提供します。ただし、アルゴリズムに正式に処理できる数学的基礎がある場合にのみ適用できます。
この分野からの最初の品質チェックは次のとおりです。アルゴリズムのすべての詳細とそのすべての概念およびアイデアを世界中に伝えても大丈夫でしょうか。そうでない場合は、暗号化スキームがどのように機能するかを隠すことに基づくべきではないため、何か問題があります。唯一の秘密は、個々の秘密鍵(またはランダムシード)である必要がありますが、アルゴリズム自体ではありません。たとえば、シーザーチッパーは、それがどのように機能するかがわかれば、簡単に壊れます。それとは対照的に、AESはオープンスタンダードですが、それでも安全であると考えられています。