2011-11-03 22 views
14

utilizo este código para cifrar una cadena (básicamente, este es el ejemplo dado en la Rijndael class on MSDN):codificación a usar para convertir Bytes arreglo a cadena y viceversa

public static String AESEncrypt(String str2Encrypt, Byte[] encryptionKey, Byte[] IV) 
{ 
    Byte[] encryptedText; 

    using (RijndaelManaged rijAlg = new RijndaelManaged()) 
    { 
     // Use the provided key and IV 
     rijAlg.Key = encryptionKey; 
     rijAlg.IV = IV; 

     // Create a decrytor to perform the stream transform 
     ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV); 

     // Create the streams used for encryption 
     using (MemoryStream msEncrypt = new MemoryStream()) 
     using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
     { 
      using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
      { 
       // Write all data to the stream 
       swEncrypt.Write(str2Encrypt); 
      } 

      encryptedText = msEncrypt.ToArray(); 
     } 
    } 

    return Encoding.Default.GetString(encryptedText); 
} 

utilizo Encoding.Default para convertir una matriz de bytes a una cadena, pero no estoy seguro de que sea una buena solución. Mi objetivo es almacenar texto encriptado (como contraseñas ...) en archivos. ¿Debo continuar con Encoding.Default o usar Encoding.UTF8Encoding o alguna otra cosa?

¿Puede tener consecuencias negativas en los valores almacenados cuando intento encriptarlos y descifrarlos si los archivos se mueven a diferentes sistemas operativos?

Respuesta

43

Debe absolutamente no utilizar un Encoding para convertir datos binarios arbitrarios en texto. Encoding es para cuando tienes datos binarios que genuinamente son texto codificado; esto no es así.

En su lugar, use Convert.ToBase64String para codificar los datos binarios como texto, luego decodifique usando Convert.FromBase64String.

+0

Gracias Jon. Me salva de errores serios. – Otiel

+9

Véase también [Publicación de Phil Haack sobre este tema] (http://feeds.haacked.com/~r/haacked/~3/5hyXGYRO0Bo/hazards-of-converting-binary-data-to-a-string.aspx) –

+0

También vea http://stackoverflow.com/questions/646974/is-there-a-standard-technique-for-packing-binary-data-into-a-utf-16-string –

0

Sí, Encoding.Default es la página de códigos ANSI actual de su máquina y puede ser diferente entre varias máquinas/configuraciones regionales. Si los datos eran datos textuales y para hacerlo portátil, necesitaría usar un formato de codificación fijo, por ejemplo, UTF8.

Sin embargo, como sus datos NO son datos de texto, no puede tratar de usar ninguna codificación textual para convertirla en una cadena. La mejor opción es usar una codificación hexadecimal o Base64 o mantenerla como una matriz blob/byte.

+0

Esto es claramente * no * datos textuales: es el resultado de la realización del cifrado, por lo que se trata de datos binarios arbitrarios. Cualquier 'Codificación' es inapropiado aquí. –

+0

Sí, aclarado un poco una vez que sabía que los datos no eran texto en absoluto. – Deanna

-1

no estoy 100% seguro de que aquí, pero yo creo que Encoding.Default se refiere a la codificación por defecto del sistema y sí que puede cambiar de un sistema a otro ..

Si i donde i usaría UTF8 o alguna otra codificación eso no cambia de sistema a sistema ..

para obtener más información sobre ASCII extendido mira aquí

http://en.wikipedia.org/wiki/Extended_ASCII

+1

No, usar UTF-8 es * no * una buena solución; estos datos binarios son * no * texto codificado en UTF-8; son datos binarios arbitrarios. –

Cuestiones relacionadas