Mersenne Twister 的替代品
我們有 Mersenne Twister 偽隨機數生成器。它有幾個變體,其中有 CryptMT,它是加密級別的。
Mersenne Twister 有其他替代品,例如 Xorshift 或 Xoroshiro。
問題:這些算法是否具有加密變體,或者它們本身是否安全,或者是否有其他簡單的偽隨機數生成器適用於加密?
我需要一個具有良好隨機屬性的生成器,因為它將用於生成隨機矩陣(不是鍵)。同時它必須足夠不可預測,這樣攻擊者幾乎無法控制在弄亂種子時會生成什麼矩陣。
澄清:
設置如下:選擇一個隨機種子並用於在布爾環上生成偽隨機方陣。這些矩陣,當隨機選擇時,有一定的機率是奇異的或不是奇異的。PRNG 必須生成這樣的序列,因此矩陣奇異的機率與隨機選擇的機率相同。
矩陣不是秘密的,它們呈現給使用者並且不需要前向保密。基於初始狀態,使用者可能能夠預測序列中的所有下一個矩陣,只要他們承認正確的機率分佈。
攻擊場景:
攻擊者可能能夠更改隨機種子的某些位。並非所有位,因為他可能僅限於僅更改種子的一部分位,或一次翻轉幾個位。即使被攻擊者俱有這種能力,矩陣奇異的機率也應該與隨機選擇的機率相同。
更難的問題:
我們不僅希望矩陣的(非)奇異性接近隨機分佈,而且還希望它的秩。
XorShift 和 Xoroshiro 是 LFSR。LFSR是一些以硬體實現為重點的算法的組成部分。LFSR 本身並不安全。它們是線性的,因此可以從幾個已知的輸出位預測它們的狀態(以及未來的輸出)。在使用 LFSR 的流密碼中必須使用額外的操作。
Mersenne twister 基於廣義回饋移位寄存器,因此具有相似的特性。(注意,廣義並不意味著更好。Sebastiano Vigna 推薦的算法更快、更小,並且輸出質量更好。)
CryptMT 在 Mersenne Twister 之上添加的操作不一定(並且可能不會)適用於不同的基礎 RNG。所以不要嘗試製作自己的科學怪人算法。
我們甚至不應該相信 CryptMT 是安全的。與其他算法相比,它沒有受到太多審查。它的設計與眾不同。(對我來說,它看起來既特別又脆弱。就像 RC4。)
它被拒絕支持其他密碼的原因是因為*“密碼的安全性,特別是非線性過濾器組件,可能還沒有像其他一些入圍者那樣被充分理解。”*
大多數非安全 RNG 與安全 RNG 完全不同。不安全的 RNG 充其量只能執行足夠的加擾以使序列中的模式更難被注意到。安全的 RNG 必須沒有可利用的偏差或模式,不能允許攻擊者使用已知輸出來預測他們尚未看到的過去/現在的輸出位,並且不能容易受到密鑰/種子恢復的影響。
從不安全的 RNG 建構更好的安全 RNG 並不容易。任何僅基於過濾的方法都是有問題的。您可以調整原始 RNG 直到它是安全的,但這將是一個完全不同的算法。或者,您可以像在 CTR 模式下那樣通過 PRF 傳遞輸出。但是您可以對 PRF 使用任何非重複序列,包括更便宜的序列,例如遞增計數器。
我建議使用ChaCha而不是 CryptMT 。大多數人,除非他們有充分的理由使用另一種特定算法,否則應該為他們編寫的軟體選擇 ChaCha。ChaCha 快速、安全,並有效利用現代電腦硬體。
(如果您必須在嵌入式系統上使用輕量級算法,那麼答案取決於幾個因素。)
你寫了:
同時它必須足夠不可預測,這樣攻擊者幾乎無法控制在弄亂種子時會生成什麼矩陣。
這可能會排除一些算法。密碼算法的安全性通常取決於隨機選擇的密鑰。(某些算法存在相關的密鑰攻擊和弱密鑰類。)特別是對於 RNG,攻擊者可能會決定所需的 RNG 狀態並向後執行初始化過程以找到導致該狀態的種子。
將ChaCha用作RNG沒有這樣的問題。如果您不需要算法保密,您可以自由選擇密鑰、IV 和計數器值。(理想情況下,使用密鑰並將攻擊者控制的變數限制為 IV。)
因為來自 ChaCha 的每個輸出塊都是使用(非常好的)單向函式生成的,所以不可能用任何比蠻力更快的方法搜尋所需的種子。某些基於散列的 RNG 也不會有這個問題。
從流密碼改編為 RNG 的 ChaCha 應該是您安全確定性 RNG 的首選。(但它不提供回溯阻力,因此請考慮在一段時間後擦除或更換密鑰。)
或者,Blake2X、Skein 和 KMAC 可以適應您的第二選擇。它們都接受密鑰並且都是可擴展的輸出函式,因此可以輸出任意數量的偽隨機位。
忘記 Mersenne Twister 和 xorshift;也許 CryptMT 是安全的,但自從十年前被 eSTREAM 產品組合拒絕後,它幾乎沒有受到審查。密碼學中充斥著很好的偽隨機數生成器,比如 ChaCha:如果你隨機均勻地挑選種子,攻擊者就沒有希望區分輸出和均勻隨機數,而世界對這種情況有很高的信心,因為它已經受到經過嚴格審查,ChaCha 在全球 HTTPS 中保護了數万億歐元的經濟價值。
如果您已經測量了性能,並且您已經進行了概要分析,並且您已經確認在 ChaCha 上花費了很多時間,並且您確信這永遠不會與安全相關 - 特別是,如果您可以量化您需要的統計測試打敗並爭辯說更聰明的統計測試永遠不會相關-那麼也許你會有理由去別處尋找。但是你可以用 ChaCha 做的第一件事就是將輪數從預設的 ChaCha20 調低到更便宜的 ChaCha12 甚至更便宜的 ChaCha8。
更新,對於問題的附錄:
如果對手可以控制種子,那麼即使您使用隨機預言機進行 PRNG(這是可能的最強模型——ChaCha 沒有達到,但對於 SHAKE128 來說是一個合理的模型),對手可以花費預期的 $ t $ 試驗尋找具有僅發生的屬性的種子 $ 1/t $ 當時,像 $ t = 2^n $ 嘗試尋找種子,在該種子下 $ n $ 輸出位全為零。再多的密碼學也無法幫助您解決這個問題。
但是,如果對手無法控制種子,那麼您想要的屬性(具有高機率的非奇異矩陣)基本上可以通過任何加密 PRNG 得到保證。如果不是,那麼假定的加密 PRNG 將非常糟糕,因為一個非常簡單的測試——生成一個矩陣並測試它是否是非奇異的——將作為對 PRNG 的攻擊,甚至在不知道 PRNG 是如何設計的情況下破壞它!