问题标签 [rdrand]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
6051 浏览

assembly - Ivy Bridge 上 RDRAND 指令的延迟和吞吐量是多少?

我在agner.org上找不到任何关于RDRAND指令的延迟或吞吐量的信息。但是,这个处理器是存在的,所以信息必须在那里。

编辑:实际上最新的优化手册提到了这个指令。它被记录为 <200 个周期,在 Ivy Bridge 上的总带宽至少为 500MB/s。但是关于这条指令的一些更深入的统计数据会很好,因为延迟和吞吐量是可变的。

0 投票
2 回答
4011 浏览

c++ - 如何使用汇编程序从英特尔处理器中获取随机数?

我需要从处理器(英特尔酷睿 i3)中的英特尔随机生成器获取随机数。我不想使用任何库。我想在 C++ 中使用汇编程序粘贴,但我不知道应该使用哪些寄存器和指令。

0 投票
2 回答
338 浏览

c# - 在 c# 中构建一个整数数组,每个调用 c++ 或在 c++ 中构建并传递给 c#?

我用 C++ 编写了一个函数,让我通过一个内在函数利用新的英特尔 RdRand 数字随机数生成器。

我已经将它包装起来,以便我可以通过 PInvoke 在 C# 中使用它,它工作正常,如下所示:

我的用例通常可能涉及请求多个随机数,尽管一次可能只有数百个(每个请求者)。我的问题是,无论如何我都在使用 C++,将另一个可以返回随机数的动态数组(或向量)的函数放在一起是否有意义,即这是否会比仅多次调用 C++ DLL 大大提高性能? 性能是一个问题,因为这将在一个服务器应用程序上,该应用程序可能会在相似的时间向许多客户端发送约 200 个随机数

如果值得去做,我将如何去做?我正在考虑以下内容,尽管我的猜测是找到一种将向量导入 C# 的方法很容易成为性能问题?

最后,Marshal.Copy 会比后一种方法更好吗,如果可以的话,谁能指出我正确的方向?

0 投票
3 回答
1633 浏览

assembly - 常春藤桥上RDRAND的用尽特性是什么?

在查看了英特尔数字随机数生成器 (DRNG) 软件实施指南RDRAND后,我对调用生成器的内部状态会发生什么有一些疑问。不幸的是,答案似乎不在指南中。

  1. 根据该指南,在 DRNG 内部有四个 128 位缓冲区,用于提供随机位以RDRAND进行排空。RDRAND本身将根据目标寄存器的宽度提供 16、32 或 64 位随机数据​​:

    使用更大的目标寄存器会更快地清空那些 128 位缓冲区吗?例如,如果我只需要 2 位随机性,我应该经历使用 16 位寄存器而不是 64 位寄存器的麻烦吗?这会对 DRNG 的吞吐量产生任何影响吗?我想避免消耗不必要的随机性。

  2. 该指南说进位标志将在RDRAND执行后设置:

    “不可用”是什么意思?随机数据是否会因为RDRAND调用过快耗尽那些 128 位缓冲区而无法使用?或者不可用是否意味着 DRNG 未通过健康检查并且无法生成任何新数据?RDRAND基本上,我试图了解 CF=0 是否会因为调用时缓冲区碰巧(暂时)为空而发生。

注意:我已经查看了有关 RDRAND 吞吐量和延迟的问题的答案,但我正在寻找不同的信息。

谢谢!

0 投票
1 回答
2964 浏览

c# - 从 C# 与英特尔的新 DRNG(RDRAND 指令)交互的方式?

我希望从 C# 程序集中使用英特尔的数字随机数生成器(Ivy Bridge 中的 RDRAND 指令)。我查看了 cpp 库,但我希望有一个更“托管”的解决方案。有任何想法吗?

0 投票
5 回答
6796 浏览

c++ - 使用 C++11 和 RDRAND 的真随机数

我已经看到英特尔似乎包含了一个新的汇编函数来获取从硬件获得的真实随机数。该指令的名称是RdRand,但在 Internet 上似乎只有少量细节可以访问:http ://en.wikipedia.org/wiki/RdRand

我对这条新指令及其在 C++11 中的使用的问题如下:

  1. 生成的随机数RdRand真的是随机的吗?(由不相关的白噪声或量子过程产生的每一位?)

  2. 它是 Ivy Bridge 处理器的一个特殊功能吗?英特尔会在下一代 cpu 中继续实现这个功能吗?

  3. 如何通过 C++11 使用它?也许有,std::random_deviceRdRand如果指令可用,编译器是否已经调用?

  4. 编译程序时如何检查是否RdRand真的被调用?

