為 GPG 金鑰添加“隨機數熵”?

為 GPG 金鑰添加“隨機數熵”?

在下面的影片中:Linux HOWTO:使用 PGP 保護您的數據,第 2 部分,您將看到如何使用 建立密鑰對gpg。大約 時1:50,講師說了以下內容:

在產生金鑰時,最好移動滑鼠一點點給它更多的隨機數熵來創建金鑰對。

在我看來,這似乎是一個神話,特別是因為命令列工具通常不應該受到遊標的影響。另一方面,我不知道 Linux 的隨機數產生器是如何運作的,無論它是由 GUI 共享的還是獨立於 GUI 的。他所聲稱的內容是否有任何依據,或者這是一個例子貨物崇拜編程

答案1

這有一定道理,事實上比神話更真實,但儘管如此,這種說法反映了對正在發生的事情的根本誤解。是的,在使用 GPG 產生金鑰時移動滑鼠可能是個好主意。是的,移動滑鼠會產生一些熵,使隨機數變得隨機。不,移動滑鼠並不會使密鑰更安全。

所有適合密碼學的優秀隨機產生器(Linux 就屬於此類)都具有兩個元件:

  • 一個來源,這是不確定的。熵的目的是用不可預測的資料引導隨機數產生器。熵源必須是不確定的:否則,對手可以重現相同的計算。
  • A偽隨機數字產生器,它從不斷變化的內部狀態以確定性方式產生不可預測的隨機數。

熵必須來自電腦外部的來源。用戶是熵的來源之一。用戶所做的大部分不是隨機的,但是擊鍵和滑鼠移動的精細時機是不可預測的,因此有點隨機——不是非常隨機,而是一點一點地累積。其他潛在的熵來源包括網路資料包的計時以及攝影機或麥克風白噪音。不同的核心版本和配置可能使用不同的來源集。一些電腦具有基於放射性衰變的專用硬體 RNG 電路,或不太令人印象深刻的不穩定電子電路。這些專用來源在嵌入式設備和伺服器中特別有用,它們在首次啟動時可以具有相當可預測的行為,而無需用戶做奇怪的事情。

Linux 透過兩種裝置向程式提供隨機數:/dev/random/dev/urandom。從任一裝置讀取都會傳回加密品質。兩種設備都使用相同的內部 RNG 狀態和相同的演算法來轉換狀態並產生隨機位元組。它們有特殊的局限性,這使得它們都不是正確的事情:

  • /dev/urandom如果系統尚未累積足夠的熵,則可以傳回可預測的資料。
  • /dev/random計算可用熵的數量並在沒有足夠的情況下進行阻止。這聽起來不錯,只不過計算是基於理論考慮,使得可用熵的量隨著每個輸出位線性減少。因此/dev/random往往會很快阻塞。

Linux 系統將內部 RNG 狀態儲存到磁碟並在啟動時復原。因此,熵會從一隻靴子轉移到另一隻靴子。 Linux 系統可能缺乏熵的唯一情況是在新安裝時。一旦系統中有足夠的熵,熵就不會減少;只有Linux的有缺陷的計算減少了。有關此考慮因素的更多解釋,請閱讀/dev/urandom適合產生加密金鑰,由專業密碼學家。參見阿蘇你能解釋一下 random.c 中使用的熵估計嗎

移動滑鼠會為系統增加更多的熵。但gpg 只能讀取/dev/random,無法讀取/dev/urandom(解決這個問題的一個方法是製作/dev/random/dev/urandom),因此它永遠不會面臨接收不夠隨機的隨機數的風險。如果你不移動滑鼠,按鍵是盡可能隨機的;但可能發生的情況是 gpg 可能會被阻止在讀取中/dev/random,等待內核的熵計數器上升。

答案2

GPG 使用 Linux(核心)隨機數產生器。內核生成器從各個地方獲取熵(隨機性),其中包括對於某些中斷的中斷時序。移動滑鼠(以及打字、磁碟活動等)都會產生中斷。

因此,移動滑鼠確實可能會輸入到隨機數產生器中。但是否確實取決於所使用的確切核心版本;較新的版本不(至少在我的測試中)使用鍵盤或滑鼠中斷來獲取熵。然而,磁碟活動確實如此(因此,例如,運行sync將增加潛在的大量熵,具體取決於刷新的量)。

簡而言之:在目前的 Linux 版本上並非如此。這是在較舊的身上。

但是,如果生成器耗盡了熵,它應該會停止,因此您的金鑰產生將掛起,直到產生一些熵。所以這將會是永遠存在的問題,而不是安全問題。

您可以透過 看到有多少熵可用cat /proc/sys/kernel/random/entropy_avail

答案3

Tails 的金鑰產生速度非常快,因為它haveged安裝了:

sudo apt-get install haveged

相關內容