2013-07-12 21 views
15

私は、Intelがハードウェアから得た実際の乱数を得るための新しいアセンブリ関数を含んでいるようだと見てきました。命令の名前はRdRandですが、細部のわずかな量は、インターネット上でそれにアクセスできるように見える:この新しい命令およびC++ 11での使用に関するhttp://en.wikipedia.org/wiki/RdRandC++ 11とRDRANDの本当の乱数

私の質問は次のとおりです。

  1. RdRandで生成される乱数は、実際にはランダムですか? (各ビットは無相関のホワイトノイズまたは量子プロセスから生成されます)

  2. Ivy Bridgeプロセッサの特別な機能であり、インテルはこの機能を次世代のCPUに実装し続けますか?

  3. C++ 11での使用方法は?たぶんstd::random_deviceであるかもしれませんが、命令が利用可能ならコンパイラはすでにRdRandを呼び出していますか?

  4. プログラムをコンパイルするときにRdRandが実際に呼び出されるかどうかをチェックする方法はありますか?確かに、宇宙の決定論のビューに依存

+0

私は[Intel Manual](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)をチェックします。これは、 CPUインタフェース。 –

+1

それはまだHaswellにあります - これまでのところ、それは滞在しているように見えます。 – harold

+2

代わりにDavid Johnstonの答えを受け入れるべきでしょうか? – user763305

答えて

5
  1. は、これより哲学的な質問ですが、多くの人々はそれがランダムであることを検討してください。
  2. のみIntelは知っているだろうが、それを追加するための需要があったことから、その可能性は
  3. std::random_deviceは、ハードウェアを駆動する必要がなく、それがある場合でも、使用する必要はありませんが、それを維持するために需要があるだろうrdranddouble entropy() const noexceptメンバー関数がハードウェア駆動かどうかを問うことができます。 rdrandを使用しているのはQoIの問題ですが、私はそれが可能であることを期待しています(gccのように見てきました)。確信が持てない場合は、いつでもアセンブリをチェックすることができますが、ハードウェアランダム性の他の手段も十分に良いはずです(他の専用ハードウェアもあります)。
  4. 上記の唯一のハードウェアに興味がある場合は、entropyを使用してください。rdrandに興味がある場合は、生成されたマシンコードをスキャンしてください。私は、彼らがいると思う
+0

libC++の 'random_device'の実装は、デフォルトで'/dev/urandom'またはユーザが指定した別のファイルを使います。 VS2012の実装は、Windowのクライオグラフィーサービスを使用します。 – bames53

-1
  1. は、それが暗号化のためなので...ランダム「であると言われ、」。私は乱数の質についてあまり心配しないでしょう。
  2. 私は、この命令が将来役に立たないかもしれないとしても、常に下位互換性を重要視しているので、インテルはこれを続けていくと思います。
  3. 申し訳ありませんが、私はC++ 11を使用していないため、この質問に答えることはできません。
  4. アセンブリコードを調べたくない場合は、librdrand.aを試すことができます。インテルは、同社のWebサイトで無料でライブラリを提供しています。私はそれをテストしました、それは非常に便利で、エラー報告メカニズムを持っています(乱数ジェネレータは乱数を生成できない確率が低いため)。したがって、このライブラリを使用する場合は、ライブラリの関数の戻り値を確認する必要があります

私の返信に何か問題がある場合はお知らせください。おかげ

幸運

xiangpisaiMM

+4

"暗号化のため、乱数の品質についてあまり心配しません。" - Whaaat? –

42

私はRdRand命令に乱数を提供する乱数生成器を設計しました。ですから、私は本当に答えを知っています。

1)乱数は、SP800-90 AES-CTR DRBG準拠PRNGから生成されます。 AESは128ビット鍵を使用するので、128ビットまでの乗法予測抵抗と128を超える加算値を持つ。

しかし、PRNGは完全なエントロピー源から頻繁に再供給される。孤立したRdRand命令については、新しく再シードされます。可能な限り高速に引き出す4つのコア上の8つのスレッドについては、14のRdRandsに1回より頻繁に再シードされます。

種は真の乱数発生器から来ます。これには、AES-CBC-MACを使用する3:1圧縮比エントロピー抽出器に供給される2.5Gbpsエントロピーソースが関係します。

TRNGですが、重負荷時には短いシーケンスのために暗号的に安全なPRNGのプロパティに戻ってしまいます。

これはまさにLinuxの/ dev/randomと/ dev/urandomの意味の違いです。

