13

直到今天,我的印象是使用 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不影响解密,这很有可能并产生预期的数据。

4

1 回答 1

20

RSA 加密是纯数学的,所以它每次都会给你相同的结果。然而,调用Encrypt.NET 并不是简单地进行 RSA 加密。

为什么 ?PKCS#1 填充(使用falsein时的默认值Encrypt)将使每个加密结果都不同,因为它包含随机数据(用于填充目的)。

Mono 具有相同的行为(至少在我的系统上,请参见注释)。但是,如果您使用EncryptValueMono 支持但 .NET 不支持的 .NET(CryptoAPI 限制),则不会进行填充,并且每次加密的结果都是相同的。

注意:如果您有不同的结果,请在http://bugzilla.xamarin.com上填写错误报告并包括您正在使用的版本号。

于 2011-11-29T15:14:07.210 回答