スキップしてメイン コンテンツに移動

Intel DRNG (rdrand)を使ってみる in C/Rust

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をそのまま使うようなことはしていないそうです。

参考

コメント

このブログの人気の投稿

ERC-165: Standard Interface Detection まとめ

先日EthereumのERC-165を読んでいたので, 備忘録として日本語でまとめを記しておきます. ERC-165: Standard Interface Detection このERCでは, スマートコントラクトがどのようなInterfaceを実装しているのかを公開・検出する方法を定義しています. これによって, 目の前のスマコンがERC-20準拠なのかとか, あのInterfaceを実装しているのかとかを調べることができるという嬉しいポイントがあります. Interfaceとは? これこれ. プログラミング言語によってはInterfaceの概念がないものもあったりして馴染みのない方ももしかしたらいるかもしれません. このコントラクトは, こういうメソッドを持つよ! というお約束を書くアレです. 標準化した内容 以下の4つを標準化しました. Interfaceの識別方法 コントラクトが実装しているInterfaceを公開する方法 コントラクトがERC-165を実装しているかを検出する方法 コントラクトが, 任意のInterfaceを実装しているかを検出する方法 1. Interfaceの識別方法 Interface識別子というものを導入します. Interface識別子というのは, 全てのFunction Selectorのxorを取ることで計算されます. Function Selector自体は bytes4(keccak256("関数名(引数の型)")) で計算されます. Function Selectorってなんやねんという方は, こちらの記事を読むとスッキリすると思います. Solidity Assembly入門 ~ Function Selector ~ - アルゴリズムとかオーダーとか なのでざっくり言うと, 目の前のコントラクトがERC-20に準拠しているか知りたかったら, ERC-20が備えているべきInterfaceの識別子を計算し, それをコントラクトに渡してお前はこのInterface持っとるかと聞けばいいわけですね. 2. コントラクトが実装しているInterfaceを公開する方法 目の前のコントラクトに, 「(少なくとも)このInterfaceをサポートしてますか?」と聞いたら, はい or いいえのbool

DID/VC超入門

 新年あけましておめでとうございます。 大学の研究会にてDID/VC入門講座を開催したので、その際に使用したスライドを供養しておきます。 did:webメソッドを用いてDIDを発行するチュートリアルも含まれています。 スライドPDF