<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=RdRand</id>
	<title>RdRand - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=RdRand"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=RdRand&amp;action=history"/>
	<updated>2026-07-12T01:30:14Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=RdRand&amp;diff=2947897&amp;oldid=prev</id>
		<title>imported&gt;Hehua：​加入{{Rough translation}}标记</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=RdRand&amp;diff=2947897&amp;oldid=prev"/>
		<updated>2023-07-13T03:41:24Z</updated>

		<summary type="html">&lt;p&gt;加入{{&lt;a href=&quot;/wiki/Template:Rough_translation&quot; title=&quot;Template:Rough translation&quot;&gt;Rough translation&lt;/a&gt;}}标记&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Rough translation|time=2023-07-13T03:41:24+00:00}}&lt;br /&gt;
{{NoteTA&lt;br /&gt;
|G1=IT&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;（之前被称为&amp;#039;&amp;#039;&amp;#039;Bull Mountain&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url          = http://software.intel.com/en-us/blogs/2011/06/22/find-out-about-intels-new-rdrand-instruction&lt;br /&gt;
 |title        = Find out about Intel&amp;#039;s new RdRand Instruction.&lt;br /&gt;
 |last         = Hofemeier&lt;br /&gt;
 |first        = Gael&lt;br /&gt;
 |date         = 2011-06-22&lt;br /&gt;
 |website      = Intel Developer Zone Blogs&lt;br /&gt;
 |publisher    = &lt;br /&gt;
 |accessdate   = December 2013&lt;br /&gt;
 |archive-date = 2017-09-26&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20170926235822/https://software.intel.com/en-us/blogs/2011/06/22/find-out-about-intels-new-rdrand-instruction&lt;br /&gt;
 |dead-url     = no&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;）是一个计算机指令，用于从[[芯片]]上的[[硬件随机数生成器]]中获取[[随机数]]。所用到的随机数生成器由芯片上的[[熵]]池初始化。&amp;lt;ref name=SIG&amp;gt;{{cite web | title = Intel Digital Random Number Generator (DRNG): Software Implementation Guide, Revision 1.1 | publisher = [[英特尔]] | date = 2012-08-07 | url = http://software.intel.com/sites/default/files/m/d/4/1/d/8/441_Intel_R__DRNG_Software_Implementation_Guide_final_Aug7.pdf | format = PDF | accessdate = 2012-11-25 | archive-date = 2013-05-18 | archive-url = https://www.webcitation.org/6GhG1P7iR?url=http://software.intel.com/sites/default/files/m/d/4/1/d/8/441_Intel_R__DRNG_Software_Implementation_Guide_final_Aug7.pdf | dead-url = no }}&amp;lt;/ref&amp;gt; &amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;指令在{{tsl|en|Ivy Bridge|}}架构处理器上可用{{Efn|在一些版本的Ivy Bridge结构处理器上，由于一个bug，RdRand指令会导致一个非法指令异常&amp;lt;ref&amp;gt;{{cite book|title=Desktop 3rd Generation Intel Core Processor Family, Specification Update|date=January 2013|publisher=Intel Corporation|url=http://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/3rd-gen-core-desktop-specification-update.pdf|access-date=2017-09-26|archive-date=2018-01-01|archive-url=https://web.archive.org/web/20180101024153/https://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/3rd-gen-core-desktop-specification-update.pdf|dead-url=no}}&amp;lt;/ref&amp;gt;|group=&amp;quot;note&amp;quot;}}，该指令也是[[X86-64]]和[[IA-32]][[指令集]]的一部分。AMD在2015年6月添加了对&amp;lt;code&amp;gt;RdRand&amp;lt;/code&amp;gt;指令的支持。&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url          = http://support.amd.com/TechDocs/24594.pdf&lt;br /&gt;
 |title        = AMD64 Architecture Programmer’s Manual Volume 3: General-Purpose and System Instructions&lt;br /&gt;
 |date         = June 2015&lt;br /&gt;
 |website      = AMD Developer Guides, Manuals &amp;amp; ISA Documents&lt;br /&gt;
 |publisher    = &lt;br /&gt;
 |accessdate   = 16 October 2015&lt;br /&gt;
 |archive-date = 2017-12-22&lt;br /&gt;
 |archive-url  = https://web.archive.org/web/20171222094421/https://support.amd.com/TechDocs/24594.pdf&lt;br /&gt;
 |dead-url     = no&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该随机数生成器要遵守安全标准和加密标准，比如{{tsl|en|NIST SP 800-90A|}}，&amp;lt;ref name=&amp;quot;SP800-90&amp;quot;&amp;gt;{{cite web |last=Barker |first=Elaine |last2=Kelsey |first2=John |title=Recommendation for Random Number Generation Using Deterministic Random Bit Generators |url=http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf |publisher=[[國家標準技術研究所]] |date=January 2012 |format=PDF |accessdate=September 16, 2013 |archive-date=2013-10-09 |archive-url=https://web.archive.org/web/20131009210654/http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf |dead-url=no }}&amp;lt;/ref&amp;gt; {{tsl|en|FIPS 140-2|}}和 [[ANSI X9.82]]。&amp;lt;ref name=SIG /&amp;gt; Intel也在1999年和2012年请密码学研究 Cryptography Research 公司来审查这个随机数发生器，并产生了两篇论文：1999年的 &amp;#039;&amp;#039;The Intel Random Number Generator&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url = http://www.cryptography.com/public/pdf/IntelRNG.pdf&lt;br /&gt;
 |title = The Intel Random Number Generator&lt;br /&gt;
 |last = Jun&lt;br /&gt;
 |first = Benjamin&lt;br /&gt;
 |last2 = Kocher&lt;br /&gt;
 |first2 = Paul&lt;br /&gt;
 |date = 1999-04-22&lt;br /&gt;
 |website = Cryptography Research, Inc.&lt;br /&gt;
 |publisher = &lt;br /&gt;
 |accessdate = 2015-08-21&lt;br /&gt;
 |archive-date = 2015-02-13&lt;br /&gt;
 |archive-url = https://web.archive.org/web/20150213065855/http://www.cryptography.com/public/pdf/IntelRNG.pdf&lt;br /&gt;
 |dead-url = yes&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt; 和2012年的 &amp;#039;&amp;#039;Analysis of Intel&amp;#039;s Ivy Bridge Digital Random Number Generator&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url         = https://www.cryptography.com/public/pdf/Intel_TRNG_Report_20120312.pdf&lt;br /&gt;
 |title       = Analysis of Intel&amp;#039;s Ivy Bridge Digital Random Number Generator&lt;br /&gt;
 |last        = Hamburg&lt;br /&gt;
 |first       = Mike&lt;br /&gt;
 |last2       = Kocher&lt;br /&gt;
 |first2      = Paul&lt;br /&gt;
 |last3       = Marson&lt;br /&gt;
 |first3      = Mark&lt;br /&gt;
 |date        = 2012-03-12&lt;br /&gt;
 |website     = Cryptography Research, Inc.&lt;br /&gt;
 |publisher   = &lt;br /&gt;
 |accessdate  = 2015-08-21&lt;br /&gt;
 |deadurl     = yes&lt;br /&gt;
 |archiveurl  = https://web.archive.org/web/20141230024150/http://www.cryptography.com/public/pdf/Intel_TRNG_Report_20120312.pdf&lt;br /&gt;
 |archivedate = 2014-12-30&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;RDSEED&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;和&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;类似，也提供了访问硬件熵池的高级方法。&lt;br /&gt;
[[Broadwell微架構|Intel Broadwell 系列的CPU]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url = https://software.intel.com/en-us/articles/introduction-to-intel-aes-ni-and-intel-secure-key-instructions&lt;br /&gt;
 |title = Introduction to Intel AES-NI and Intel SecureKey Instructions&lt;br /&gt;
 |last = Hofemeier&lt;br /&gt;
 |first = Gael&lt;br /&gt;
 |date = 2012-07-26&lt;br /&gt;
 |website = Intel Developer Zone&lt;br /&gt;
 |publisher = Intel&lt;br /&gt;
 |accessdate = 2015-10-24&lt;br /&gt;
 |archive-date = 2015-11-04&lt;br /&gt;
 |archive-url = https://web.archive.org/web/20151104222751/https://software.intel.com/en-us/articles/introduction-to-intel-aes-ni-and-intel-secure-key-instructions&lt;br /&gt;
 |dead-url = no&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt; 和 [[AMD Zen|AMD Zen 系列的CPU]]&amp;lt;ref&amp;gt;{{Cite web|title = AMD Starts Linux Enablement On Next-Gen &amp;quot;Zen&amp;quot; Architecture - Phoronix|url = https://www.phoronix.com/scan.php?page=news_item&amp;amp;px=AMD-Zen-CPU-Znver1|website = www.phoronix.com|accessdate = 2015-10-25|archive-date = 2017-03-08|archive-url = https://web.archive.org/web/20170308012816/http://www.phoronix.com/scan.php?page=news_item&amp;amp;px=AMD-Zen-CPU-Znver1|dead-url = no}}&amp;lt;/ref&amp;gt;都支持&amp;lt;code&amp;gt;RDSEED&amp;lt;/code&amp;gt;生成器和&amp;lt;code&amp;gt;rdseed&amp;lt;/code&amp;gt;指令。&lt;br /&gt;
&lt;br /&gt;
== 概略 ==&lt;br /&gt;
在[[AMD]]和[[Intel]]的CPU上，&amp;lt;code&amp;gt;[[CPUID]]&amp;lt;/code&amp;gt;指令都可以检测[[中央处理器]]（CPU）是否支持&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt; 指令。如果支持，调用CPUID的标准函数&amp;lt;code&amp;gt;01H&amp;lt;/code&amp;gt;之后，ECX寄存器的第30位会被设置成1&amp;lt;ref&amp;gt;{{cite web|title=Volume 1, Section 7.3.17, &amp;#039;Random Number Generator Instruction&amp;#039;|url=http://download.intel.com/products/processor/manual/325462.pdf|work=Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B and 3C|publisher=Intel Corporation|accessdate=24 June 2013|authorlink=Intel Corporation|page=177|date=June 2013|quote=All Intel processors that support the RDRAND instruction indicate the availability of the RDRAND instruction via reporting CPUID.01H:ECX.RDRAND[bit 30] = 1|archive-date=2013-11-04|archive-url=https://web.archive.org/web/20131104062923/http://download.intel.com/products/processor/manual/325462.pdf|dead-url=no}}&amp;lt;/ref&amp;gt;。AMD处理器也可以使用同样的方式检测是否支持&amp;lt;ref&amp;gt;{{cite web|title=AMD64 Architecture Programmer’s Manual Volume 3: General-Purpose and System Instructions|url=http://support.amd.com/TechDocs/24594.pdf|publisher=AMD|accessdate=15 October 2015|page=278|date=June 2015|quote=Support for the RDRAND instruction is optional. On processors that support the instruction, CPUID Fn0000_0001_ECX[RDRAND] = 1|archive-date=2017-12-22|archive-url=https://web.archive.org/web/20171222094421/https://support.amd.com/TechDocs/24594.pdf|dead-url=no}}&amp;lt;/ref&amp;gt;。在Intel CPU上，也可以使用类似的方法检测&amp;lt;code&amp;gt;RDSEED&amp;lt;/code&amp;gt;是否支持。如果支持&amp;lt;code&amp;gt;RDSEED&amp;lt;/code&amp;gt;，在调用完CPUID的标准函数&amp;lt;code&amp;gt;07H&amp;lt;/code&amp;gt;后，EBX寄存器的第18位会被设置为1&amp;lt;ref&amp;gt;{{cite web|title=Volume 1, Section 7.3.17, &amp;#039;Random Number Generator Instruction&amp;#039;|url=http://www-ssl.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf|work=Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B and 3C|publisher=Intel Corporation|accessdate=25 October 2015|authorlink=Intel Corporation|page=177|date=June 2013|quote=All Intel processors that support the RDSEED instruction indicate the availability of the RDSEED instruction via reporting CPUID.(EAX=07H, ECX=0H):EBX.RDSEED[bit 18] = 1|archive-date=2016-08-10|archive-url=https://web.archive.org/web/20160810060828/https://www-ssl.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf|dead-url=no}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;的操作码是&amp;lt;code&amp;gt;0x0F 0xC7&amp;lt;/code&amp;gt;，后面跟一个ModRM字节，来指示目标寄存器。在64位模式下，还可以于REX前缀结合（这是可选的）&amp;lt;ref&amp;gt;{{cite web |url=http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide |title=Intel® Digital Random Number Generator (DRNG) Software Implementation Guide &amp;amp;#124; Intel® Developer Zone |publisher=Software.intel.com |date= |accessdate=2014-01-30 |archive-date=2014-01-12 |archive-url=https://web.archive.org/web/20140112161155/http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide/ |dead-url=no }}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Intel安全密钥&amp;#039;&amp;#039;是[[Intel]]为&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;指令和底层的[[随机数生成器]]（RNG）的硬件实现的统称，它在开发期间的代号是&amp;quot;Bull Mountain&amp;quot;&amp;lt;ref name=&amp;quot;ieee2011&amp;quot; /&amp;gt;。Intel称自己的RNG&amp;quot;数字随机数生成器&amp;quot;或DRNG。生成器采用有硬件产生的256位原始熵样本对，并将其应用到一个[[高级加密标准]]（AES）（在[[CBC-MAC]]模式下）调节器，将其减少到256位条件熵样本。&lt;br /&gt;
&lt;br /&gt;
[[NIST SP 800-90A]]中定义了一个名叫CTR_DRBG的确定性随机数生成器。它由调节器的输出来初始化，为使用&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;指令的应用程序提供了密码学安全的随机数。&amp;lt;ref name=&amp;quot;SIG&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;ieee2011&amp;quot;&amp;gt;{{cite journal |first1=Greg |last1=Taylor |first2=George |last2=Cox |url=http://spectrum.ieee.org/computing/hardware/behind-intels-new-randomnumber-generator/0 |title=Behind Intel&amp;#039;s New Random-Number Generator |journal=[[IEEE Spectrum]] |date=September 2011 |author= |access-date=2017-10-02 |archive-url=https://web.archive.org/web/20190701135731/https://spectrum.ieee.org/computing/hardware/behind-intels-new-randomnumber-generator/0 |archive-date=2019-07-01 |dead-url=yes }}&amp;lt;/ref&amp;gt; 在重新初始化之前，硬件将发出最多511个128位的样本。使用&amp;lt;code&amp;gt;RDSEED&amp;lt;/code&amp;gt;可以访问来自AES-CBC-MAC的、条件化后的256位样本。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了初始化另一个为随机数生成器，&amp;lt;code&amp;gt;RDSEED&amp;lt;/code&amp;gt;指令被添加到了Intel安全密钥&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |title=The Difference Between RDRAND and RDSEED&lt;br /&gt;
 |url=http://software.intel.com/en-us/blogs/2012/11/17/the-difference-between-rdrand-and-rdseed&lt;br /&gt;
 |work=software.intel.com&lt;br /&gt;
 |publisher=Intel Corporation&lt;br /&gt;
 |accessdate=1 January 2014&lt;br /&gt;
 |author=John Mechalas&lt;br /&gt;
 |date=November 2012&lt;br /&gt;
 |archive-date=2017-10-02&lt;br /&gt;
 |archive-url=https://web.archive.org/web/20171002215336/https://software.intel.com/en-us/blogs/2012/11/17/the-difference-between-rdrand-and-rdseed&lt;br /&gt;
 |dead-url=no&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;，在[[Broadwell微架構]]的CPU上开始支持。&amp;lt;code&amp;gt;RDSEED&amp;lt;/code&amp;gt;指令的熵来源自时序线路，并且使用硅片上的[[热噪声]]来以3GHz的速度输出随机比特流&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |last1=Mechalas&lt;br /&gt;
 |first1=John&lt;br /&gt;
 |title=Intel Digital Random Number Generator (DRNG) Software Implementation Guide, Section 3.2.1  Entropy Source (ES)&lt;br /&gt;
 |url=https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide&lt;br /&gt;
 |website=https://software.intel.com&lt;br /&gt;
 |publisher=Intel&lt;br /&gt;
 |accessdate=18 February 2015&lt;br /&gt;
 |archive-date=2017-10-02&lt;br /&gt;
 |archive-url=https://web.archive.org/web/20171002115911/https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide&lt;br /&gt;
 |dead-url=no&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;。这比从&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;获得的6.4Gbit/s速率要慢（这两个速率都是所有[[多核心处理器|核心]]、所有[[线程]]共享）&amp;lt;ref&amp;gt;https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide {{Wayback|url=https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide |date=20171002115911 }} 说是 800 megabyte，即 6.4 gigabit每秒&amp;lt;/ref&amp;gt;。&amp;lt;code&amp;gt;RDSEED&amp;lt;/code&amp;gt;用来初始化任意宽度的软件 PRNG，而&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;指令适用于需要高质量随机数的应用程序。如果不要求密码学安全，软件随机数生成器比如[[Xorshift]]一般会比较快。&amp;lt;ref&amp;gt;最简单的64位[[Xorshift]]实现具有三次[[逻辑异或|异或]]和三次[[逻辑移位]]；如果这在4核2GHz CPU上运行，吞吐量是80 Gb/s。在实践中，由于存储、加载等开销，吞吐量会减少，但仍然会超过&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;的6.4 Gb/s。另一方面，&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;产生的随机数质量会比软件随机数生成器高，比如Xorshift。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===性能===&lt;br /&gt;
在Intel 酷睿 i7-7700K，4500MHz（45 x 100MHz）的处理器（[[Kaby Lake微架构|Kaby Lake-S]]架构）上，单个&amp;lt;code&amp;gt;RDRAND&amp;lt;/code&amp;gt;或&amp;lt;code&amp;gt;RDSEED&amp;lt;/code&amp;gt;指令花费110纳秒或463个时钟周期，不论操作数大小（16位、32位、64位）。这个时钟周期数适用于所有[[Skylake微架构|Skylake]]和[[Kaby Lake微架构|Kaby Lake]]架构的处理器。在[[Silvermont]]架构的处理器上，每个指令花费1472时钟周期，不论操作数大小；在[[Ivy Bridge微架构|Ivy Bridge]]架构的处理器上，花费117时钟周期&amp;lt;ref&amp;gt;{{Cite web |url=http://www.agner.org/optimize/instruction_tables.pdf |title=存档副本 |accessdate=2017-10-02 |archive-date=2014-07-30 |archive-url=https://web.archive.org/web/20140730030310/http://www.agner.org/optimize/instruction_tables.pdf |dead-url=yes }}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在AMD Ryzen 处理器上，对于16位或32位操作数，每个指令约花费1200个时钟周期；对于64位操作数，约花费2500个时钟周期。&lt;br /&gt;
&lt;br /&gt;
===编译器支持===&lt;br /&gt;
[[GCC]] 4.6+和[[Clang]] 3.2+提供了RdRand的{{le|intrinsic function||内置支持}}——当在[[CFLAGS|编译参数]]中指定了&amp;lt;code&amp;gt;-mrdrnd&amp;lt;/code&amp;gt;命令行参数、并且在{{le|conditional compilation||条件编译}}时设置&amp;lt;code&amp;gt;__RDRND__&amp;lt;/code&amp;gt;巨集的情况下&amp;lt;ref&amp;gt;{{Cite web |url=https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/X86-Built-in-Functions.html |title=存档副本 |accessdate=2017-10-02 |archive-date=2018-05-20 |archive-url=https://web.archive.org/web/20180520185844/https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/X86-Built-in-Functions.html |dead-url=no }}&amp;lt;/ref&amp;gt;。更新的版本额外提供了&amp;lt;code&amp;gt;immintrin.h&amp;lt;/code&amp;gt;将这些内置函数封装成与英特尔C编译器版本12.1+兼容的功能中。这些函数将随机数据写入参数指定的位置，并在成功时返回1 &amp;lt;ref&amp;gt;{{Cite web |url=https://software.intel.com/en-us/node/523864 |title=存档副本 |accessdate=2017-10-02 |archive-date=2017-10-02 |archive-url=https://web.archive.org/web/20171002120222/https://software.intel.com/en-us/node/523864 |dead-url=no }}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
===用来检测RDRAND指令的x86汇编语言例子===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; 使用 NASM 语法&lt;br /&gt;
&lt;br /&gt;
section .data&lt;br /&gt;
	msg db &amp;quot;0x00000000&amp;quot;,10&lt;br /&gt;
&lt;br /&gt;
section .text&lt;br /&gt;
global _start&lt;br /&gt;
_start:&lt;br /&gt;
	mov eax,1&lt;br /&gt;
	cpuid&lt;br /&gt;
	bt ecx,30&lt;br /&gt;
	mov rdi,1 ; exit code: failure&lt;br /&gt;
	jnc .exit&lt;br /&gt;
&lt;br /&gt;
	; 如果没有随机数可用，rdrand 设置 CF=0&lt;br /&gt;
        ; Intel 的文档建议循环重试10次&lt;br /&gt;
	mov ecx,11&lt;br /&gt;
.loop1:&lt;br /&gt;
	dec ecx&lt;br /&gt;
	jecxz .exit ; exit code 已经设置了&lt;br /&gt;
	rdrand eax&lt;br /&gt;
	jnc .loop1&lt;br /&gt;
&lt;br /&gt;
	; 将数字转换成 ASCII 字符&lt;br /&gt;
	mov rdi,msg+9&lt;br /&gt;
	mov ecx,8&lt;br /&gt;
.loop2:&lt;br /&gt;
	mov edx,eax&lt;br /&gt;
	and edx,0Fh&lt;br /&gt;
	; add 7 to nibbles of 0xA and above&lt;br /&gt;
	; to align with ASCII code for &amp;#039;A&amp;#039;&lt;br /&gt;
	; (&amp;#039;A&amp;#039; - &amp;#039;0&amp;#039;) - 10 = 7&lt;br /&gt;
	mov r8d,7&lt;br /&gt;
	xor r9d,r9d&lt;br /&gt;
	cmp dl,9&lt;br /&gt;
	cmova r9,r8&lt;br /&gt;
	add edx,r9d&lt;br /&gt;
	add [rdi],dl&lt;br /&gt;
	shr eax,4&lt;br /&gt;
	dec rdi&lt;br /&gt;
	loop .loop2&lt;br /&gt;
&lt;br /&gt;
	mov rax,1 ; SYS_WRITE&lt;br /&gt;
	mov rdi,1 ; stdout&lt;br /&gt;
	mov rsi,msg&lt;br /&gt;
	mov rdx,11&lt;br /&gt;
	syscall&lt;br /&gt;
&lt;br /&gt;
	mov rdi,0 ; exit code: success&lt;br /&gt;
.exit:&lt;br /&gt;
	mov rax,60 ; SYS_EXIT&lt;br /&gt;
	syscall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reception ==&lt;br /&gt;
在2013年9月，[[曹子德|曹子德（Theodore Ts&amp;#039;o）]]为回应&amp;#039;&amp;#039;[[纽约时报]]&amp;#039;&amp;#039;的文章{{tsl|en|Global surveillance disclosures (2013–present)|}}，公开发文表达对[[Linux内核]]的&amp;lt;tt&amp;gt;[[/dev/random]]&amp;lt;/tt&amp;gt;中使用&amp;lt;tt&amp;gt;RdRand&amp;lt;/tt&amp;gt;的担忧&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url=https://plus.google.com/117091380454742934025/posts/SDcoemc9V3J&lt;br /&gt;
 |title=I am so glad I resisted pressure from Intel engineers to let /dev/random rely...&lt;br /&gt;
 |date=September 6, 2013&lt;br /&gt;
 |last=Ts&amp;#039;o&lt;br /&gt;
 |first=Theodore&lt;br /&gt;
 |accessdate=2017-10-02&lt;br /&gt;
 |archive-date=2018-06-11&lt;br /&gt;
 |archive-url=https://web.archive.org/web/20180611180213/https://plus.google.com/117091380454742934025/posts/SDcoemc9V3J&lt;br /&gt;
 |dead-url=no&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;：&lt;br /&gt;
&lt;br /&gt;
{{Quote|I am so glad I resisted pressure from Intel engineers to let /dev/random rely only on the RDRAND instruction. To quote from the article below: &amp;#039;By this year, the [[Sigint Enabling Project]] had found ways inside some of the encryption chips that scramble information for businesses and governments, either by working with chipmakers to insert back doors....&amp;#039; Relying solely on the hardware random number generator which is using an implementation sealed inside a chip which is impossible to audit is a BAD idea.}}&lt;br /&gt;
&lt;br /&gt;
[[林纳斯·托瓦兹]]驳斥了在Linux内核中使用&amp;lt;tt&amp;gt;RdRand&amp;lt;/tt&amp;gt;的担忧，并指出&amp;lt;tt&amp;gt;RdRand&amp;lt;/tt&amp;gt;不是&amp;lt;tt&amp;gt;/dev/random&amp;lt;/tt&amp;gt;的唯一熵来源；从&amp;lt;tt&amp;gt;RdRand&amp;lt;/tt&amp;gt;接受数据并和其他随机数来源结合来改善熵。&amp;lt;ref name=&amp;quot;TheRegister&amp;quot; /&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url=https://www.theregister.co.uk/2013/09/10/torvalds_on_rrrand_nsa_gchq/&lt;br /&gt;
 |title=Torvalds shoots down call to yank &amp;#039;backdoored&amp;#039; Intel RdRand in Linux crypto&lt;br /&gt;
 |date=10 September 2013&lt;br /&gt;
 |accessdate=12 March 2014&lt;br /&gt;
 |author=Gavin Clarke&lt;br /&gt;
 |publisher=theregister.co.uk&lt;br /&gt;
 |archive-date=2019-11-09&lt;br /&gt;
 |archive-url=https://web.archive.org/web/20191109073339/https://www.theregister.co.uk/2013/09/10/torvalds_on_rrrand_nsa_gchq/&lt;br /&gt;
 |dead-url=no&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt; 然而，Defuse Security的Taylor Hornby表明，如果将后门引入到专门针对使用代码的RdRand指令中，Linux随机数生成器可能会变得不安全。 泰勒的概念验证实现在版本3.13之前的未修改的Linux内核上工作。&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url=https://twitter.com/defusesec/status/408975222163795969&lt;br /&gt;
 |title=RDRAND backdoor proof of concept is working! Stock kernel (3.8.13), only the RDRAND instruction is modified.&lt;br /&gt;
 |date=6 December 2013&lt;br /&gt;
 |accessdate=9 April 2015&lt;br /&gt;
 |author=Taylor Hornby&lt;br /&gt;
 |archive-date=2016-03-05&lt;br /&gt;
 |archive-url=https://web.archive.org/web/20160305140453/https://twitter.com/defusesec/status/408975222163795969&lt;br /&gt;
 |dead-url=no&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;&lt;br /&gt;
{{cite tweet&lt;br /&gt;
 |user=DefuseSec&lt;br /&gt;
 |number=377609001258598400&lt;br /&gt;
 |date=10 September 2013&lt;br /&gt;
 |author=Taylor Hornby&lt;br /&gt;
 |title=&amp;lt;nowiki&amp;gt;I wrote a short dialogue explaining why Linux&amp;#039;s use of RDRAND is problematic. http://pastebin.com/A07q3nL3  /cc @kaepora @voodooKobra&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 |accessdate=11 January 2016&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url=http://cr.yp.to/talks/2014.05.16/slides-dan+tanja-20140516-4x3.pdf&lt;br /&gt;
 |title=Randomness generation&lt;br /&gt;
 |date=16 May 2014&lt;br /&gt;
 |accessdate=9 April 2015&lt;br /&gt;
 |author1=Daniel J. Bernstein&lt;br /&gt;
 |author2=Tanja Lange&lt;br /&gt;
 |archive-date=2017-08-25&lt;br /&gt;
 |archive-url=https://web.archive.org/web/20170825174629/https://cr.yp.to/talks/2014.05.16/slides-dan+tanja-20140516-4x3.pdf&lt;br /&gt;
 |dead-url=no&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
开发者注释掉了[[FreeBSD]]内核中直接使用&amp;lt;tt&amp;gt;RdRand&amp;lt;/tt&amp;gt;和[[威盛電子]]的代码，并添加说明&amp;quot;对于 [[FreeBSD]] 10，我们将回溯并删除RDRAND和Padlock后端，并将它们提供给Yarrow，而不是将其输出直接传递到 /dev/random 。如果需要，还可以通过内联汇编或使用OpenSSL直接访问硬件随机数生成器，即RDRAND，Padlock等，但是我们不能再信任他们。&amp;quot;&amp;lt;ref name=&amp;quot;TheRegister&amp;quot;&amp;gt;{{cite news | title=FreeBSD abandoning hardware randomness | author=Richard Chirgwin | date=2013-12-09 | url=https://www.theregister.co.uk/2013/12/09/freebsd_abandoning_hardware_randomness/ | work=The Register | accessdate=2017-10-02 | archive-date=2017-10-02 | archive-url=https://web.archive.org/web/20171002120240/https://www.theregister.co.uk/2013/12/09/freebsd_abandoning_hardware_randomness/ | dead-url=no }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web |url=http://www.freebsd.org/news/status/report-2013-09-devsummit.html#Security |title=FreeBSD Quarterly Status Report |publisher=Freebsd.org |date= |accessdate=2014-01-30 |archive-date=2014-01-22 |archive-url=https://web.archive.org/web/20140122211849/http://www.freebsd.org/news/status/report-2013-09-devsummit.html#Security |dead-url=no }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 参见 ==&lt;br /&gt;
{{Portal|计算机安全}}&lt;br /&gt;
* [[AES指令集]]&lt;br /&gt;
* [[Bullrun (NSA計畫)]]&lt;br /&gt;
* [[OpenSSL]]&lt;br /&gt;
* [[wolfSSL]]&lt;br /&gt;
&lt;br /&gt;
== 注脚 ==&lt;br /&gt;
{{Notelist}}&lt;br /&gt;
&lt;br /&gt;
== 参考资料 ==&lt;br /&gt;
{{Reflist|30em}}&lt;br /&gt;
[[Category:机器码]]&lt;br /&gt;
[[Category:X86微处理器]]&lt;br /&gt;
[[Category:X86指令]]&lt;br /&gt;
[[Category:随机数生成]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Hehua</name></author>
	</entry>
</feed>