Dot-Net

為什麼 RSACryptoServiceProvider.Encrypt() 輸出不穩定?

  • November 29, 2011

直到今天,我的印像是使用 RSA 的 RSA 加密是確定性的。畢竟,如果不是,簽名驗證應該如何工作?

令我大吃一驚的是,.NETRSACryptoServiceProvider在使用相同的密鑰加密相同的字節集時沒有穩定的輸出:

[Fact]
public void Learning()
{
   const int keySize = 1024;

   System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(keySize);

   var bytes = GenerateRandomDataWithLength( 36 );

   for (int i = 0; i < 4; i++)
       Assert.Equal( rsa.Encrypt( bytes, false ), rsa.Encrypt( bytes, false ) );
}

byte[] GenerateRandomDataWithLength( int length )
{
   Random r = new Random();

   byte[] data = new byte[length];
   r.NextBytes( data );

   return data;
}

我瀏覽了PKCS 規​​範,並且確實了解 RSA 背後的數學原理,所以我真的想知道為什麼我觀察到輸出不穩定。

Mono 的 RSA 實現具有穩定的輸出。的不穩定輸出Encrypt不影響解密,這很有可能並產生預期的數據。

RSA 加密是純數學的,所以它每次都會給你相同的結果。然而,呼叫Encrypt.NET 並不是簡單地進行 RSA 加密。

**為什麼 ?**PKCS#1 填充(使用falsein時的預設值Encrypt)將使每個加密結果都不同,因為它包含隨機數據(用於填充目的)。

Mono 具有相同的行為(至少在我的系統上,請參見註釋)。但是,如果您使用EncryptValueMono 支持但 .NET 不支持的 .NET(CryptoAPI 限制),則不會進行填充,並且每次加密的結果都是相同的。

注意:如果您有不同的結果,請在http://bugzilla.xamarin.com上填寫錯誤報告並包括您正在使用的版本號。

引用自:https://stackoverflow.com/questions/8310847