Random-Number-Generator

密鑰生成算法從哪裡獲取隨機性?

  • April 25, 2017

我只是想知道,因為在許多加密工具(如 Veracrypt 或 GnuPG)中,您必須通過滑鼠移動來生成偽隨機性。那麼,自動生成的密鑰是從哪裡獲取隨機性的呢?例如,當您使用 OpenSSL 生成 RSA 證書時。

生成密鑰的應用程序從作業系統獲取隨機性(熵)。反過來,作業系統在它可以找到的地方獲得隨機性。理想情況下,作業系統從適當的硬體生成器中獲得隨機性,該生成器存在於現代 PC 和智能手機處理器中。這些硬體生成器基於不可重現的物理現象;存在多種技術. 此外,作業系統通過使用者操作(例如移動滑鼠)、網路數據包、磁碟讀取等的時間來積累隨機性。來自麥克風或攝像頭的白雜訊也可以提供隨機性。這種特殊來源的困難在於很難估計它們的隨機性:硬碟的時間在理論上是可預測的(SSD 更是如此),給定的使用者傾向於以大致相似的方式行事,感測器可能已飽和等。這就是為什麼專用硬體生成器更可取的原因,前提是它已正確程式和使用。

硬體隨機源永遠不會直接使用,因為它們往往具有很強的偏差:它們不會以整齊的位出現,有可能是 0 或 1。隨機性是通過稱為偽隨機數生成器(PRNG ) 的加密算法提供的。 ) 從少量(數百位)熵中產生幾乎無窮無盡的均勻隨機位流。

作業系統有一個有用的工具來減少收集熵的費用:熵不會耗盡,因此可以保存和重用。作業系統可以保存隨機生成器的狀態,並在啟動時載入它,生成新狀態並保存。這樣,一旦有足夠的熵,那台機器上就會永遠有足夠的熵。

Veracrypt、GnuPG 等應用程序要求作業系統提供隨機性。在 Linux 上,他們可以讀取/dev/randomor/dev/urandom或呼叫getrandom系統呼叫(它們之間的差異超出了此答案的範圍)。在 Windows 上,系統呼叫是CryptGenRandom. 其他旨在支持加密應用程序的作業系統具有類似的介面。

應用程序幾乎總是使用作業系統的隨機生成器作為它們自己的 PRNG 的種子。這在密碼學上是安全的並提高了性能。

為什麼有些應用程序要求您移動滑鼠?有幾個原因:

  • 如果作業系統在其隨機生成器中沒有那麼多熵,這會稍微改善這種情況。
  • 一些應用程序是為 20 世紀缺少隨機生成器介面的作業系統(例如 Windows 9x)編寫的,並且需要收集自己的熵。
  • 正如你所看到的,它給使用者一種溫暖的模糊感覺,他們得到了一些非常隨機的東西。其實主要是作秀。

OpenSSL 庫提供了許多基於各種來源的基於軟體的隨機數生成器。基於軟體的 RNG(隨機數生成器)通過執行軟體算法生成隨機數。為此目的,包括 NIST、ANSI X9 委員會和 XXX 在內的標準機構規定了許多算法。如果您要使用的硬體提供 ENGINE 介面,OpenSSL 還允許包含您自己的 RNG 硬體。最近在類 Unix 作業系統上執行的 OpenSSL 版本嘗試使用 /dev/random、/dev/urandom 和 EGD 為他們的 RNG 播種。/dev/random 源是一個特殊文件,用作阻塞偽隨機數生成器,它允許訪問從設備驅動程序和其他源收集的環境雜訊。但請注意,OpenSSL 不會嘗試估計其 RNG 有多少熵。

一般來說,您可以說真正的隨機數很難從確定性過程(例如執行指令的電腦)中產生。系統的熵越低,創建適合密碼應用程序的真正隨機數就越困難。這似乎是嵌入式系統和應用程序中的一個大問題,這些系統和應用程序通常在記憶體內容或外圍設備方面具有確定性的啟動行為。

如前所述,創建好的隨機數需要足夠的熵。您提供的範例從使用者的滑鼠移動中收集了一些熵,這被認為是非常隨機的。如果您不想對著麥克風大喊大叫或為需要生成的每個鍵移動滑鼠,還可以選擇使用硬體模組。如今,這些可以很便宜地獲得(從兩位數範圍開始)。例如,我以前工作的公司使用了一個硬體隨機數生成器,它利用量子光學的基本隨機特性作為真正隨機性的來源。它是 USB 介面的,允許的隨機數據流速度高達 16 Mbps。我們使用該硬體作為 OpenSSL 的引擎來創建我們的 ECC 和 RSA 密鑰。

引用自:https://crypto.stackexchange.com/questions/46864