STM32F4XXXX MCUのRNG(Random Number Generator)ペリフェラルに不思議です。見て、このリファレンスマニュアル(ページ748)。一方、stdlibライブラリには、同じタスクを実行するrand()関数があります。今私は2つの質問があります:
- rand()関数とRNG(乱数ジェネレータ)ペリフェラルの違い(利点と欠点)は何ですか?
- この部分を見てください:
これら両方のオプション(特に2番目のオプション)について説明してください。
STM32F4XXXX MCUのRNG(Random Number Generator)ペリフェラルに不思議です。見て、このリファレンスマニュアル(ページ748)。一方、stdlibライブラリには、同じタスクを実行するrand()関数があります。今私は2つの質問があります:
これら両方のオプション(特に2番目のオプション)について説明してください。
回答:
デイブの答えはそれをかなりうまく再開しますが、2番目のオプションについてもう少し明確にするために:
実際のハードウェア乱数ジェネレータは、物理的なエントロピーソースを使用します。このようなエントロピーソースは、宇宙放射線、電気ノイズ、逆バイアスダイオード(またはBJTトランジスタ)からのアバンランシェ効果、チュア回路などである可能性があります。エントロピーソースの確定性が低いほど、ランダム出力の品質は良くなります。理想的なエントロピーソースは、量子物理効果、または決定論的な方程式でモデル化できないものを使用することです。
乱数ジェネレータのもう1つの重要な要素は、エントロピーソースが単位時間あたり限られた量のエントロピーしか生成しない可能性があることです。良い例は、チュア回路です。非常にランダムですが、速度が非常に遅く、実際のアプリケーションには使用できません。
組み込みRNGを備えた多くのプロセッサ/マイクロコントローラーでは、意図的に誤って同期されている2クロックから4クロックへのクロックドリフトが使用されます。次に、アナログフィルターとデジタルフィルターの両方を使用して、パターンをさらにランダム化し、結果をレジスターにシフトインします。このようなフィルタリングの実行には数サイクルが必要です。これは、新しい値が利用可能になる前に、特定のクロックで必要なサイクルの最小量を説明します。
クロックのドリフトは量子効果ではないため、モデル化できますが、温度、シリコンプロセス、動作周波数、電気的ノイズ、バックグラウンド放射などの多くのパラメーターに依存しているため、十分にランダムです。 。
ハードウェアRNGのスループットが不十分なアプリケーション(要求の厳しい暗号アプリケーションなど)では、ハードウェアRNGをsdtlibのrand()関数などの疑似乱数ジェネレータのシードとして使用するのが一般的です。ただし、このようなアプリケーションは通常、真のランダム値で非常に頻繁に破棄される可能性があるシードから実行するように特別に設計されたrand()のより良い実装を提供します。ハードウェアRNGが統合された新しいIntelプロセッサでは、疑似ランダムアルゴリズム部分がシリコンに直接統合されているため、ハードウェアによって実行され、非常に高いランダムスループットを実現します。
rand()メソッド自体を気にするなら、十分な量のエントロピーを生成するように設計されているのは数学的な表現だけです。アプリケーションに依存する十分な大きさ:暗号鍵の生成では、ランダム性は、お気に入りの音楽プレーヤーでの単純なランダムシャッフルに必要なランダム性よりも高い品質である必要があります。ランダム出力の品質が高いほど、乱数の計算コストが高くなることは明らかです。
乱数に関係する操作は、ファイルのMD5ハッシュの計算に関係する操作と非常に似ています。シード値の単一のビット変更が生成パターン全体を変更するように、一種のビットなだれ効果を使用しようとします。余談ですが、私はMD5を疑似乱数ジェネレータとして使用することはお勧めしません。それは単なる例でした。それは非効率的であり、それほどランダムではありませんが、要点はあります。同じファイルをMD5のハッシングアルゴリズムにフィードすると、常に同じ確定的な出力が得られ、ほぼ同じ方法で常に同じ出力が得られます実装が現在の時間などの任意の要素に依存していない限り、同じシードを入力した場合のrand()関数。
概説する2つのトピックは、比較的簡単に説明できます。
モーターに一定時間通電し、ホイールとボールが静止するのを待ち、どのポケットにボールが入っているかを観察する機械式ルーレットホイールスピナーを設計するとします。通常、ボールとホイールをスピンするたびに、最終的にはわずかに異なる場所に到達し、1つのスピン後のボールの位置の小さな変動は、次のスピンに到達する場所に大きな違いを生む可能性があります。したがって、モーターが常に同じ時間だけ通電されている場合でも、ボールが1つのスピンに着地するポケットは、前にスピンが着地した場所とは独立しています。
ただし、いくつかの数値にわずかな窪みがあるか、発生し、モーターのベアリングに平らな点が発生するとします。次に、いくつかのスピンはランダムになりますが、スピンが落ち込んでボールが着地し、ベアリングがフラットスポットになった後、次のスピンは、最後のスピンと同じ結果になる方向にバイアスされる可能性があります。ほとんどのスピンがディボットとフラットスポットに同時に当たらない場合、それらの存在はおそらくあまり影響を与えません。一方、1つのディボット/フラットコンボがたまたま正しく配置されて、そこにボールが一貫して2番目に着地し、1番目のボールが最初に戻るように配置された場合、最終的にいくつかの極端に歪んだ動作になります。
4と23に着陸した後、次のスピンが4である場合、それは必ずしも問題を示しているわけではありません。その状況では、時間の約1/38に4が表示されます。さらに、ランダムデータの取得は、ポケットの数をキャプチャするだけで済みます。これは、ボールがポケットのさまざまな部分にどれだけの頻度で静止する必要があるかについては何も役に立たないためです。それでも、数字を記録しているすべての人が、ポケットのどこでボールが停止し、異常なパターンがないかを「観察」することも役立ちます。場所の分布は、問題を示すことなく前面または背面に偏っている可能性がありますが、分布に急激なスパイクがある場合は、懸念される可能性があります。
ランダムジェネレーターからの連続した読み取り値が統計的に独立している場合、バイアスの補償は難しくありません(ただし、必要な時間は非決定的です)。ただし、発電機が読み取り値が独立していない状態(上記のホイールの周期的な状態など)に陥った場合、補償は基本的に不可能になります。そのため、ハードウェアRNGにそのような動作を検出する回路を含める必要があります。