乱数ジェネレーターの人間エントロピー

チャンスが存在するのは、私たちの弱さ、無知のためだけです


A.ポアンカレ



宇宙の秘密を理解する人が多くなればなるほど、彼らは祖先がすべ​​てを神に帰したという無知のポイントに近づきました。 今、これはチャンスと呼ばれています。 そして、アインシュタインは偶然を信じていなかった-「神はサイコロを振らない」と言った-彼はリストの最初の一人である:アインシュタイン、シュレーディンガー、ラプラス...



デジタル技術の時代と人類の発展における情報の巨大な役割において、情報保護は緊急の課題です。 この問題の技術的解決策には、「ランダム性」、つまり乱数の生成の魅力が含まれます。 さらに、結果の品質は、使用する発電機の品質に直接依存します。 この状況は、ORNLのRobert R. Cavierのよく知られている格言を強調しています。「乱数の生成はあまりにも重要であり、偶然に任せることはできません。」



実際の乱数のソース、たとえば物理ノイズ-電離放射線イベント検出器、抵抗器でのショットノイズ、宇宙放射線など -セキュリティアプリケーションではほとんど使用されません。 別の解決策は、多数の乱数のセットを作成し、それを何らかの辞書で公開することです。 それにもかかわらず、そのようなセットは、必要なものと比較して非常に限られた数のソースを提供します。これらのセットは統計的なランダム性を提供しますが、十分にランダムではありません。



暗号化アプリケーションは、特別なアルゴリズムを使用して乱数を生成します。 これらのアルゴリズムは事前定義されているため、理論的には統計的にランダムにできない一連の数値を生成します。 同時に、適切なアルゴリズムを選択すると、結果の数値シーケンスはほとんどのランダムテストに合格します。 このような数値は、擬似乱数と呼ばれます。



完全に乱数を生成できる決定論的なアルゴリズムはなく、それらのプロパティの一部のみを近似できます。 ジョン・フォン・ノイマンが言ったように、「乱数を得るための算術的手法に弱い人は誰でも疑いなく罪深い」。



ほとんどの単純な算術ジェネレーターは高速ですが、多くの重大な欠点があります。



-期間が短すぎます。

-連続値は独立していません。

-一部のビットは他のビットよりも「ランダム性が低い」。

-不均一な1次元分布。

-可逆性。



そのようなRNGをどのように作成しますか。その結果は、可能な範囲で予測不可能です。 自然界で最も予測不可能な現象の1つであり、実際には形式化、したがってモデリングに役立たないものは何ですか? 人間の行動:大衆(群衆、グループ、組織、クラブなど)ではなく、個人。



個人の行動の予測不可能性の考えに基づいたRNGの構築が提案されています。 プロジェクトの実装では、統合開発環境Microsoft Visual Studio 2010および言語Visual Basic.NETが選択されました。



プロジェクトフォームでは、56個の正方形のボタンが隣同士に配置されます。 各ボタンは、MouseEnterシステムイベントに関連付けられています。



画像



各ボタンのイベントハンドラには、システム時間をミリ秒単位で受け取るコードがあります。 ボタンの上にカーソルを置くと、特定の数値が0〜999の範囲に保存され、同じボタンの上にカーソルを繰り返すと、新しい数値が保存されます。 したがって、ユーザーはボタンフィールド上でカーソルを任意に移動し、一連の数字を形成します。 「最適な」シーケンスを取得するには、フィールドの少なくとも1/2を「作業」(ボタンの上にカーソルを置く)することをお勧めします(より小さい数字では、一連の数字を取得できません)。



カーソルがいくつの正方形に描かれたかに関係なく、結果として常に56桁が得られます。 「欠落」番号は次のように表示されます。



-それぞれ56要素の次元を持つ2つの配列bとcが作成されます。 交互に(組み込み関数を使用して)ランダムに配列bとcが埋められます。 毎回、次の要素を埋める前に、ランダム化カウンターがリセットされます。そうでない場合、次の各値は前の値に依存します。

-以下に示すプログラムコードの断片は、配列を埋めるためのアルゴリズムを示しています。



Randomize() znak = Rnd() * 5 If znak = 0 Then a(ii) = b(ii) + c(ii) If a(ii) > 999 Then While a(ii) > 999 a(ii) = (a(ii) / 3.14) + Rnd() * 42 End While End If ElseIf znak = 1 Then a(ii) = b(ii) - c(ii) If a(ii) < 0 Then a(ii) = a(ii) * (-1) End If ElseIf znak = 2 Then a(ii) = b(ii) * c(ii) If a(ii) > 999 Then While a(ii) > 999 a(ii) = (a(ii) / 3.14) + Rnd() * 42 End While End If ElseIf znak = 3 Then a(ii) = b(ii) / (c(ii) + Rnd() * 9) If c(ii) = 0 Then c(ii) = Rnd() * 99 + 1 End If If a(ii) > 999 Then While a(ii) > 999 a(ii) = (a(ii) / 3.14) + Rnd() * 42 End While End If ElseIf znak = 4 Then a(ii) = Now.Millisecond End If
      
      







毎回、配列の次の「バックアップ」充填時に、Randomize()関数が呼び出されます。これは、前のRnd値ではなく、システムタイマーの値を開始点として使用します。 つまり、次のシーケンスを生成するたびに、ユーザーは互いに独立した異なる値を使用して、配列bとcの再充填を開始します。

ユーザーがフィールドを十分に「クロール」した後、対応するボタンをクリックして結果を受け取ります。

このプログラムは、ユーザーがフィールド上のボタンの少なくとも半分を「アクティブ化」した場合にのみ作業の結果を確認できるようにします。そうしないと、多数の「応答」ボタンを「使用」する必要性に関するメッセージを受け取ります。 実装されたプログラムにより、受信したデータをクリップボードにコピーできます。 また、ユーザーは、対応するボタンを押すことで、生成開始数、間隔内の数値の分布、一連の数値の合計など、生成されたシーケンスに関する統計を取得できます。



四角いボタンは完全に混oticとした順序で配置されています。つまり、最初のボタン(カーソルで使用する場合)は必ずしもシーケンスの最初の数などを決定しないため、「ランダム性」がさらに向上します。 、取得したシーケンスの一貫性を判断することはできません。 ユーザーがどのように動作するか、どのシーケンスでカーソルを四角の上に移動するか、どれをアクティブにするか、どれをアクティブにしないかを予測することは不可能です。 カーソル移動の同じアルゴリズムを繰り返すと、異なる数が得られることに注意する必要があります。前のカーソルパスが「描画」されたのと同じ期間に入ることは不可能です。 したがって、提案されたジェネレータの品質は、とりわけ、エントロピーの外部ソースによるものです。



-フォーム上のボタンのランダムな配置。

-ユーザーによる選択の意性;

-この選択の時間間隔の予測不可能性。

このジェネレーターは、作業の品質についてテストされました。

-事故;

-均一な分布;

-統計的な独立。



テストは、さまざまな人がさまざまな時間に繰り返し実行されました。 テストが適用されました:ピーク基準、均一分布テスト:数学的期待値、分散、標準偏差、頻度テスト、カイ2乗テスト、統計的独立性テスト、自己相関の欠如。 ほとんどのテストでは、このジェネレーターの信頼性(少なくとも90%)が示され、カイ2乗テストでは99%の信頼性が示され、個々の統計のテストでは常に均一分布の基準値に近い結果が示されました。



UPD:

ソフトウェアの実装が興味深い場合は、 ここからダウンロードしました 。 私は一年以上前に書きましたが、それ以来、プログラミングスキルが向上したことを願っています:)



All Articles