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