我已经看到英特尔似乎包含了一个新的组装函数,以获得从硬件获得的真实随机数。该指令名为RdRand,但只有少量的详细信息似乎可以在Internet上访问:http://en.wikipedia.org/wiki/RdRand。
我对这一新指令及其在C++11中的使用提出以下问题:
RdRand生成的随机数真的是随机的吗?(由不相关白噪声或量子过程产生的每一位?)std::random_device,但是如果指令可用,编译器是否已经调用了RdRand?RdRand?发布于 2013-07-12 14:22:22
std::random_device不需要硬件驱动,即使是硬件驱动,也不需要使用rdrand。您可以问它的double entropy() const noexcept成员函数是否是硬件驱动的。为此使用rdrand是一个QoI问题,但我希望所有有此功能的正常实现都能这样做(我见过gcc这样做)。如果不确定,您可以始终检查程序集,但硬件随机性的其他方法也应该足够好(还有其他专用硬件可用)。entropy,如果对rdrand感兴趣,请扫描生成的机器代码。发布于 2013-08-01 21:30:03
我设计了向RdRand指令提供随机数的随机数生成器。所以改变一下,我真的知道答案。
1)随机数产生于SP800-90AES-CTR兼容PRNG。AES使用128位密钥,因此这些数字具有高达128位的乘法预测电阻和超过128位的加性。
然而,PRNG经常是从全熵源重新分配的。对于隔离的RdRand指令,它将被重新安装。对于4个核心上的8个线程尽可能快地拉,它将总是被重新加载频率超过每14 RdRands一次。
种子来自一个真正的随机数发生器。这涉及到一个2.5Gbps的熵源,它被输入到一个3:1的压缩比熵提取器使用AES-CBC-MAC。
因此,它实际上是一个TRNG,但是当重加载时,它会回到密码安全的PRNG的属性中。
这正是linux上/dev/随机和/dev/urandom之间的语义区别,只是速度要快得多。
熵最终是从量子过程中收集的,因为这是我们所知道的自然界中唯一的基本随机过程。在DRNG中,具体而言,驱动亚稳态锁存器分辨率的是4个晶体管门的热噪声,每秒25亿次。
熵源和调理器旨在与SP80090B和SP80090C兼容,但这些规范仍处于草案形式。
2) RdRand是标准英特尔指令集的一部分。它将在未来的所有CPU产品中得到支持。
3)您要么需要使用内联程序集,要么需要使用RdRand的库(如openssl)。如果使用库,库将实现可以直接实现的内联汇编程序。英特尔在他们的网站上给出了代码示例。
还有人提到图书馆员。是我写的。这相当简单。
4)只需查找二进制中的RdRand操作码即可。
发布于 2014-03-26 11:52:50
由于PRISM和斯诺登的揭露,我会非常小心地使用硬件随机生成器,或者依赖一个库,在一个有安全问题的应用程序中。我更喜欢使用独立的开源密码随机生成器的组合。例如,通过组合,我的意思是:让ra、rb、rc是三个独立的密码随机生成器,r是返回应用程序的随机值。让我们让sa,sb,sc作为他们的种子,ta,tb,tc,再播种期,例如,再播种rb,每一次tb抽吸。独立的:尽可能独立的库,依赖不同的密码或算法。
伪码:
// 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。
https://stackoverflow.com/questions/17616960
复制相似问题