为什么我们使用 RDRAND 之类的指令而不是 I/O 来给出类似的结果?
Why do we have instructions such as RDRAND instead of an I/O which would gives us similar results?
我想知道设计 CPU 生成随机数的特定指令背后的原因是什么?
英特尔处理器有RDRAND
和RDSEED
。 PPC 也有等效的说明。
如果有一个单独的芯片并做一些 I/O 来获得这些数字不是更有意义吗?在我看来,它使 CPU 对于非常专业的指令(大多数软件从不使用随机数!)变得更加复杂,而 I/O 已经存在了很长时间并且应该可以正常工作。
我们都有。
TPM 可以生成 crypto-secure random numbers(毕竟,它是 "crypto-chip")并且 TPM 出现在许多(如果不是全部)自 Haswell 以来基于英特尔的主板上。
专有的 CSRNG PCI(e) 卡也可在市场上买到。
我曾经参加过一个用 Arduino 自制的 CSRNG 的演示。
那家伙对统计或代数一无所知。老实说,整个演示都很可怜。
不能只做一个芯片就说是CSRNG,一定要通过认证,有标准,有方法。
获得这些认证既昂贵又困难。
此外,要处理较宽的带宽,您还需要一个快速 (u) 处理器。
TPM 委员会的目标之一是让它变得便宜,最终结果是 TPM 芯片很慢。
再加上这种芯片的市场需求相对较低,可以清楚地看到CSRNG芯片确实很贵。
外部设备也容易受到物理攻击,芯片很容易被desoldered/decapped或总线窃听或更换。
即使对于 CPU 内部的 CSRNG 也是如此,攻击是已知的,一种是通过改变其晶体管来降低其熵。
然而,这需要完全不同的工具。
PCI(e) CSRNG 可能会使用 DMA 来传输所需的熵字节数,这需要与 OS 的一些协调接口才能知道,例如,何时传输正在进行。
而且,当然,有效载荷将在内存中,这意味着更大的软件表面攻击和将其放入寄存器的额外步骤。
访问内存大约为 ~200-300 个周期。
使用端口映射IO(即in
指令)会将有效负载直接放入寄存器中,但一次只有32位,并且不比普通加载快。
RDRAND
是一条用户模式指令,允许用户模式应用程序访问 CSRNG 而无需任何额外负担,只需检查其支持。
它几乎包含所有最近的 CPUs,几乎感觉它是免费的。
最后还有营销方面的发挥。
如果您的制造工艺有所改进,并在模具中提供了 space 的一些 [insert-a-reasonable-length-unit-here] 平方,则您可以改进微架构或添加新功能。
前者很难,后者相对容易设计,它可能会让你比竞争对手更有优势:常用工具 运行 在你的 CPU 上更快,这只是因为你能负担得起更多 space 中死去。
RdRand 和 RdSeed 中的一个明确设计决定是将其随机数传送到执行指令的程序的目标寄存器中,绕过 OS、库、管理程序、设备驱动程序和任何其他可能会增加攻击面。
将 RNG 放在管芯上是 (a) 显而易见的事情,因为它只是整个管芯的一小部分,并且 (b) 从安全的角度来看是正确的,防止对路径进行简单探测RNG 到 运行 代码。
我想知道设计 CPU 生成随机数的特定指令背后的原因是什么?
英特尔处理器有RDRAND
和RDSEED
。 PPC 也有等效的说明。
如果有一个单独的芯片并做一些 I/O 来获得这些数字不是更有意义吗?在我看来,它使 CPU 对于非常专业的指令(大多数软件从不使用随机数!)变得更加复杂,而 I/O 已经存在了很长时间并且应该可以正常工作。
我们都有。
TPM 可以生成 crypto-secure random numbers(毕竟,它是 "crypto-chip")并且 TPM 出现在许多(如果不是全部)自 Haswell 以来基于英特尔的主板上。
专有的 CSRNG PCI(e) 卡也可在市场上买到。
我曾经参加过一个用 Arduino 自制的 CSRNG 的演示。
那家伙对统计或代数一无所知。老实说,整个演示都很可怜。
不能只做一个芯片就说是CSRNG,一定要通过认证,有标准,有方法。
获得这些认证既昂贵又困难。
此外,要处理较宽的带宽,您还需要一个快速 (u) 处理器。
TPM 委员会的目标之一是让它变得便宜,最终结果是 TPM 芯片很慢。
再加上这种芯片的市场需求相对较低,可以清楚地看到CSRNG芯片确实很贵。
外部设备也容易受到物理攻击,芯片很容易被desoldered/decapped或总线窃听或更换。
即使对于 CPU 内部的 CSRNG 也是如此,攻击是已知的,一种是通过改变其晶体管来降低其熵。
然而,这需要完全不同的工具。
PCI(e) CSRNG 可能会使用 DMA 来传输所需的熵字节数,这需要与 OS 的一些协调接口才能知道,例如,何时传输正在进行。
而且,当然,有效载荷将在内存中,这意味着更大的软件表面攻击和将其放入寄存器的额外步骤。
访问内存大约为 ~200-300 个周期。
使用端口映射IO(即in
指令)会将有效负载直接放入寄存器中,但一次只有32位,并且不比普通加载快。
RDRAND
是一条用户模式指令,允许用户模式应用程序访问 CSRNG 而无需任何额外负担,只需检查其支持。
它几乎包含所有最近的 CPUs,几乎感觉它是免费的。
最后还有营销方面的发挥。
如果您的制造工艺有所改进,并在模具中提供了 space 的一些 [insert-a-reasonable-length-unit-here] 平方,则您可以改进微架构或添加新功能。
前者很难,后者相对容易设计,它可能会让你比竞争对手更有优势:常用工具 运行 在你的 CPU 上更快,这只是因为你能负担得起更多 space 中死去。
RdRand 和 RdSeed 中的一个明确设计决定是将其随机数传送到执行指令的程序的目标寄存器中,绕过 OS、库、管理程序、设备驱动程序和任何其他可能会增加攻击面。
将 RNG 放在管芯上是 (a) 显而易见的事情,因为它只是整个管芯的一小部分,并且 (b) 从安全的角度来看是正确的,防止对路径进行简单探测RNG 到 运行 代码。