5

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); 
    } 
} 

}

Respuesta

0

Esto no tiene nada que ver con el manejo de su clave pública/privada (creo que esa parte se ve bien, el archivo de E/S se puede hacer más fácil sin embargo).

Pero su forma de transportar los datos cifrados como una cadena no es adecuada para "ida y vuelta". Use una codificación Base64 en su lugar.

Debería poder ver esto en el depurador: tome nota de la longitud y los primeros bytes de encryptedData y esto debe coincidir con d en el método Descifrar.

+0

¡Has acertado! Base64 funcionó. Gracias – user441521

+0

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

0

La respuesta a su segunda edición es no, base64 strings usa solo caracteres alfanuméricos y "+", "/" y "=".

Más información here

Cuestiones relacionadas