如果用作隨機輸入,文件的大小是否會影響隨機性?
(我是 cypto amatuer )所以在 Openssl 中有一個“-rand”選項用於獲取包含 RNG 隨機性的文件。所以我認為採取一個相當大的文件會使其更安全。因此,如果您使用 2048 位隨機二進製文件格式“ https://www.random.org ”“由宇宙噪音製成,你會很安全嗎?但問題是,如果我多次使用該文件,它總是相同的“隨機”輸入,所以我必須將文件保密。所以最好每次使用它都像 2048 位中的一個 0 或 1 一樣變化嗎?但是問題來了:在 2048 位中更改單個字元最終會在多大程度上影響輸出的隨機性?就像在輸出的地方進行散列一樣僅更改一位後完全不同,還是輸出幾乎相同?
OpenSSL 將獲取文件並將其輸入到其內部 PRNG(偽隨機數生成器)中。該 PRNG 的內部狀態由 1023 字節緩衝區和工作雜湊值(20 字節 sha1 雜湊)組成
用於播種 PRNG 的算法繞過緩衝區,以 20 字節塊為單位修改緩衝區,同時更新工作雜湊值。
問:我應該把文件變大嗎?
任何比 PRNG 的狀態大小(1043 字節)大得多的東西都是浪費的。輸入超過這麼多字節的隨機數據不會提高安全性(通過使最終的 PRNG 狀態更難猜測)。
問:如果我打算重用數據,我應該在哪裡放置計數器值?
將它放在文件的開頭可能會稍微好一些。
假設您在文件末尾放了一個小整數。該整數將最後輸入 PRNG。這意味著大部分大型緩衝區將不受其值的影響。保證只有工作雜湊會受到影響。
這不是一個真正的問題。所有輸出都依賴於工作雜湊,160 位的熵足以阻止現實世界的攻擊者(即使是使用量子電腦的攻擊者)。
我應該這樣做嗎?
不,這是一種脆弱的方法。如果攻擊者獲得種子文件(您計劃重複使用),他們可以生成您生成的所有密鑰。這使它成為一項巨大的責任。如果為您提供隨機數據的服務不可信,他們可能已經這樣做了。
如果您打算使用這樣的文件,您還必須包含來自其他來源的額外隨機性。您可以從作業系統中獲取它(例如:在 linux 上讀取 /dev/urandom),或者只是敲擊鍵盤 30 秒。更多的熵源不會受到傷害,並且會防止這種失敗。
另外,考慮一下,如果您相信您的作業系統不會竊取密鑰,為什麼不相信它可以提供隨機性?大多數作業系統在擷取和提供隨機性方面做得很好(只要你等到啟動後幾分鐘)。