エントロピーは、量子プロセスから最終的に集められます。これは、自然界で私たちが知っている唯一の基本ランダムプロセスです。 DRNGでは、準安定ラッチの分解能状態を駆動する4つのトランジスタのゲートにおける熱雑音が特に発生します(25億回/秒)。

エントロピーソースとコンディショナーは、SP800-90BおよびSP800-90Cに準拠していますが、これらの仕様はまだドラフト形式です。

2)RdRandは、標準のインテル命令セットの一部です。将来すべてのCPU製品でサポートされる予定です。

3)RdRandを使用するインラインアセンブリまたはライブラリ(opensslなど)を使用する必要があります。ライブラリを使用する場合、ライブラリは直接インプリメントできるインラインアセンブラを実装しています。インテルは、Webサイトでコード例を示しています。

他の人がlibrdrand.aに言及しました。私はそれを書いた。それはかなり簡単です。

4)RdRandオペコードをバイナリで探します。

3

PRISMとSnowdenの啓示以来、私は、ハードウェアランダムジェネレータを使用したり、セキュリティ上の懸念があるアプリケーションで単一のライブラリに依存することに非常に注意しています。私は独立したオープンソース暗号ランダム発電機の組み合わせを使うことを好む。例えば、 を意味します。ra,rbrcは3つの独立した暗号化ランダム生成器、rはアプリケーションに返されるランダムな値です。 sasbscを種とすると、tatbtcとなる。すべてのtbが引き分けたrbです。 独立系:できるだけ独立したライブラリに属し、異なるサイファーやアルゴリズムに依存する。

擬似コード:もちろん

// init 
seed std rand with time (at least millisec, preferably microsec) 
sa = std rand xor time // of course, not the same time evaluation 
// loop 
sb = ra every tb 
sc = rb every tc 
r = rb xor rc 
sa = rc every ta 

、すべてのドローは一度だけ使用しなければなりません。

おそらく二つのソースは十分にある。

// init 
seed std rand with time (at least millisec, preferably microsec) 
sa = std rand xor time // of course, not the same time evaluation 
// loop 
sb = ra every tb 
sa = rb every ta 
r = rb xor ra 

はTA、TB、TCのために別の値を選択してください。それらの範囲は、使用するランダムなソースの強度に依存します。

編集:私はこの目的のために新しいライブラリABaDooRandを開始しました。

+5

PRISMと複数のソースを使用することについての良い点。しかし、std :: randはゴミであり、誰もそれをこれ以上使用する必要はありません(https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmfulを参照)。その他の提案:プロセスの開始、ユーザー入力、ネットワークトラフィックなど、rdrandと/ dev/random(Linuxの場合)とアプリケーションレベルの高解像度タイムスタンプ(またはそれらの下位ビットのみ)を組み合わせることもできます。有用。多くのデータが必要な場合は、前述の値を使用して、この能力を持つ暗号強度のPRNGを段階的にシードします。 –

+0

確かに、あなたのコメントのおかげで。 – lalebarde

1

1)いいえ、RdRandからの数字は、暗号的に安全な擬似乱数ジェネレータから来ているため、本当にランダムではありません。しかし、RdRand、RdSeed、Intel Secure Keyの技術は、おそらく本当にランダムに最も近いでしょう。

2)はい、この機能は、Ivy Bridgeプロセッサで始まるラップトップ、デスクトップ、およびサーバーに表示されるすべてのIntelプロセッサで使用できます。最近では、この機能もAMDチップに実装されています。

3および4)インテルソフトウェア開発ガイドは、これらの回答を探す場所です。インテルセキュア・キーが天体物理的問題(http://iopscience.iop.org/article/10.3847/1538-4357/aa7ede/meta;jsessionid=A9DA9DDB925E6522D058F3CEEC7D0B21.ip-10-40-2-120)に適用され、非ペルウォール型バージョン(https://arxiv.org/abs/1707.02212)にどのように適用されるかについての興味深い議論があります。このホワイトペーパーでは、テクノロジの仕組み、実装方法、およびパフォーマンスについて説明します(2.2.1項および5項)。クラスのためにそれを読む必要があった。

+0

リンクが不良です。より良いリンク:[インテル®DRNG](https://software.intel.com/sites/default/files/m/d/4/1/d/8/441_Intel_R__DRNG_Software_Implementation_Guide_final_Aug7.pdf)、[インテル®DRNGソフトウェア実装ガイド] (https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide)およびWikipedia [RdRand](https://en.wikipedia.org)/wiki/RdRand)。 – zaph