利用沙桥的硬件真随机数发生器?

dte*_*ech 10 c++ hardware numbers intel generator

我想知道是否有办法利用英特尔沙桥CPU中的新硬件真数发生器?我读到英特尔的MKL(数学内核库)公开了这个功能,但这需要MKL套件和英特尔编译器,结果相当昂贵.

有没有其他方法在我的C++代码中使用硬件随机数生成器?例如,一个不错的,仅标题库?

小智 10

英特尔已rdrandhttp://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide上发布了该指令的手册,库和代码示例.

从自述文件:

"因为许多编译器工具链不支持这个新指令,所以创建这个库是为了方便访问它.这个想法很简单:链接到一个内置的静态库并享受新功能!"

有所有库调用的例子main.c.

我能够在Mac OS X上的gcc中编译静态库和测试程序.该文档表明它还兼容Linux和Windows.

请注意,这rdrand实际上是一个128位伪随机数生成器,具有硬件生成的熵.(即将推出的Broadwell架构将提供rdseed访问真正随机数生成器的指令.)有关差异及其含义的详细信息,请参阅http://software.intel.com/en-us上的"长答案"标题./ blogs/2012/11/17/the-difference-rdrand-and-rdseed.


Bas*_*tch 0

这可能取决于您的操作系统。我想象最近的 GNU/Linux 内核可能会使用硬件随机生成器/dev/random(因为random(4)手册页表明它使用噪声),但我可能是错的。

通常的做法是使用一些常见的伪随机生成器(例如标准random(3)函数),但在启动应用程序时从一些更随机的源(例如读取/dev/urandom、使用getpid()以及当前时间的某些内容gettimeofday()等)为其提供种子。

很可能,获得非常好的随机数是一门黑术,至少对我来说是这样。但上述解决方案至少具有不易从一个应用程序运行复制到另一个应用程序的优点。

如果您的应用程序是持久的(例如,在同一个进程中运行多个小时的 Web 服务),您可能会不时地重新播种您的伪随机数生成器。对于 Web 服务器,我想您也可以使用请求时间(以毫秒粒度测量它们)作为随机性来源(为您的 PRNG 播种)。

  • 这里有一个关于 RDRAND 和 `/dev/random` 的线程:http://www.spinics.net/lists/linux-crypto/msg05883.html,尽管我不知道他们所说的是否正是发生的事情或将会发生。要点是你是对的,看起来它将被用作 `/dev/random` 的熵源,尽管它并不像 `/dev/random` 只是返回调用结果那么简单研发。 (2认同)