Dot-Net
為什麼 RSACryptoServiceProvider.Encrypt() 輸出不穩定?
直到今天,我的印像是使用 RSA 的 RSA 加密是確定性的。畢竟,如果不是,簽名驗證應該如何工作?
令我大吃一驚的是,.NET
RSACryptoServiceProvider在使用相同的密鑰加密相同的字節集時沒有穩定的輸出:[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上填寫錯誤報告並包括您正在使用的版本號。