Pseudo-Random-Generator

可以重複塊的 PRNG 生成器

  • August 12, 2021

讓我們使用 AES 作為流密碼,讓我們使用作為輸入數字 $ 1,2,3,… $ . 這樣我們應該得到隨機塊,每個塊將彼此不同。

但是我有一個偽隨機塊生成器,它生成的塊並不總是不同的。所以我們可以阻止 $ B $ 一次又一次,例如在假設百萬塊之後,有可能再次獲得相同的塊 $ B $ (但可能很少見)。

它仍然是很好的隨機塊生成器(通過所有測試)。如果有人想將其用作 PRNG 或有人想將其用作加密流,這會不會有問題?

大多數密碼滿足它們生成唯一值的條件,但在這種情況下,我們可以在小於 $ 2^{128} $ 塊。

對於 CSPRNG,我會說它可以重複塊的事實是一件好事;預測一個模式不能重複是有問題的。通常可以接受的唯一原因是,重複較大塊的機會無論如何都可以忽略不計。

假設您將使用 CSPRNG 創建一組 128 位塊,即 AES 的塊大小。一百萬大約是 $ 2^{20} $ . 你會期望有機會 $ 1 - (1 - {1 \over 2^{128}})^{1000000} \approx 2^{-108} $ 對於要重複的初始塊,以及 $ {1000000 \over 2^{128}} \approx 2^{-(128 - 20)} = 2^{-108} $ 在前一百萬個區塊中發生任何碰撞。這些值大致相同的原因是,對於 128 位值,一百萬幾乎為零。如您所見,發生碰撞的可能性非常低,可以忽略不計。這就是為什麼像 AES-CTR 這樣的流密碼可以被認為是 CSPRNG 本身。

通常 CSPRNG 的內部狀態很大,這意味著不可能知道PRNG**何時重複。**更重要的是,他們擊中一個循環的機會非常低(如果一個循環被擊中,那麼 CSPRNG 將在重複中生成相同的 - 大 - 模式)。因此,由於不可預測性,您可以使用 CSPRNG 作為流密碼。當然,如果您在正確的位置查看 128 位以外的模式,AES / CTR 也是如此。顯然,單個位的模式會非常頻繁地重複 - 只是您無法知道在給定位置會找到哪個位值。AES-CTR 的問題在於它會在計數器耗儘後精確地達到一個週期。

但是,由於許多 CSPRNG實現 並未設計為生成相同的確定性流,因此在將其用作流密碼時應*格外小心。*例如,他們可以重新播種,使用給定的種子作為額外的熵,當方法被不同地呼叫時產生不同的輸出,甚至修改算法。如果您不走運,您將永遠無法重新生成相同的密鑰流,並且您的數據將會失去(例如getRawKey(),參見 Android 設備)。

當然,AES-CTR 通常也會比 CSPRNG 快很多。如果您不喜歡 AES 或沒有硬體加速,那麼像 ChaCha 這樣的流密碼通常是可行的方法。通常,您會在使用 GMAC (AES-GCM) 或 Poly1305 的身份驗證模式下使用這些密碼。

在密碼學文獻中,您經常會發現術語“流密碼”和“CSPRNG”可以互換使用,但要注意最後兩節中的實際差異。

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