Randomness
將 System.Random 與加密安全的偽隨機數生成器結合起來是否安全?
查看以下用 C# 編寫的程式碼範例:
private static byte[] GetRandomBytes(int size) { byte[] buff = new byte[size]; // Create an array of crypto-secure random numbers using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) { rng.GetBytes(buff); } // Gets a random byte from a non-crypto-secure RNG and xors each element with it // Alternatively, xor each element with a new random number int unsafeRand = (byte)_random.Next(0, 255); for (int i = 0; i < size; i++) buff[i] ^= unsafeRand; return buff; }
將 .NET 加密安全隨機數生成器與不完善的隨機數生成器結合起來是否安全,例如通過
XOR
?
是的,如果您使用安全隨機數對任何值進行異或運算,您最終會得到安全隨機數。
通過假設不安全的隨機數是一個常數,您可以很容易地看到這一點。它只會改變數字,不會影響它們的相對機率。
是的,您可以,原因很簡單,即對具有任何值的完全隨機流進行異或仍然會產生隨機流——儘管顯然非常依賴於源流的隨機性。
然而,這樣做絕對沒有意義。用種子良好的 PRNG 對流進行異或處理可能是個好主意,但是用單字節值(隨機或非隨機)或非加密安全流對它進行異或處理不會給您帶來任何額外的安全性。基本上你會毫無理由地浪費 CPU 週期。