0 投票
1 回答
332 浏览

security - 读取英特尔 DRBG 参数

较新的英特尔处理器包括一个 DRBG,它可以生成随机数,您可以使用 RDRAND 指令读取这些随机数。它涉及从硬件熵源生成的 256 位种子 S,该熵源依赖于亚稳态振荡器中的噪声。用于得出数字的算法是有效的AES(K,V),其中 K 是从 S 的一半派生的临时密钥,而 V 是从 S 的另一半派生的 IV。无论如何,我认为;一些对其进行审核的人对此进行了更好的解释。

由于各种原因,我想以编程方式就地审核该机制的性能,这需要能够读取或导出两件事:

  • S 的值
  • K 或 V 的值

使用这个和 RDRAND 在多次迭代中的输出将为我提供做出此决定所需的测试数据。

但是,在软件开发人员手册或其他地方,我找不到任何记录在案的方法来完成这些任务中的任何一个。

假设我愿意编写一个 Linux 内核模块来实现这一点,并且我愿意为此使用 RDMSR 或任何其他可用的方法,包括调用诸如 MEI 之类的片上设备,是否有可能获取这些数据?

0 投票
1 回答
1491 浏览

assembly - FLAGS/EFLAGS 是 clobber 列表的“CC”(条件控制)的一部分吗?

这是对What is "=qm" in extended assembler的跟进。

使用 时RDRAND,它设置(或取消设置)进位标志 ( CF):

FLAGS和寄存器是否EFLAGS被视为条件控制的一部分,以便将正确的信息传达给编译器?上面应该写成:

还是使用了"cc"spurious?

我知道在不需要时使用它是无害的。从扩展 ASM

如果您的汇编指令可以更改条件代码寄存器,请将“cc”添加到已破坏的寄存器列表中。某些机器上的 GCC 将条件代码表示为特定的硬件寄存器;'cc' 用来命名这个寄存器。在其他机器上,条件码的处理方式不同,指定 'cc' 无效。但无论什么机器都是有效的。

如果它是虚假的,它适用于哪些架构?(我假设 ARM 和CPSR寄存器,但我可能弄错了)。

0 投票
3 回答
2781 浏览

python - 使用 python 中的硬件 rng

是否有任何现成的库,以便 numpy 程序可以使用英特尔硬件 prng(rdrand)来填充随机数的缓冲区?

如果失败了,有人可以为我可以适应或使用的一些 C 代码指明正确的方向(我将 CPython 和 Cython 与 numpy 一起使用,因此最小的包装器 shd 就足够了)。

我想要的随机生成器是 [0,1) 之间的统一随机数。

0 投票
5 回答
13427 浏览

random - 英特尔的 RDRAND 有任何合法用途吗?

今天我想:好吧,即使对NIST SP 800-90A的 RDRAND 实现有很大的怀疑,它仍然是伪随机数生成器 (PRNG) 的硬件实现,对于非敏感应用程序来说必须足够好。所以我想在我的游戏中使用它而不是 Mersenne Twister。

因此,为了查看使用该指令是否有任何性能提升,我比较了以下两个代码的时间:

通过运行这两个我得到:

因此,Mersenne Twister 在我的 CPU 上比 RDRAND 快得多。好吧,我很失望,被排除在我的比赛之外。但是 RDRAND 是一种加密安全的 PRNG (CSPRNG),所以它在幕后做了很多事情……更公平的是,将它与其他 CSPRNG 进行比较。所以我采用了我的Rabbit实现(将 RFC 简单翻译为 C,没有花哨的性能技巧),并编写了以下测试:

令我惊讶的是,生成的伪随机数据是前两个的两倍,我得到了比 RDRAND 更好的时间:

这三个都是在启用优化的情况下编译的。

因此,我们普遍怀疑 RDRAND 是为了将 NSA 后门嵌入到每个人的软件密码学中。此外,我们至少有一个软件 CSPRNG 比 RDRAND 快,并且使用最广泛的体面 PRNG Mersenne Twister比 RDRAND快得多。最后,我们有开源的可审计软件熵池,比如/dev/random/dev/urandom,它们没有隐藏在 AES 的双重加扰器层之后,比如 RDRAND。

那么问题来了:人们应该使用 RDRAND 吗?它有什么合法用途吗?还是我们应该完全停止使用它?