Почему вывод RSACryptoServiceProvider.Encrypt() не стабилен?

До сегодняшнего дня я жил под впечатлением, что RSA-шифрование с использованием RSA является детерминированным. В конце концов, как должна работать проверка подписи, если это не так?

К моему большому удивлению, .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 Specification и понимаю математику RSA, поэтому мне действительно интересно, почему я наблюдаю нестабильность вывода.

Реализация RSA в Mono имеет стабильный вывод. Нестабильный вывод Encrypt не влияет на расшифровку, которая вполне возможна и дает ожидаемые данные.

11
задан Charles 29 November 2011 в 21:26
поделиться