Randomness

使用 CPU 時鐘漂移來生成隨機數據有什麼危險?

  • June 15, 2017

據我了解,通過使用兩個或多個核心之間的時鐘漂移,可以使用多核處理器來實現真正隨機性的物理來源。

然而,在真正的隨機數生成方面,處理器比核衰變或熱雜訊更容易操作。

我的問題是:

  1. 有沒有攻擊?
  2. 它們中的任何一個實用嗎?
  3. 是否可以採取任何措施或滿足條件來防止攻擊者有效操縱處理器的輸出?
  4. 最後,與提供的正確實現和安全的 CSPRNG 庫(如 java SecureRandom)相比,虛擬地偏置 cpu 有多容易?

我的最後一個問題對於不同的庫來說真的很主觀,但如果你能提供範例和場景或潛在攻擊向量的比較,它真的會幫助我理解。

我目前的印像是,將 CPU 用於 TRNG 與基於軟體的 CS-PRNG 一樣好,但我可能錯了。

從不使用 TRNG代替CSPRNG。它們服務於不同的目的。TRNG 用於播種CSPRNG。僅 CSPRNG 不足以生成隨機數據,因為它是可重現的。僅硬體熵源不足以生成隨機數據,因為所有熵源都有偏差。

對於與安全或密碼學相關的任何目的,隨機生成器 (CSRNG) 是通過使用熵源播種加密安全偽隨機生成器(CSPRNG) 來建構的,熵源是一些物理上獲得的不可預測的秘密輸入。CSPRNG白化熵源。

CSPRNG 將少量數據(通常為幾千位)轉換為有效的無限位流,並確保所有位都是獨立的。更準確地說,CSRNG 必須具有這樣的屬性:如果對手看到除一個以外的所有輸出位(但看不到 RNG 的內部狀態),他們不知道隱藏位是什麼:它可能是 0 或 1並且對手只能猜測非常接近的成功機會 $ 1/2 $ - 不多於 $ 1/2+2^{-N} $ 對於一個 CSRNG $ N $ -位質量(例如 $ N=128 $ )。CSPRNG 保證該屬性的前提是其種子足夠“多樣化”,因為對手無法猜測種子的成功機會比大約 $ 2^{-N} $ .

物理現象的離散化總是存在偏差:由於物理現象的特徵或測量誤差,某些位序列比其他位序列更有可能。將其用作 CSPRNG 的輸入會破壞連續位之間的所有相關性。CSPRNG 還具有其他好處,包括組合多種現象的能力,以及將源組合在一起永遠不會削弱結果的安全性(即使對手部分或完全知道其中一個源,結果的質量RNG 仍然至少與其他來源一樣好)。


現在真正的問題是,時鐘漂移(抖動)作為熵源有用嗎?答案是肯定的,它是在實踐中使用的Vasyltsov 等人的基於亞穩態環形振盪器的快速數字 TRNG 。(2008)在第 2 節中概述了該領域的工作。

如果您是應用程序編寫者,那麼這不是您需要關心的事情。熵收集由作業系統完成。

如果您是系統集成商,則必須注意您的系統具有適當的熵源。所有現代 PC 處理器 ( RDRAND ) 和智能手機(執行 iOS、Android 或 Windows)都有硬體 RNG(使用不同晶片的物理現象)。嵌入式設備種類繁多,有些具有良好的熵源,有些則沒有;時鐘漂移在這個領域通常是無關緊要的,因為沒有足夠的不同時鐘(除非提供了一個用於通過漂移產生熵的目的,在這種情況下,製造商通常會提供一些韌體或驅動程式碼來執行所需的測量)。

測量時鐘漂移並非易事。您需要確保從不同步的時鐘中讀取數據。您需要給系統足夠的時間來初始化,然後讓時鐘不同步。您需要注意環境參數;例如,某些時鐘在足夠高的溫度下可能無法有效預測,但在較低溫度下完全可以預測。一個好的硬體 RNG 將提供質量估計。對熵源的統計測試有時可以幫助確定它是否正常執行,但偏差的類型通常取決於源的物理構造,測試需要考慮這種物理構造才能有效。

最大的危險是在繁忙的電腦中使用時鐘漂移的固有特性。準確估計熵產生的速率是非常困難的。你不能依賴你將得到的東西,因此滿足(輸入熵)>(輸出熵)的黃金法則變得有問題。

實際上,當所有核心互動時,您可以只使用一個核心來生成大量熵。只需獲取系統時間,就像 Java 中的 System.nanos 一樣。做這個:-

print System.nanoTime() & 0xff

這將生成如下數據:-

206
84
183
130
70
18
14
60
181
185

這個數字序列有點不可預測,但會根據您的機器正在做什麼和機器的類型而有所不同。可能還有天氣。

大量這些數據看起來像:-

熵

你可以清楚地看到結構。您還可以看到結構在圖像中不斷變化。如果您可以放大文件,您可以更清楚地看到它。這種變化就是熵分量。對於這個精確的圖像,熵大約相當於 280,000 位或 1.1 位/字節的 14%。(通過壓縮測量熵。)因此,14% 的圖像不斷變化,而剩餘的 86% 是固定的,這看起來有點道理。該熵收集率特定於我的機器,當時我在流式傳輸恍惚音樂時收集它。

所有這些數據在理論上都是可以預測的,但實際上並不是因為 Java 機器的內部非常混亂。一個等價物就是扔掉一個骰子。雖然我們了解骰子翻滾時的所有固有過程,但我們無法預測得分。通過讀取時間可以簡單地對電腦的混沌環境進行採樣生成純熵。只是由於同樣的混亂情況,熵率太難預測了。這就是危險。這次我得到了 14%。你很可能會得到完全不同的東西,尤其是當你聽不同的音樂或 CD 時。

PS。實際上,熱雜訊 TRNG 很容易操縱。您所要做的就是把手放在上面並加熱它。偏差和熵率將隨之改變。

聚苯乙烯。Java 的 SecureRandom 有效地使用了我上面解釋過的技術來播種自己。它乘以不同執行緒的速率,這些執行緒恰好受到影響 System.nanos 的事物的干擾。

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