Randomness

將 System.Random 與加密安全的偽隨機數生成器結合起來是否安全?

  • July 4, 2016

查看以下用 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 週期。

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