GPIOピンを使用した乱数ジェネレーター?


22

質問AVR Random Number Generatorを読んで、AVRでランダムシードを生成するいくつかの方法に遭遇しました。

  • 専用の「Secure AVR」を使用する
  • 内部温度センサーを使用する
  • 書き込まれていないEEPROMを読み取る
  • ユーザー入力間の時間間隔を測定する
  • フローティングADCピンを使用します。

プルアップとフローティングなしで入力として構成された単一のデジタルピンだけではどうですか?理論的には、ランダムビットのストリームを生成する必要があります。なぜこれを使用しないのですか?状態の変化が遅すぎますか?1または0でスタックする傾向がありますか?他の問題はありますか?


1
セキュアAVRは死んだ私の知る限りである
vicatcu

1
未書き込みのeepromは常に0xFFではありませんか?
VSZ

@vsz、おそらく何かを書いて、書いたものを忘れてしまったら、それは今では「ランダム」です。笑。
ヴォラック

回答:


5

「ランダム」は難しい言葉です。一部のコンテキストでは単に「予測不能」を意味しますが、他のコンテキスト、特に信号処理と暗号化に関連するコンテキストでは、「統計的に無相関」を意味します。

浮動ピンから読み取られた値が予測不能(第1の意味で「ランダム」)であっても、第2の意味では役に立たない可能性があります。


15

デジタル入力を使用する場合とアナログ入力を使用する場合の違いは、アナログで可能なシード値のスパンが広いことです。

第二に、おそらくより重要:デジタルピンのフローティング「中央値」がロジックセンスレベル(電源レールレベルとグランドレールレベルではなく、入力回路のスイッチングしきい値)のちょうど中間にない場合、結果のビットストリームは1または0への強いバイアス。このバイアスは、アナログレベルのスキューよりもはるかに強くシードをスキューします。

「フローティング」デジタルピンを非フロートにプッシュするために、近くのトレースまたは信号から、または設計または偶発的に何らかの抵抗性プルアップ/プルダウンを介して、非常に小さなカップリングが必要になります。展開。設計を設計する際には、この形式の障害モードを避けることが最善です。


14

浮動入力は未定義です。ランダムなビットを与える可能性がありますが、0または1でスタックする傾向があります。ほとんどの場合、スタックします。そして、それが本当に浮遊している場合、システムノイズと消費電力が増加する可能性があります。入力が何にも使用されていない場合でも、浮動入力は一般に悪いことです。


時々0または1でスタックするだけでなく、入力バッファの第1ステージを構成する2つのトランジスタが完全にバランスが取れていない場合、または何らかの外部電流源が存在する場合を除き、入力フロートします最終的には1まで、または0まで。
wjl

9

最も簡単な解決策は、誤用されたオープンコレクタトランジスタ回路からハードウェアランダム信号発生器回路を構築することです。ビットストリーム出力をマイクロコントローラーの入力に使用します。着信ビットを一定間隔でサンプリングします。ほぼ偶数の1と0を確保するには、単純に状態の変化を1として使用し、変化なしをゼロとして使用します。詳細については、Googleのトランジスタノイズジェネレーターをご覧ください。


面白い。「誤用されたオープンコレクタトランジスタ回路」はどのようなものですか?
スティーブン

7
@Remiel-トランジスタのベース-エミッタ接合に逆バイアスをかけると、本当にくだらないツェナーのように機能します。非常にノイズの多いツェナーを使用し、ノイズを増幅してランダムなビットストリームを取得します。見る robseward.com/misc/RNG2
コナーウルフ

3

多くのマイクロコントローラーで使用可能なランダムジェネレーターの1つは、2つのクロックソース間の誤差です(1つは内部、もう1つは外部)。それらを比較すると、ノイズのためにわずかにドリフトするため、使用できます。

最終的にそれはあなたがそれを必要とするものに依存しますか?少しランダム化すれば、何にも接続されていないADCピンを使用することもできます。または、次のようなアルゴリズムを使用します

メルセンヌツイスター http://en.wikipedia.org/wiki/Mersenne_twister

ただし、これが暗号的に安全であれば、ほとんどありませんが、ほとんどの目的には十分です。


それは、参照された前の質問のmsp430アプリノートで取られたアプローチです、私の知る限り、AVRクロックシステムはこのテクニックをサポートしていません
vicatcu

正しい。直接サポートされていない場合でも、同じクロックソースでそれを行うことは可能です。
グスタボリトフスキー

3

ランダムシードとそのアルゴリズムの品質は、各ランダムビットのエントロピーまたは不確実性の量によって決まります。次に、シードの最適なジェネレーターは、低エントロピーの多くのステップではなく、非常に少ないステップで高エントロピーを使用します。

高エントロピーの良い例はラテン方格を使用します、ランダムシードに法をます。

フローティング入力は、傷、漏れ、または侵入ノイズによって容易にバイアスされます。


0

PIC18Fマイクロプロセッサでは、乱数のシードが必要です。シードには、0〜32767(15ビット)の任意の値を指定できます。プログラムの開始時に、ピンとアナログ入力ピンのいずれかを作成することをお勧めします。このピンを読み取り、最下位ビットを取得して16ビット変数に入れます。次に、変数を1だけ左にシフトします。ピンをもう一度読み取り、最後のビットを格納した変数の最初のビットにADC結果のLSBを入れます。

変数に15ビットが入るまでこれを繰り返します。これは、シードに入れる必要がある番号です。

これを行った後、単にアナログ入力ピンをデジタル入力ピンにして、弱いプルアップを有効にするか、デジタル出力ピンにすることができます。どちらかがこのピンのフローティングを停止します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.