計算機為從密碼學到電子遊戲和賭博的所有東西生成隨機數。隨機數有兩類——“真”隨機數和偽隨機數,兩者的區別對於加密系統的安全性非常重要。
計算機可以透過觀察一些外部資料(如滑鼠移動或風扇噪音,這是不可預測的)並從中建立資料來生成真正的隨機數。這就是所謂的熵。另一些時候,他們透過使用一種演算法生成“偽隨機”數,這樣結果看起來是隨機的,即使它們不是。
這個話題最近爭議更大,很多人質疑英特爾內建的硬體隨機數發生器晶片是否值得信賴。要理解為什麼它可能不可信,首先必須瞭解隨機數是如何生成的,以及它們的用途。
隨機數已經使用了幾千年。無論是擲硬幣還是擲骰子,目標都是把最終結果留給隨機的機會。計算機中的隨機數發生器是類似的——它們試圖得到一個不可預測的隨機結果。
相關:什麼是加密,它是如何工作的?
隨機數生成器有許多不同的用途。除了為賭博目的生成隨機數或在電腦遊戲中產生不可預測的結果等明顯的應用之外,隨機性對於密碼學來說也很重要。
密碼學需要攻擊者猜不到的數字。我們不能一次又一次地使用相同的數字。我們希望以一種非常不可預測的方式生成這些數字,以便攻擊者無法猜到它們。這些隨機數對於安全加密是必不可少的,無論你是加密自己的檔案還是僅僅使用網際網路上的HTTPS網站。
你可能想知道計算機是如何產生一個隨機數的。這種“隨機性”從何而來。如果只是一段計算機程式碼,難道計算機生成的數字不可能是可預測的嗎?
我們通常將計算機生成的隨機數分為兩類,具體取決於它們的生成方式:“真”隨機數和偽隨機數。
為了產生一個“真實”的隨機數,計算機測量發生在計算機外部的某種物理現象。例如,計算機可以測量原子的放射性衰變。根據量子理論,無法確定何時會發生放射性衰變,因此這本質上是來自宇宙的“純粹隨機性”。攻擊者無法預測何時會發生放射性衰變,因此他們不知道隨機值。
舉一個更為日常的例子,計算機可能依賴於大氣噪聲,或者僅僅使用鍵盤上按鍵的準確時間作為不可預測資料或熵的來源。例如,您的計算機可能會注意到您在下午2點後0.23423523秒按了一個鍵。。抓取足夠的特定時間與這些按鍵,你會有一個熵的來源,你可以用來生成一個“真正的”隨機數。你不是一臺可預測的機器,所以攻擊者無法猜出你按下這些鍵的確切時間。Linux上的/dev/random裝置生成隨機數,“阻塞”並在收集足夠的熵以返回真正的隨機數之前不返回結果。
偽隨機數是“真”隨機數的另一種選擇。計算機可以使用一個種子值和一個演算法來生成看似隨機但實際上是可預測的數字。計算機不會從環境中收集任何隨機資料。
這不一定在任何情況下都是壞事。例如,如果你在玩一個電子遊戲,遊戲中發生的事件是由“真”隨機數還是偽隨機數引起的其實並不重要。另一方面,如果使用加密,則不希望使用攻擊者可以猜到的偽隨機數。
例如,假設攻擊者知道偽隨機數生成器使用的演算法和種子值。假設一個加密演算法從這個演算法中得到一個偽隨機數,並使用它生成一個加密金鑰,而不增加任何額外的隨機性。如果攻擊者知道的足夠多,他們可以逆向工作,並確定加密演算法在這種情況下必須選擇的偽隨機數,從而破壞加密。
為了使開發人員的工作更輕鬆,並幫助生成安全的隨機數,英特爾晶片包括一個基於硬體的隨機數生成器RdRand。該晶片在處理器上使用熵源,並在軟體請求時向軟體提供隨機數。
這裡的問題是,隨機數生成器本質上是一個黑盒子,我們不知道里面發生了什麼。如果RdRand包含一個NSA後門,**將能夠破解僅由隨機數生成器提供的資料生成的加密金鑰。
這是一個嚴重的問題。2013年12月,FreeBSD的開發人員取消了直接使用RdRand作為隨機性來源的支援,稱他們無法信任它。[來源]RdRand裝置的輸出將被輸入到另一個增加額外熵的演算法中,確保隨機數生成器中的任何後門都不重要。Linux已經以這種方式工作了,它進一步將來自RdRand的隨機資料隨機化,這樣即使有後門也無法預測。[來源]在最近一次關於Reddit的AMA(“問我任何事”)中,英特爾執行長布萊恩•克扎尼奇(briankrzanich)沒有回答有關這些問題的問題。[來源]
當然,這可能不僅僅是英特爾晶片的問題。FreeBSD的開發者也直呼Via晶片的名字。這場爭論說明了為什麼產生真正隨機且不可預測的隨機數是如此重要。
為了生成“真”隨機數,隨機數生成器從周圍的物理世界收集“熵”或看似隨機的資料。對於實際上不需要隨機的隨機數,它們可以只使用一個演算法和一個種子值。
圖片來源:Flickr上的rekre89,Flickr上的Lisa Brewster,Flickr上的Ryan Somma,Flickr上的huangjiahui
... 之後,您只需將U2F金鑰**計算機,等待應用程式或登入門戶識別它。有時你需要按一下按鍵本身上的一個小按鈕來啟用連線。 ...
... 雖然聽起來很簡單,但實際上計算機在生成隨機數時遇到了麻煩。這是因為計算機是按照指令設計的,這與隨機性相反。你不能只是告訴機器“想出一個隨機數”,因為給出如何隨機選擇的指令是一個...
...格中。 無論是學習資料透視表、嘗試格式化,還是學習如何為下一次演示建立圖表,這些虛擬資料都可以證明正是您完成工作所需要的。
...他範圍,但RANDBETWEENfunction是一種更簡單的方法。 相關:計算機如何生成隨機數 單擊要**隨機數的單元格,然後鍵入=randbween(<Low>,<High>),但將<Low>和<High>替換為希望隨機...
...得到的校驗和匹配,您就知道您擁有的檔案是相同的。 計算機使用校驗和樣式的技術在後臺檢查資料是否有問題,但您也可以自己進行。例如,Linux發行版通常提供校驗和,這樣您就可以在將Linux ISO刻錄到光碟或放在USB驅動器之...
...動到另一個人或另一個地方,並驗證交易,即花錢,需要計算能力。被稱為“礦工”的使用者允許他們的計算機被系統用來安全地驗證單個交易。這些使用者的貢獻將獲得新的比特幣獎勵。然後,這些使用者可以將新的比特幣用...
...動到另一個人或另一個地方,並驗證交易,即花錢,需要計算能力。被稱為“礦工”的使用者允許他們的計算機被系統用來安全地驗證單個交易。這些使用者的貢獻將獲得新的比特幣獎勵。然後,這些使用者可以將新的比特幣用...
...把他們扔進垃圾箱”的古怪說法 /dev/random–使用環境噪聲產生隨機性。這是一個隨機數發生器,你可以進入。 /dev/zero–生成零–一個恆定的零流。 如果你把這三個看作檔案,你就看不到它們的用處了。相反,把它們當作工具。...
...數。關於隨機數和隨機數,要記住的一點是,和許多其他計算機操作一樣,它從零開始計數。因此,與其得到Random 10,意思是更自然的“給我一個從1到10的數字”,它實際上意味著“給我一個從0到9的數字”。你可以更具體地選...