До сегодняшнего дня у меня было впечатление, что шифрование 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
не влияет на дешифрование, что вполне возможно и дает ожидаемые данные.