rsacryptoserviceprovider.encrypt()出力が安定していないのはなぜですか?
-
25-10-2019 - |
質問
今日まで、私はRSAを使用したRSA暗号化が決定論的であるという印象の下で生きていました。結局のところ、署名検証がそうでない場合、どのように機能する必要がありますか?
私の大きなsupriseに、.netsに 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パディング(使用する場合のデフォルト false
の Encrypt
)ランダムデータが含まれているため、すべての暗号化された結果が異なるようになります(パディングの目的で)。
モノがあります 同じ 動作(少なくとも私のシステムでは、メモを参照)。ただし、使用している場合 EncryptValue
, 、Monoがサポートしていますが、.NETはそうではありません(Cryptoapiの制限)、次に 番号 パディングが行われ、暗号化された結果は毎回同一になります。
ノート: 結果が異なる場合は、バグレポートを記入してください http://bugzilla.xamarin.com 使用しているバージョン番号を含めます。