EDIT2: Parece que Convert.FromBase64String es mi salvador. ¿Alguien sabe si una coma estaría en tal cadena? Estoy haciendo un análisis básico de csv. Si es así, siempre puedo usar comillas (pero las citas siempre pueden estar en una cadena como esta, supongo), pero este es solo un pequeño proyecto para mí, así que es más fácil de analizar dividiendo por ','.C# RSACryptoServiceProvider ToXmlString()/FromXmlString()
EDIT: OK, así que parece que mi problema es cuando convierto los bytes cifrados en una cadena, y luego los vuelvo a convertir en bytes para descifrarlos. ¿Cómo podría hacer esto porque quiero almacenar la cadena cifrada en algún lugar y ser capaz de descifrar esa cadena?
Estoy tratando de guardar la clave pública (y privada solo para la prueba) en un archivo xml para que pueda leer la misma más tarde, pero obteniendo el error "Datos incorrectos" al intentar descifrar. ¿Alguien puede ver lo que estoy haciendo mal?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace EncryptionTest
{
class Program
{
static void Main(string[] args)
{
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] dataToEncrypt = ByteConverter.GetBytes("Test data");
WriteRSAInfoToFile();
string enc = Encrypt(dataToEncrypt);
enc = Decrypt(enc);
}
static void WriteRSAInfoToFile()
{
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
TextWriter writer = new StreamWriter("C:\\publicKey.xml");
string publicKey = RSA.ToXmlString(false);
writer.Write(publicKey);
writer.Close();
writer = new StreamWriter("C:\\privateKey.xml");
string privateKey = RSA.ToXmlString(true);
writer.Write(privateKey);
writer.Close();
}
static string Encrypt(byte[] data)
{
UnicodeEncoding ByteConverter = new UnicodeEncoding();
RSACryptoServiceProvider encrypt = new RSACryptoServiceProvider();
TextReader reader = new StreamReader("C:\\publicKey.xml");
string publicKey = reader.ReadToEnd();
reader.Close();
encrypt.FromXmlString(publicKey);
byte[] encryptedData = encrypt.Encrypt(data, false);
return ByteConverter.GetString(encryptedData);
}
static string Decrypt(string data)
{
UnicodeEncoding ByteConverter = new UnicodeEncoding();
RSACryptoServiceProvider decrypt = new RSACryptoServiceProvider();
TextReader reader = new StreamReader("C:\\privateKey.xml");
string privateKey = reader.ReadToEnd();
reader.Close();
decrypt.FromXmlString(privateKey);
byte[] d = ByteConverter.GetBytes(data);
byte[] decryptedData = decrypt.Decrypt(d, false); // ERROR: bad data
return ByteConverter.GetString(decryptedData);
}
}
}
¡Has acertado! Base64 funcionó. Gracias – user441521
No redondear el texto cifrado a través de una codificación de cadena - http://blogs.msdn.com/b/shawnfa/archive/2005/11/10/491431.aspx algo que vale la pena mencionar aquí. – gmaran23