Tengo un problema con el cifrado de C# y el descifrado con RSA. Desarrollé un servicio web al que se enviará información y transacciones financieras delicadas. Lo que me gustaría poder hacer es en el lado del cliente, cifrar los campos determinados utilizando la clave privada RSA de los clientes, una vez que haya llegado a mi servicio, se descifrará con la clave pública del cliente.Encriptación/descifrado de RSA Problema en .NET
Por el momento sigo obteniendo un "Los datos que se descifrarán exceden el máximo para este módulo de 128 bytes". excepción. No he tratado mucho con la criptografía C# RSA, por lo que cualquier ayuda sería muy apreciada.
Este es el método que utilizo para generar las claves
private void buttonGenerate_Click(object sender, EventArgs e)
{
string secretKey = RandomString(12, true);
CspParameters param = new CspParameters();
param.Flags = CspProviderFlags.UseMachineKeyStore;
SecureString secureString = new SecureString();
byte[] stringBytes = Encoding.ASCII.GetBytes(secretKey);
for (int i = 0; i < stringBytes.Length; i++)
{
secureString.AppendChar((char)stringBytes[i]);
}
secureString.MakeReadOnly();
param.KeyPassword = secureString;
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(param);
rsaProvider = (RSACryptoServiceProvider)RSACryptoServiceProvider.Create();
rsaProvider.KeySize = 1024;
string publicKey = rsaProvider.ToXmlString(false);
string privateKey = rsaProvider.ToXmlString(true);
Repository.RSA_XML_PRIVATE_KEY = privateKey;
Repository.RSA_XML_PUBLIC_KEY = publicKey;
textBoxRsaPrivate.Text = Repository.RSA_XML_PRIVATE_KEY;
textBoxRsaPublic.Text = Repository.RSA_XML_PUBLIC_KEY;
MessageBox.Show("Please note, when generating keys you must sign on to the gateway\n" +
" to exhange keys otherwise transactions will fail", "Key Exchange", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
una vez que han generado las llaves, i enviar la clave pública al servicio web que almacena como un archivo XML.
Ahora decidí probar esto por lo que aquí está mi método para cifrar una cadena
public static string RsaEncrypt(string dataToEncrypt)
{
string rsaPrivate = RSA_XML_PRIVATE_KEY;
CspParameters csp = new CspParameters();
csp.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider provider = new RSACryptoServiceProvider(csp);
provider.FromXmlString(rsaPrivate);
ASCIIEncoding enc = new ASCIIEncoding();
int numOfChars = enc.GetByteCount(dataToEncrypt);
byte[] tempArray = enc.GetBytes(dataToEncrypt);
byte[] result = provider.Encrypt(tempArray, true);
string resultString = Convert.ToBase64String(result);
Console.WriteLine("Encrypted : " + resultString);
return resultString;
}
Yo entiendo lo que parece ser un valor cifrado. En el método de prueba crypto web que creé, tomo estos datos encriptados, intento y descifro los datos usando la clave pública del cliente y los envío de nuevo a la luz. Pero aquí es donde se lanza la excepción. Aquí está mi método responsable de esto.
public string DecryptRSA(string data, string merchantId)
{
string clearData = null;
try
{
CspParameters param = new CspParameters();
param.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(param);
string merchantRsaPublic = GetXmlRsaKey(merchantId);
rsaProvider.FromXmlString(merchantRsaPublic);
byte[] asciiString = Encoding.ASCII.GetBytes(data);
byte[] decryptedData = rsaProvider.Decrypt(asciiString, false);
clearData = Convert.ToString(decryptedData);
}
catch (CryptographicException ex)
{
Log.Error("A cryptographic error occured trying to decrypt a value for " + merchantId, ex);
}
return clearData;
}
Si alguien me podría ayudar a que sería impresionante, como ya he dicho que no he hecho mucho con C# RSA cifrado/descifrado.
¿Tiene esto que ver con el cifrado de RSA quebrado recientemente? http://www.engadget.com/2010/03/09/1024-bit-rsa-encryption-cracked-by-carefully-starving-cpu-of-ele/ –
RSA no está rajado. Solo su _implementación_, en un sistema real, está sujeta a ataques de canal lateral: la implementación puede filtrar información en la clave privada a través del consumo de energía, el tiempo y otras medidas físicas que no forman parte del modelo abstracto de una computadora. Esto se conoce desde hace bastante tiempo (los ataques de sincronización se describieron en 1997, creo). Dichas noticias no son noticias ni tampoco un verdadero "crack". –