Hasta hoy vivía con la impresión de que el cifrado RSA con RSA es determinista. Después de todo, ¿cómo debería funcionar la verificación de firma si no fuera así?¿Por qué el resultado de RSACryptoServiceProvider.Encrypt() no es estable?
Para mi gran sorpresa, .NETs RSACryptoServiceProvider
no tiene una salida estable al cifrar el mismo conjunto de bytes con las mismas claves:
[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;
}
He desnatada a través de la PKCS Specification y me hacen entender las matemáticas detrás de RSA, entonces realmente me pregunto por qué estoy observando que la salida es inestable.
La implementación RSA de Mono tiene una salida estable. La salida inestable de Encrypt
no afecta el descifrado, que es muy posible y proporciona los datos esperados.
De acuerdo, olvidé por completo los datos aleatorios incluidos. Usted está claramente aquí. ¡Gracias por tu respuesta! (La versión mono a la que me refería era muy antigua, solo eran las fuentes de Monos RSA en realidad). –
@Johannes Tenga en cuenta que se necesita un relleno aleatorio para hacer que el cifrado RSA sea seguro contra los ataques de texto claro elegidos (es decir, encriptar un texto sin formato adivinado de nuevo para ver si el resultado coincide con el interceptado anteriormente). –
Para mayor claridad, agregaría que el uso de 'true' en' Encrypt' también da como resultado un relleno aleatorio, creo ('OAEP'). –