今日まで、RSA を使用した RSA 暗号化は決定論的であるという印象を受けていました。結局のところ、そうでない場合、署名の検証はどのように機能するのでしょうか?
驚いたことにRSACryptoServiceProvider
、同じキーで同じバイト セットを暗号化すると、.NET には安定した出力がありません。
[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
復号化に影響しません。これは可能性が高く、期待されるデータが生成されます。