Почему вывод RSACryptoServiceProvider.Encrypt () нестабилен? - PullRequest
11 голосов
/ 29 ноября 2011

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

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

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

1 Ответ

18 голосов
/ 29 ноября 2011

RSA-шифрование является чисто математическим, поэтому каждый раз дает один и тот же результат. Однако вызов Encrypt в .NET - это не просто шифрование RSA.

Почему? Заполнение PKCS # 1 (по умолчанию при использовании false в Encrypt) будет отличать каждый зашифрованный результат, поскольку он содержит случайные данные (для целей заполнения).

Mono имеет такое же поведение (по крайней мере, в моей системе, см. Примечание). Однако, если вы используете EncryptValue, который поддерживает Mono, но .NET не поддерживает (ограничение CryptoAPI), тогда будет выполнено заполнение no , и зашифрованный результат будет каждый раз идентичен.

Примечание: Если у вас другие результаты, заполните отчет об ошибке на http://bugzilla.xamarin.com и укажите номер версии, которую вы используете.

...