当前位置: 首页 > 知识库问答 >
问题:

为什么我们有RDRAND这样的指令,而没有I/O这样的指令,它会给出类似的结果?

澹台志诚
2023-03-14

我想知道为什么要设计一个特定于CPU的指令来生成随机数?

英特尔处理器具有RDRAND和RDSEED。PPC还有一条等效指令。

拥有一个单独的芯片并执行一些I/O来获取这些数字不是更有意义吗?在我看来,对于非常专业的指令(大多数软件从不使用随机数!)当I/O已经存在了很长时间并且应该可以正常工作时,它似乎使CPU更加复杂。

共有2个答案

戈华茂
2023-03-14

RdRand和RdSeed中的一个明确设计决策是,它将其随机数传递到执行指令的程序的目标寄存器中,绕过操作系统、库、管理程序、设备驱动程序和任何其他可能出现增加攻击面的东西。

将RNG放在骰子上是(a)显而易见的事情,因为它只是整个骰子的一小部分;(b)从安全的角度来看,这是正确的事情,防止了对从RNG到运行代码的路径的简单探测。

祁远
2023-03-14

我们两者都有。
TPM可以生成加密安全随机数(毕竟,它是一个“加密芯片”),并且自Haswell以来,TPM存在于许多(如果不是全部)基于英特尔的主板上。
专有CSRNG PCI(e)卡也可在商业上获得。

我曾与Arduino一起参加了一场自制CSRNG的演示<那家伙不懂统计学或代数。老实说,整个演讲都很可怜<你不能仅仅制造一个芯片并声称它是CSRNG,你必须获得认证,有标准和方法<获得这些认证既昂贵又困难。

此外,要处理较宽的带宽,还需要一个快速(u)处理器

如果你加上相对较低的市场需求,我们可以清楚地看到CSRNG芯片确实很贵。

外部设备也容易受到物理攻击,芯片很容易脱焊/去封装,或者总线被抽头或更换<即使是CPU内部的CSRNG也是如此,攻击是已知的,通过改变晶体管来降低其熵<然而,这需要一种完全不同的工具。

PCI(e)CSRNG可能会使用DMA来传输所需数量的熵字节,这需要与OS的一些协调接口才能知道,例如,当传输正在进行时。

当然,有效载荷将在内存中,这意味着更大的软件表面攻击和将其放入寄存器的额外步骤<访问内存的周期约为200-300个周期。

使用端口映射IO(即指令中的)将有效负载直接带到寄存器中,但一次仅32位,且不比普通负载快。

RDRAND是一种用户模式指令,允许用户模式应用程序访问CSRNG,无需额外负担,只需检查其支持<几乎所有最新的CPU都配备了它,几乎感觉它是免费的。

最后,还有一个营销方面
如果您的制造工艺有所改进,并且在模具中给了您几平方的空间,您可以改进微结构或添加新功能<前者很难,后者相对容易设计,它可能会给你带来超越竞争对手的提升:普通工具在你的CPU上运行得更快,这仅仅是因为你可以在芯片上提供更多的空间。

 类似资料:
  • 我已经花了一个多小时试图解决这个问题,但我什么都没做。 当我试图使用Maven编译我的项目时,我得到了以下错误: [错误]无法执行目标组织。阿帕奇。专家插件:maven assembly插件:2.2-beta-5:single(默认cli)在GankALane项目上:无法解析mojo org的配置。阿帕奇。专家插件:maven assembly插件:2.2-beta-5:单参数存档:在组织中找不到

  • 8.1.2 I/O指令 由于I/O端口地址和内存单元地址是相互独立的,这些端口地址不能普通的访问内存指令来访问其信息,所以,在CPU的指令系统中就专门设置了I/O指令来存取I/O端口的信息。按功能分类来看,I/O指令应属于数据传送指令。 1、输入指令IN 输入指令IN的一般格式如下: IN AL/AX, PortNo/DX 该指令的作用是从端口中读入一个字节或字,并保存在寄存器AL或AX中。如果某

  • 80386的I/O指令使得处理器可以访问I/O端口,以便从外设输入数据,或者向外设发送数据。这些指令有一个指定I/O空间端口地址的操作数。有两类的I/O指令: 1、 在寄存器指定的地址传送一个数据(字节、字、双字)。 2、 传送指定内存中的一串数据(字节串、字串、双字串)。这些被称作为“串 I/O指令”或者说“块I/O指令”。 8.2.1 寄存器I/O指令(Register I/O Instruc

  • 问题内容: 罐(bcprov-jdk16-145.jar)已添加到项目中,已添加到类中,并且确实返回“ BC”,但AesFileIo.writeFile()仍会抛出。有任何想法吗? 问题答案: 我对Android sdk不太熟悉,但是似乎提供程序附带的安全性已经增加了。 在PC环境中,您只需手动添加即可, 如果您有权访问该文件,只需添加一个条目,如: 注意,它等于已添加的提供程序的序号。

  • 问题内容: 我是django的新手,目前正在学习主要教程。即使它工作的更早,当我执行python manage.py runserver或python manage.py -h或任何其他命令时,shell不会输出任何内容。想知道我在做什么错。 问题答案: 首先,通过在外壳中键入“ python”来检查python是否已完全安装。 然后,您应该在django项目中尝试。如果您没有django专案,请

  • 问题内容: 我正在使用Django-CMS的Django项目中构建一个相当简单的应用程序,即研究项目。(这是我对项目/应用程序的首次尝试。)它的主要目的是存储各种知识资产(例如,研究人员撰写的文章,书籍等)。 问题是,当我将浏览器指向/ research /时,出现一条错误,提示表’research_journal’不存在(“ no such table”)。 我正在使用带有sqlite3数据库的