隨機數生成器在密碼學上是安全的意味著什麼?
我從來沒有聽到過好的答案。我想听聽有關以下內容的詳細資訊:
- 使 RNG 加密安全的標準是什麼?
- 為什麼您的 RNG 必須是加密安全的?即,如果不是,會有什麼後果?
- 安全和不安全 RNG 的範例
- 非偽隨機生成器在密碼學上是安全的嗎?例如,基於粒子的放射性衰變。
使 RNG 加密安全的標準是什麼?
簡而言之,一個 DRBG
$$ deterministic random bit generator $$如果計算受限的攻擊者在將其與真正的隨機源區分開來沒有優勢,則被正式認為是計算安全的。 這是什麼意思?給定一個 DRBG
F
和一個真正隨機的預言機G
,讓我們A
成為一個機率“攻擊者”,在對給出的函式進行查詢後接受F
or並輸出 1 或 0。G
我們將攻擊者的優勢定義Adv
為|Pr[A(F)=1] - Pr[A(G)=1]|
。如果Adv
不可忽略地大於零,則認為 DRBG 已損壞。1
在這個定義中,請注意返回或“意味著”是什麼並不重要0
,只是我們只關心在給定and時返回一個或另一個的機率A
是否不同。F``G
用英語來說,如果存在一個可計算的函式可以可靠地區分黑盒 DRBG 和黑盒真正隨機函式之間的區別,那麼我們認為它是 DRBG 的一個突破。
為什麼您的 RNG 必須是加密安全的?即,如果不是,會有什麼後果?
對於這樣的問題,這可能太寬泛了。在某些情況下,它不一定是。在某些情況下,即使是輕微的弱點也可能導致幾乎完全喪失機密性或真實性。弱 RNG 的含義完全取決於使用它的系統和上下文。
安全和不安全 RNG 的範例
有多種 DRBG,用於不同的目的。
Yarrow和後來的Fortuna算法接受未知質量的熵源作為輸入,將它們混合,並產生具有強大保證的熵流作為輸出。它們具有抵抗注入攻擊的自愈特性;即使攻擊者控制了幾乎所有的輸入,在有限的時間之後,輸出對於攻擊者也將變得無法區分。
這對於系統 RNG 來說是一個非常有用的屬性,例如作業系統核心使用並通過
/dev/urandom
、getentropy(2)
和提供給使用者空間的那些CryptGenRandom()
(注意:這些介面可能實際使用也可能不使用 Yarrow 或 Fortuna,它們只是系統 RNG 類型的範例這些算法是專為)。ChaCha20等流密碼或CTR 等流模式中的分組密碼實際上只是加密種子 DRBG。這些算法的設計或意圖不是像上述算法那樣防御注入可預測輸入的攻擊者,但它們以非常高的速度產生近乎無限的隨機流,只需一個小的初始隨機密鑰和 IV。然後可以將這些流與明文進行異或運算,以生成加密強度高的密文。更好的是,這些算法通常是可搜尋的。給定密鑰、IV 和長密文,您通常可以深入密文並解密各個位,而無需計算整個流。
我不會在這裡列出不安全的 DRBG。有太多無法列出,一般假設應該是 DRBG 是不安全的,除非另有說明。
非偽隨機生成器在密碼學上是安全的嗎?例如,基於粒子的放射性衰變
非偽隨機生成器是唯一甚至能夠在資訊理論上安全的生成器,這比計算安全性要強得多。使用計算安全的 DRBG,一個小的
n
比特種子被擴展成一個更大的加密流;那個更大的流仍然只是最多2^n
可能流的一種選擇。諸如放射性衰變和熱雜訊之類的隨機量子源在物理定義上是真正隨機的。