x86 RDRAND 和 RDSEED 的使用區別
現代 x86 CPU 通常具有用於硬體生成隨機數的 RDRAND 和 RDSEED 指令。我只是不明白他們之間的區別。
英特爾有這個文件:https ://software.intel.com/en-us/blogs/2012/11/17/the-difference-between-rdrand-and-rdseed
但我不明白這如何影響RDRAND 和 RDSEED的*使用。*即,在什麼情況下,我可以將它們用於生成加密密鑰等功能,或用於 PRNG 的初始播種?
至於 NSA 後門的可能性,這對我們來說真的不是問題。
處理器大致包含三個組件:
- 硬體雜訊源;
- 從該雜訊源定期播種的偽隨機生成器,其輸出可通過
RDRAND
指令獲得;- 一個真正的隨機發生器,它被驅動遠離雜訊源,其輸出可通過
RDSEED
指令獲得。英特爾較長的文件有一些解釋和一些有用的圖表,這些圖表又參考了 NIST 關於隨機位生成器的文件(SP800-90A、B 和 C)。但是,如果要總結這兩條指令的安全目標,我認為它們是:
- 對於在任何其他時間觀察任何其他輸出位的計算不受限制
RDSEED
的攻擊者來說,任何輸出位都不應該是可預測的。- 對於在任何其他時間觀察任何其他輸出位
的計算有限的攻擊者來說,任何輸出
RDRAND
都不應是可預測的。
- 但是在某些情況下,一些這樣的位對於計算無限的攻擊者來說可能是可預測的。
在實際的偽隨機生成器中,即使是定期從新的熵輸入中重新播種的偽隨機生成器,通常情況下,只要有足夠的計算量,輸出位就可以從附近的位中預測出來。例如,英特爾的文件告訴我們,他們的實現
RDRAND
使用了 NIST 的 CTR_DRBG 算法。該算法在 CTR 模式下使用分組密碼來生成呼叫者請求大小的輸出數據塊,並且生成器僅在輸出塊之間重新播種。因此,給定這樣一個塊的足夠片段,暴力密鑰恢復攻擊可以預測塊的其餘部分,成功率高於偶然率。該文件還告訴我們,兩條指令都使用“基於 AES-CBC-MAC 的調節器”來處理硬體熵源的輸出。NIST SP800-90B(第二稿)(第 5 頁)中解釋了這個概念:
可選的調節組件是一個確定性函式,負責減少偏差和/或增加結果輸出位的熵率(如果需要獲得目標值)。
基本上,AES 在這裡的使用模式是,給定真正隨機但有偏差的輸入,產生偏差較小的真正隨機輸出。
英特爾的文件沒有詳細介紹 使用的“ENRNG”(“增強的非確定性隨機數生成器”,英特爾自己的術語)
RDSEED
,但他們將我們稱為 NIST SP800-90B 和SP800-90C。特別看後者表明這個“ENRNG”也可能使用 AES,但同樣是在將真正的隨機輸入映射到真正的隨機輸出的模式下。似乎沒有足夠的資訊來準確地說明這裡發生了什麼,但從字裡行間看,我猜它是 SP800-90C 第 9 節(第 9 頁)中的 NRGB(“非確定性隨機位發生器”)結構之一。 32ff),它以熵保留的方式將真正的隨機輸出與偽隨機生成器的輸出相結合,作為一種實用的安全機制:使用這些 NRBG 的優點包括:
- 如果 NRBG 中的底層 DRBG 機制已被安全實例化,並且熵源以未檢測到的方式失敗,則 NRBG 將繼續提供隨機輸出,但處於 DRBG 實例化的安全強度(“回退”安全強度),而不是提供具有全熵的輸出。
- NRBG 中熵源行為的微小偏差將被 DRBG 輸出掩蓋。