跳轉到內容

密碼學/隨機數生成

來自華夏公益教科書,開放的書籍,開放的世界

隨機數的生成對密碼學至關重要。密碼學演算法中最難的方面之一是依賴或生成真正的隨機資訊。這是有問題的,因為沒有已知的方法可以產生真正的隨機資料,尤其是沒有方法可以在有限狀態機(如計算機)上做到這一點。

一般來說,隨機數生成器有兩種:非確定性隨機數生成器,有時稱為“真隨機數生成器”(TRNG),以及確定性隨機數生成器,也稱為偽隨機數生成器(PRNG)。[1]

許多高質量的密碼系統都同時使用這兩種方法——硬體隨機數生成器來定期重新播種確定性隨機數生成器。

量子力學理論表明,一些物理過程本質上是隨機的(雖然收集和使用此類資料存在問題),但確定性機制,例如計算機,則不能。任何隨機過程(隨機數生成)在計算機上模擬,都不是真正的隨機,而只是偽隨機。

在偽隨機生成器的侷限性內,任何高質量的偽隨機數生成器都必須

  • 在所有維度上具有均勻分佈的值
  • 沒有可檢測的模式,即生成的數字之間沒有相關性
  • 具有非常長的迴圈長度
  • 沒有或易於避免的弱初始條件,這些條件會產生模式或短迴圈

偽隨機數生成方法

[編輯 | 編輯原始碼]

記住我們正在處理偽隨機數生成(即從有限狀態機,例如計算機生成的數字),有各種方法可以隨機生成數字。

在 C 和 C++ 中,函式rand() 返回零到 RAND_MAX(內部定義的常量)之間的偽隨機整數,透過srand() 函式定義;否則,它將使用預設種子,並且在程式重新啟動時始終返回相同的數字。大多數這樣的庫都具有較短的迴圈長度,不適用於加密目的。

“C 語言數值方法”回顧了幾種隨機數生成器,並建議將修改後的 DES 密碼作為他們推薦的最高質量隨機數生成器。“實用密碼學”(Ferguson 和 Schneier)推薦了一種他們命名為 Fortuna 的設計;它取代了他們早期稱為 Yarrow 的設計。

非確定性數生成方法

[編輯 | 編輯原始碼]

截至 2004 年,最好的隨機數生成器包含 3 部分:不可預測的非確定性機制、熵評估和調節器。非確定性機制(也稱為熵源)生成原始有偏位的位塊。熵評估部分對原始有偏位的位塊的最小熵進行保守估計。調節器(也稱為白化器、去偏演算法或隨機性提取器)將原始位塊提煉成一個更小的條件輸出位塊——輸出位塊的大小是原始有偏位位的估計熵(以位為單位)的一半——消除任何系統偏差。如果估計良好,則即使非確定性機制隨著時間的推移而下降,條件輸出位也是無偏的完整熵位。在實踐中,熵評估是最困難的部分。[2]

參考文獻

[編輯 | 編輯原始碼]
  1. NIST. "隨機數生成".
  2. John Kelsey. "X9.82 中的熵和熵源" NIST. 2004. "你測量的是你認為你在測量的嗎?" "樣本變異中有多少是熵,有多少隻是複雜性?"

進一步閱讀

[編輯 | 編輯原始碼]
華夏公益教科書