【问题标题】:Making use of sandy bridge's hardware true random number generator?使用沙桥的硬件真随机数生成器?
【发布时间】:2011-12-15 15:42:16
【问题描述】:

我想知道是否有一种方法可以利用 intel 的 Sandy Bridge CPU 中新的基于硬件的真数生成器?我读到英特尔的 MKL(数学内核库)公开了这个功能,但这需要 MKL 套件和英特尔编译器,最终相当昂贵。

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

【问题讨论】:

  • 哪个操作系统平台?如果它基于硬件功能在 Linux 和 Windows 中自动完成,我不会感到惊讶。
  • 我正在 windows 7 下开发,但我的项目使用 Qt,最终将同时针对 windows 和 linux,如果 Qt cocoa 兼容性很快修复,希望 macOS 也是如此
  • 只需要写一点内联汇编来执行 RDRAND 指令。或者等待你的编译器支持内在函数。或者更好的是,等待几年,这样您的用户就有可能拥有支持它的机器。手册在这里:software.intel.com/file/36945

标签: c++ numbers hardware generator intel


【解决方案1】:

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

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

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

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

【讨论】:

  • 这里有一个关于 RDRAND 和/dev/random 的帖子:spinics.net/lists/linux-crypto/msg05883.html,虽然我不知道他们所说的究竟是什么已经发生或将要发生。要点是你是对的,它看起来好像将用作/dev/random 的熵源,尽管它不像/dev/random 那样简单,只是返回对 RDRAND 的调用结果。
【解决方案2】:

英特尔在http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide 发布了rdrand 指令的手册、库和代码示例。

来自自述文件:

“由于许多编译器工具链不支持这个新指令,这个库是 创建以方便访问它。这个想法很简单:链接到已构建的静态库并享受新功能!”

main.c 中有所有库调用的示例。

我能够在 Mac OS X 上用 gcc 编译静态库和测试程序。文档指出它还兼容 Linux 和 Windows。

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

【讨论】:

    【解决方案3】:

    示例代码如下:

    #include <immintrin.h>
    #include <cstdint>
    ...
    uint64_t val;
    if(!_rdseed64_step(&val)) {
      printf("Error generating hardware random value\n");
    }
    // Now val contains 64-bit pseudo-random number
    
    uint64_t val;
    if(!_rdrand64_step(&val)) {
      printf("Error generating hardware random value\n");
    }
    // Now val contains 64-bit true random number
    

    参考:Intel Intrinsics Guide

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 2010-11-17
      • 2013-11-09
      • 2013-10-06
      • 2023-03-15
      • 1970-01-01
      • 2013-01-08
      相关资源
      最近更新 更多