隨機和偽隨機 電腦隨機數是如何生成的?
2023-07-03 04:21:28
泡泡網CPU頻道2月24日 不論是維持著你餘額寶安全的加密過程還是你在玩《戰地4》,電腦都會產生隨機數。目前有兩類隨機數——「真」隨機數和偽隨機數——兩者的區別關乎加密系統的安全度。
![](http://img.xinsiji.cc/20230703/467748240612130817.jpg)
對於隨機數的討論日漸升溫,許多人懷疑英特爾內置於各種硬體內的隨機數生成晶片是不是靠得住。要理解為什麼這種隨機數不太可靠,你必須理解隨機數的生成原理。
隨機數的作用
隨機數的使用歷史已經有數千年。無論是拋硬幣還是搖色子,目的是讓隨機概率決定結果。電腦中的隨機數生成器的目的也是如此——生成隨機不可預測的結果。
加密法要求數字不能被攻擊者猜到,不能多次使用同樣的數字。所以需要一種機制產生攻擊者無法預測的數字,這些隨機數對加密法至關重要,無論你是加密文件還是訪問https協議網站,都需要用到隨機數。
![](http://img.xinsiji.cc/20230703/467748247641784321.jpg)
真隨機數
如果電腦是靠代碼生成隨機數,是不是意味著隨機數可以被預測?
根據隨機數的生成原理,我們把電腦隨機數分為兩類:「真」隨機數和偽隨機數。
要生成一個「真」隨機數,電腦會檢測電腦外部發生的某種物理現象。比如說,電腦可以測量某個原子的放射性衰變。根據量子理論,原子衰變是隨機而不可測的,所以這就是宇宙中的「純粹」隨機性。攻擊者永遠無法預測原子衰變的發生時間,也就不可能猜出隨機值。
舉個更實際的例子,電腦會根據環境中的噪音或者採取你敲擊鍵盤的精確時間作為隨機數據或熵的生成依據。舉個例子,你的電腦監測到你某天下午2點以後敲擊鍵盤的精確時間是0.23423523秒,有足夠的這些特定長數字你就能得到一個熵源,也就可以生成「真」隨機數。由於人不是機器,所以攻擊者無法掌握你的敲擊時間。Linux中的/dev/隨機設備生成隨機數,「阻攔」訪問直到熵積累量足夠才返回一個真隨機數。
![](http://img.xinsiji.cc/20230703/467748251114668033.jpg)
偽隨機數
偽隨機數這個概念是相對於「真」隨機數而言。電腦通過發送種子數值,運用算法產生某個看起來像隨機數的數字,但是實際上這個數字是可以預測的。因為電腦沒有從環境中收集到任何隨機信息。
雖然是偽隨機數,但是並不是所有領域都不需要偽隨機數。比如,如果你在玩電子遊戲,那麼遊戲過程中是靠偽隨機數還是真隨機數並不重要。另一方面,如果你的應用正在加密,情況就不同了,因為你不希望攻擊者能夠猜到你的隨機數。
舉個例子,如果攻擊者掌握了某隨機數生成器使用的種子數值和加密算法,如果隨機數生成器完全依靠種子數值和加密算法生成密文,這個過程中不添加任何額外隨機性,如果攻擊者掌握的情報足夠多,他們可以逆推來確定加密算法一定會用到的偽隨機數,也就能破譯密文。
![](http://img.xinsiji.cc/20230703/467748254503665665.jpg)
NSA和Intel的硬體隨機數生成器
為了幫助程序開發者更簡單的生成隨機數,也為了幫助生成安全的隨機數,Intel的晶片組中包括一個硬體隨機數生成器,名叫RdRand,這塊晶片利用處理器的熵源向軟體提供隨機數。
問題是這個隨機數生成器是個黑盒,我們不清楚裡面的工作原理。如果RdRand藏有NSA的後門,那麼政府就可以破譯依靠隨機數生成器提供的唯一數據產生的密鑰。
這個問題非常嚴重。在2013年12月,FreeBSD的開發者們取消了對直接採用RdRand作為隨機數源的支持,理由是無法信任Intel。RdRand設備的輸出結果會用另一套加密算法增加額外熵,確保隨機數伺服器中即便有後門程序也不會產生影響。Linux已經這麼做了,在RdRand的隨機數基礎上再次進行隨機處理,以確保後門程序不可能從中作祟。Intel總裁Brian Krzanich在Reddit上沒有直接回答關於是否裝有後門的問題。
當然這不是Intel一家的問題,FreeBSD的開發者們也點了Via晶片的名。從這場爭論中我們可以看出為什麼不可預測的真隨機數如此重要。
![](http://img.xinsiji.cc/20230703/467748258077212673.jpg)
而隨機數生成器生成「真」隨機數只需要搜集熵或者從真實世界搜集看似隨機的數據。對於某些不需要真正隨機的應用,隨機生成器可能會通過算法和種子數值算出隨機數。