Skip to main content

計算機如何生成隨機數

計算機如何生成隨機數

Geoffrey Carr

計算機生成隨機數,用於從加密到視頻遊戲和賭博的所有內容。有兩類隨機數 - “真實”隨機數和偽隨機數 - 這些差異對於加密系統的安全性很重要。

計算機可以通過觀察一些不可預測的外部數據(如鼠標移動或風扇噪聲)以及從中創建數據來生成真正的隨機數。這被稱為熵。其他時候,它們通過使用算法生成“偽隨機”數字,因此結果看起來是隨機的,即使它們不是。

最近這個話題變得更具爭議性,許多人質疑英特爾的內置硬件隨機數發生器芯片是否值得信賴。要理解為什麼它可能不值得信任,你必須首先理解隨機數是如何處理的,以及它們用於什麼。

使用什麼隨機數

隨機數已經使用了數千年。無論是擲硬幣還是擲骰子,目標都是將最終結果留給隨機機會。計算機中的隨機數生成器是相似的 - 它們試圖獲得不可預測的隨機結果。

隨機數生成器可用於許多不同的目的。除了明顯的應用,例如為了賭博而產生隨機數或在計算機遊戲中產生不可預測的結果,隨機性對於密碼學來說是重要的。

密碼學需要攻擊者無法猜測的數字。我們不能一遍又一遍地使用相同的數字。我們希望以非常不可預測的方式生成這些數字,因此攻擊者無法猜測它們。無論您是加密自己的文件還是僅使用Internet上的HTTPS網站,這些隨機數對於安全加密至關重要。

真隨機數

您可能想知道計算機如何實際生成隨機數。這種“隨機性”來自何處。如果它只是一塊計算機代碼,計算機生成的數字是否可能是可預測的?

我們通常將計算機生成的隨機數分為兩種類型,具體取決於它們的生成方式:“真實”隨機數和偽隨機數。

為了生成“真實”的隨機數,計算機測量在計算機外發生的某種類型的物理現象。例如,計算機可以測量原子的放射性衰變。根據量子理論,沒有辦法確定何時會發生放射性衰變,因此這基本上是來自宇宙的“純隨機性”。攻擊者無法預測何時會發生放射性衰變,因此他們不會知道隨機值。

對於更多的日常示例,計算機可能依賴於大氣噪聲,或者只是使用鍵盤上按鍵的確切時間作為不可預測數據或熵的來源。例如,您的計算機可能會注意到您在下午2點後正好在0.23423523秒按下了一個鍵。抓住與這些按鍵相關的特定時間,您將擁有一個可用於生成“真實”隨機的熵源數。你不是一個可預測的機器,所以當你按下這些鍵時,攻擊者無法猜出精確的時刻。 Linux上的/ dev / random設備生成隨機數,“阻塞”並且不會返回結果,直到它收集足夠的熵來返回真正的隨機數。

偽隨機數

偽隨機數是“真實”隨機數的替代。計算機可以使用種子值和算法來生成看似隨機的數字,但實際上是可預測的。計算機不會從環境中收集任何隨機數據。

在任何情況下,這都不一定是壞事。例如,如果您正在玩視頻遊戲,那麼在該遊戲中發生的事件是否由“真實”隨機數或偽隨機數加起來並不重要。另一方面,如果您使用加密,則不希望使用攻擊者可能猜到的偽隨機數。

例如,假設攻擊者知道偽隨機數生成器使用的算法和種子值。並且假設加密算法從該算法獲得偽隨機數並使用它來生成加密密鑰而不添加任何額外的隨機性。如果攻擊者足夠了解,他們可以向後工作並確定加密算法在這種情況下必須選擇的偽隨機數,從而破壞加密。

NSA和英特爾的硬件隨機數發生器

為了使開發人員更容易並幫助生成安全的隨機數,英特爾芯片包括一個基於硬件的隨機數生成器,稱為RdRand。該芯片在處理器上使用熵源,並在軟件請求時向軟件提供隨機數。

這裡的問題是隨機數生成器本質上是一個黑盒子,我們不知道它內部發生了什麼。如果RdRand包含NSA後門,政府將能夠破壞僅使用該隨機數生成器提供的數據生成的加密密鑰。

這是一個嚴重的問題。 2013年12月,FreeBSD的開發人員取消了直接使用RdRand作為隨機源的支持,稱他們無法信任它。 [Source] RdRand設備的輸出將被輸入另一個算法,增加額外的熵,確保隨機數發生器中的任何後門無關緊要。 Linux已經以這種方式工作,進一步隨機化來自RdRand的隨機數據,這樣即使有後門也無法預測。 [來源]在Reddit最近的AMA(“Ask Me Anything”)中,英特爾首席執行官Brian Krzanich沒有回答有關這些擔憂的問題。 [資源]

當然,這可能不僅僅是英特爾芯片的問題。 FreeBSD的開發人員也提到了Via的芯片。這一爭議表明為什么生成真正隨機且無法預測的隨機數非常重要。


為了生成“真實的”隨機數,隨機數生成器從它們周圍的物理世界收集“熵”或看似隨機的數據。對於沒有的隨機數 需要隨機,他們可能只使用算法和種子值。

Link
Plus
Send
Send
Pin