RDRAND
(之前被稱為Bull Mountain[1])是一個電腦指令,用於從晶片上的硬件亂數生成器中取得亂數。所用到的亂數生成器由晶片上的熵池初始化。[2] RDRAND
指令在Ivy Bridge架構處理器上可用[a],該指令也是X86-64和IA-32指令集的一部分。AMD在2015年6月添加了對RdRand
指令的支援。[4]
此條目翻譯品質不佳。 (2023年7月13日) |
該亂數生成器要遵守安全標準和加密標準,比如NIST SP 800-90A,[5] FIPS 140-2和 ANSI X9.82。[2] Intel也在1999年和2012年請密碼學研究 Cryptography Research 公司來審查這個亂數發生器,並產生了兩篇論文:1999年的 The Intel Random Number Generator[6] 和2012年的 Analysis of Intel's Ivy Bridge Digital Random Number Generator[7]。
RDSEED
和RDRAND
類似,也提供了訪問硬件熵池的進階方法。
Intel Broadwell 系列的CPU[8] 和 AMD Zen 系列的CPU[9]都支援RDSEED
生成器和rdseed
指令。
概略
在AMD和Intel的CPU上,CPUID
指令都可以檢測中央處理器(CPU)是否支援RDRAND
指令。如果支援,呼叫CPUID的標準函數01H
之後,ECX暫存器的第30位會被設置成1[10]。AMD處理器也可以使用同樣的方式檢測是否支援[11]。在Intel CPU上,也可以使用類似的方法檢測RDSEED
是否支援。如果支援RDSEED
,在呼叫完CPUID的標準函數07H
後,EBX暫存器的第18位元會被設置為1[12]。
RDRAND
的操作碼是0x0F 0xC7
,後面跟一個ModRM位元組,來指示目標暫存器。在64位元模式下,還可以於REX字首結合(這是可選的)[13]。
Intel安全金鑰是Intel為RDRAND
指令和底層的亂數生成器(RNG)的硬件實現的統稱,它在開發期間的代號是"Bull Mountain"[14]。Intel稱自己的RNG"數字亂數生成器"或DRNG。生成器採用有硬件產生的256位原始熵樣本對,並將其應用到一個進階加密標準(AES)(在CBC-MAC模式下)調節器,將其減少到256位條件熵樣本。
NIST SP 800-90A中定義了一個名叫CTR_DRBG的確定性亂數生成器。它由調節器的輸出來初始化,為使用RDRAND
指令的應用程式提供了密碼學安全的亂數。[2][14] 在重新初始化之前,硬件將發出最多511個128位元的樣本。使用RDSEED
可以訪問來自AES-CBC-MAC的、條件化後的256位樣本。
為了初始化另一個為亂數生成器,RDSEED
指令被添加到了Intel安全金鑰[15],在Broadwell微架構的CPU上開始支援。RDSEED
指令的熵來源自時序線路,並且使用矽片上的熱噪聲來以3GHz的速度輸出隨機位元流[16]。這比從RDRAND
獲得的6.4Gbit/s速率要慢(這兩個速率都是所有核心、所有線程共用)[17]。RDSEED
用來初始化任意寬度的軟件 PRNG,而RDRAND
指令適用於需要高質素亂數的應用程式。如果不要求密碼學安全,軟件亂數生成器比如Xorshift一般會比較快。[18]
在Intel 酷睿 i7-7700K,4500MHz(45 x 100MHz)的處理器(Kaby Lake-S架構)上,單個RDRAND
或RDSEED
指令花費110納秒或463個時鐘周期,不論運算元大小(16位元、32位元、64位元)。這個時鐘周期數適用於所有Skylake和Kaby Lake架構的處理器。在Silvermont架構的處理器上,每個指令花費1472時鐘周期,不論運算元大小;在Ivy Bridge架構的處理器上,花費117時鐘周期[19]。
在AMD Ryzen 處理器上,對於16位元或32位元運算元,每個指令約花費1200個時鐘周期;對於64位元運算元,約花費2500個時鐘周期。
GCC 4.6+和Clang 3.2+提供了RdRand的內建支援——當在編譯參數中指定了-mrdrnd
命令列參數、並且在條件編譯時設置__RDRND__
巨集的情況下[20]。更新的版本額外提供了immintrin.h
將這些內建函數封裝成與英特爾C編譯器版本12.1+相容的功能中。這些函數將亂數據寫入參數指定的位置,並在成功時返回1 [21]。
; 使用 NASM 语法
section .data
msg db "0x00000000",10
section .text
global _start
_start:
mov eax,1
cpuid
bt ecx,30
mov rdi,1 ; exit code: failure
jnc .exit
; 如果没有随机数可用,rdrand 设置 CF=0
; Intel 的文档建议循环重试10次
mov ecx,11
.loop1:
dec ecx
jecxz .exit ; exit code 已经设置了
rdrand eax
jnc .loop1
; 将数字转换成 ASCII 字符
mov rdi,msg+9
mov ecx,8
.loop2:
mov edx,eax
and edx,0Fh
; add 7 to nibbles of 0xA and above
; to align with ASCII code for 'A'
; ('A' - '0') - 10 = 7
mov r8d,7
xor r9d,r9d
cmp dl,9
cmova r9,r8
add edx,r9d
add [rdi],dl
shr eax,4
dec rdi
loop .loop2
mov rax,1 ; SYS_WRITE
mov rdi,1 ; stdout
mov rsi,msg
mov rdx,11
syscall
mov rdi,0 ; exit code: success
.exit:
mov rax,60 ; SYS_EXIT
syscall
Reception
在2013年9月,曹子德(Theodore Ts'o)為回應紐約時報的文章Global surveillance disclosures (2013–present),公開發文表達對Linux內核的/dev/random中使用RdRand的擔憂[22]:
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: '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....' 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.
林納斯·托瓦茲駁斥了在Linux內核中使用RdRand的擔憂,並指出RdRand不是/dev/random的唯一熵來源;從RdRand接受數據並和其他亂數來源結合來改善熵。[23][24] 然而,Defuse Security的Taylor Hornby表明,如果將後門引入到專門針對使用代碼的RdRand指令中,Linux亂數生成器可能會變得不安全。 泰勒的概念驗證實現在版本3.13之前的未修改的Linux內核上工作。[25][26][27]
開發者註釋掉了FreeBSD內核中直接使用RdRand和威盛電子的代碼,並添加說明"對於 FreeBSD 10,我們將回溯並刪除RDRAND和Padlock後端,並將它們提供給Yarrow,而不是將其輸出直接傳遞到 /dev/random 。如果需要,還可以通過行內組譯或使用OpenSSL直接訪問硬件亂數生成器,即RDRAND,Padlock等,但是我們不能再信任他們。"[23][28]
參見
註腳
參考資料
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.