Raspberry Piにはハードウェア乱数ジェネレーターが組み込まれていますが、ハードウェアに関する公開ドキュメントはなく、疑わしいと思われる場合でも、問題が発生する可能性があることを公に認めている企業はありません。彼らがそれでうまくいくことができるならば、彼ら自身のハードウェア?)。
では、ハードウェア乱数発生器をテストする最良の方法は何でしょうか。ハードウェア乱数ジェネレーターで生成された乱数を10 GBのファイルに入力した場合、メインコンピューターに、生成された数値にパターンがあるかどうかを確認するために使用できるツールはありますか?
乱数ジェネレータ(ソフトウェアまたはハードウェア)が安全に使用できるかどうかを確認するサードパーティの方法がないとは信じがたいです。そうでなければ、なぜオープンソースではなく、独立して監査することができない乱数ジェネレータを信頼する人がいるのでしょうか?
Raspberry Piを使用していくつかの秘密鍵を生成したいのですが、通常のソフトウェアの乱数ジェネレーターは、それを実行可能にするのに十分なエントロピーを取得しません(生成に時間がかかります)が、ハードウェアの乱数ジェネレーターでは、はるかに実行可能です。ハードウェアの乱数発生器を信頼できるかどうかわかりません。
ここでは、いくつかの要因が影響します。
メーカーによれば、その特定のチップは、オープンコレクタHRNG設計で、逆バイアストランジスタからのノイズを使用しています。これは、現在のHRNGプロジェクトで使用しているハードウェアですが、はるかに小型です。これは、HRNGをシリコンに直接実装する最も安価な方法の1つです。ディスクリートトランジスタを使用しているのに対して、ARMプロセッサは、これをチップダイ上のシリコンの数個のブリップに単純に縮小します。
このメカニズムは、確率的でランダムであることが知られている量子トンネリングと呼ばれる現象に依存しているため、ランダム性の強力な原因であることはわかっています。基本的な考え方は、電子がトランジスタ内部のバンドギャップをランダムに「ジャンプ」し、ランダムに変動する信号をもたらすというものです。次に、これを増幅し(単純なPNPトランジスタアンプが行う)、固定周波数で結果をサンプリングすることにより、出力を1または0として解釈します。特定のしきい値を超える場合は1、それ以外の場合は0です。
このメカニズムの1つのわずかな欠陥は、DC=リークが発生すると、1に向かってスキューが発生し、0よりも頻繁に表示されることです。これを回避するには、フォンノイマン無相関と呼ばれる単純なトリックを使用できますこれは、基本的にビットペア01と10をそれぞれ0と1にエンコードし、00と11のペアをすべて無視することを含みます。これにより、統計的に不偏なストリームが生成されます。
これが乱数を生成するメカニズムであることはほぼ間違いなく保証できます。主要な代替案が1つあります(2つの逆バイアスNOTゲートが並列)が、インテルの特許でカバーされているので、ARMはそれを使用しています。残念ながら、確実に知る唯一の方法は、いくつかの酸とチップのキャップを外してから、顕微鏡を取り、シリコンのリバースエンジニアリングを開始します。
このような調査で見つかる潜在的な脆弱性は、高周波クロック信号または他のHFデータラインがHRNGまたはそのサポートロジックの非常に近くにルーティングされ、干渉の可能性につながることです。これは通常ICではあり得ないことですが、ここでは高感度アプリケーションについて話しているので、検討する価値があります。たとえそうであったとしても、それが解読の観点から有用なスキューを提供するとは思えません。
悪用の次の可能性はマイクロコードです。最近、研究者は、Intelプロセッサのマイクロコードにパッチを適用して、命令バッファ内の一意のパターンを探し、RDRAND命令が/dev/random
プール。次に、プロセッサキャッシュ内のそのプールバッファの位置を特定し、事実上ゼロにして、ゼロのプールをシステムメモリにコピーします。つまり、/dev/random
は、攻撃者が制御する同じ値を常に出力し、明らかに壊滅的な結果をもたらします。 ARMマイクロコードで同様のしかしより微妙なトリックが採用された場合、パッチの作成者のみが知っている方法でHRNGのエントロピーを大幅に削減することが可能かもしれません。このようなトリックは困難ですが、マイクロコードを抽出して分析することで実現できます。
最後に、最後の問題はLinuxカーネル内のRNG設計です。 /dev/random
プールは通常、暗号化機能に基づいて構築された混合アルゴリズムを使用して、状態ベースのソースの束から供給されます。ただし、RDRANDまたは同様の命令が使用可能な場合、エンジンはプール上のデータをXORするだけです。これは、特定の値を生成することにより、意味のある方法でプールデータを簡単にねじ込むことができるので、必ずしも良いアイデアではありません。より強力なミキシング機能が使用されている場合、攻撃者は、プールを有意義に制御するために、それを壊す(またはより目立つことを行う)必要があります。
あなたの質問に対する明確な答えはありません。ハードウェア乱数ジェネレーターは非常に高品質である場合がありますが、コンシューマーデバイスのみを前提として、その実装を分析することは困難です。そうは言っても、ハードウェアを信用しないのであれば、そもそも実際に保証をすることはできません。不信感の範囲を、生成される乱数の品質に完全に制限したい場合は、その事実に基づいてサポートシステムを設計します。
過去にも同じ問題がありました。米国国立標準技術研究所(NIST)は実際に 一連のテストでいっぱいのスイート を用意しています。あらゆる種類の統計検定が含まれ、各検定のp値が報告されます。これには、ゼロと1を数えるだけの単純なテストが50%に近いかどうかを確認するテストや、スペクトル分析などの高度なテストが含まれます。すべての理論と、テストを適切に使用して結果を解釈する方法を説明する、非常に読みやすく理解しやすいマニュアルがあります。
乱数ジェネレータ(ソフトウェアまたはハードウェア)が安全に使用できるかどうかを確認するサードパーティの方法がないとは信じがたいです。
残念ながら、これは事実です。そのRNGが出力に明らかな偏りがあるほどひどく悪い場合を除き、RNGにソースを確認せずにバックドアと見なすことができる微妙な弱点が含まれているかどうかを検出することは非常に困難です。
ランダムデータの予測可能性をテストするために使用するツールについて-業界標準は、より困難なスイートです here にあります。
RaspberryPi固有の例、 カーネルモジュールとrng-toolsのインストール の後に起動されます:
apt-get install dieharder
cat /dev/hwrng | dieharder -d 0 -vv
# Verbose is now 0
#=============================================================================#
# dieharder version 3.31.1 Copyright 2003 Robert G. Brown #
#=============================================================================#
rng_name|rands/second| Seed |
mt19937| 1.34e+06 |2497347415|
#=============================================================================#
test_name |ntup| tsamples |psamples| p-value |Assessment
#=============================================================================#
diehard_birthdays| 0| 100| 100|0.79423698| PASSED
まああなたが試すことができるいくつかのことがあるので、このページを紹介します: https://calomel.org/entropy_random_number_generators.html
ランダム度のレベルを確認してください
Entを使用して、出力ファイルのエントロピー/ランダム性のレベルをテストできます。 「Entは、データを含む任意のファイルに対して使用でき、そのデータのランダム性をテストします」
エントロピーを増やします
エントロピーを増やします。使用できる「rngd」というデーモンがあります。これはバックグラウンドで実行され、システムのエントロピーの量を大幅に増やします。データの品質は、/ dev/randomが生成するものとほぼ同じですが、rngdは1秒あたりのパフォーマンスを向上させます。
次の記事を心に留めておく価値があります: http://arstechnica.com/security/2013/12/we-cannot-trust-intel-and-vias-chip-based-crypto-freebsd -developers-say /
これによって強制された主な変更は、ハードウェア乱数ジェネレータを擬似乱数ジェネレータとして表示することです。それらをそのように扱うことは、生成された数値をよりランダムにするための予防策を講じることができることを意味します(2番目の乱数ジェネレータへのシードとしてそれを渡すなど)。
独自の乱数ジェネレータを作成できます。その方法を示す興味深いプロジェクトがたくさんあります。
コンピュータは確定的なマシンであり、常に同じ順序で正しいステップを実行する必要があります。疑似乱数ジェネレーターは、特定の条件内で「予測不可能な」数値を生成するソフトウェアアルゴリズムです。ジェネレーターの出力を知っていても、シーケンスの前に生成された数値を特定するのに役立ちません。また、出力を知っていても、将来の特定に役立ちません。出力。もちろん、内部状態を知ることで、将来の出力を予測することができます。初期状態をシードと呼びます。
真に予測不可能な数値を生成するには、アルゴリズムの状態に未知の値をシードする必要があります。しかし、数学的アルゴリズムでは生成できません。したがって、ハードウェア設計者は、予測不能性の尺度を提供するハードウェアを作成します。
ハードウェアが信頼できない場合でも、不明な情報のソースをできるだけ多く収集し、それらを組み合わせることができます。 1つのソースが偏っている場合、それは単に全体的な未知の状態への寄与が少なくなります。これらのアルゴリズムは、エントロピー収集プログラムとして知られています。出力は、暗号スポンジ関数を介して実行されます。暗号スポンジ関数は、到達する速度で未知のデータを吸収し、要求に応じて疑似ランダムバイトを送信します。
物理乱数ジェネレーターのテストは、高品質の擬似乱数ジェネレーター(数学関数)のテストに似ており、それらのために開発された同じツールを利用できます。 FIPS 140、STS 1.2.1、diehard、dieharder、Test U01など...
真の乱数ジェネレータを扱う場合、これらのテストの結果の解釈は多少異なります。数学関数ベースのジェネレーターをテストするとき、テストの失敗は基本的なジェネレーター設計の欠陥を明らかにします。ただし、物理ベースのジェネレーターでは、特定のサンプルでテストが失敗することがあります。そして、これらの失敗したテストがdifferentサンプルで頻繁に繰り返されない限り、ジェネレーターは期待どおりの結果を生成し続けます。
もう1つの違いは、数学ベースのジェネレーターをテストする場合、妥当性を判断するために一度だけテストする必要があることです。ただし、ランダム性(エントロピー)を収集するハードウェアの物理プロパティの変更は、その出力の有効性に影響を与える可能性があるため、物理ベースのジェネレーターは定期的にテストする必要があります。
Piから収集された4つの異なる4ギガバイトのサンプルで実行される4セットのテストなど、興味がある場合はより多くの情報を含む、これらの物理ジェネレーターの設計、実装、使用、およびテストに関する私の進行中の探求を詳述するWebサイトをまとめました内部ハードウェア乱数ジェネレーター: