13

今日まで、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復号化に影響しません。これは可能性が高く、期待されるデータが生成されます。

4

1 に答える 1

20

RSA 暗号化は純粋な数学であるため、毎回同じ結果が得られます。ただしEncrypt、.NET での呼び出しは、単に RSA 暗号化を行うだけではありません。

なんで ?falsePKCS#1 パディング ( で使用する場合のデフォルトEncrypt) は、(パディング目的で) ランダム データを含むため、暗号化されたすべての結果を異なるものにします。

Mono も同じ動作をします (少なくとも私のシステムでは、注を参照してください)。ただし、EncryptValueMono はサポートしているが .NET はサポートしていない (CryptoAPI の制限) を使用している場合パディングは行われず、暗号化された結果は毎回同じになります。

注:異なる結果が得られた場合は、 http://bugzilla.xamarin.comでバグ レポートに記入し、使用しているバージョン番号を含めてください。

于 2011-11-29T15:14:07.210 に答える