Intel Digital Random Number Generator / rdrand
シミュレーションを行ったり暗号化を行うときに、乱数生成器を用います。コンピュータは決定論的に動作するので、プログラム中で真にランダムな乱数を得ることは難しいです。そこで、暗号論的疑似乱数生成器が用いられます。
LinuxやmacOSでは、/dev/randomなどがよく使われる暗号論的疑似乱数生成器です。これらは物理的なソースをエントロピー源として利用します。一般的な実装では、HDDやメモリ、マウス、キーボード等の、よく変動する予測が難しい情報を利用して乱数を生成するようです。
しかしこうしたエントロピー源から得られる値は、本当に一様分布で統計的に予測ができないかと言われるとそうとも言い切れません。そこで近年のIntel x86_64チップには、デジタル乱数生成器(Intel Digital Random Number Generator: DRNG)が搭載されており、シリコンの熱雑音を用いて乱数を得ることができます。これを用いて乱数を得るrdrand命令が用意されています。
Intel DRNGの構成
コード
rdrand レジスタ名で適当なレジスタにランダムな値を格納してくれます。setcでちゃんと生成されたどうか、結果のステータスも受け取ることができます。
これをC及びRustから呼び出すコードを書いてみました。
動かしてみると、ランダムな数字が出力されるのがわかるかと思います。
おわりに
たのしかったです(小並感)。初めてRustでインラインアセンブリを書く経験をしたので、勉強になりました。
小ネタ
Intelが誠実なHW実装をしているかは信じるしかないみたいなところがあるので、Linuxの/dev/randomではrdrandをそのまま使うようなことはしていないそうです。