2011-11-03 7 views
14

uso questo codice per crittografare una stringa (sostanzialmente, questo è l'esempio dato sulla Rijndael class on MSDN):codifica da utilizzare per convertire byte array String e 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); 
} 

uso Encoding.Default convertire un array di byte in una stringa ma non sono sicuro che sia una buona soluzione. Il mio obiettivo è archiviare il testo crittografato (come le password ...) nei file. Devo continuare con Encoding.Default o utilizzare Encoding.UTF8Encoding o qualcos'altro?

Può avere conseguenze negative sui valori memorizzati quando provo a crittografarli e decrittografarli se i file vengono spostati su sistemi operativi diversi?

risposta

43

È necessario non utilizzare un Encoding per convertire i dati binari arbitrari in testo. Encoding è per quando hai dati binari che sono veramente testo codificato - questo non lo è.

Utilizzare invece Convert.ToBase64String per codificare i dati binari come testo, quindi decodificare utilizzando Convert.FromBase64String.

+0

Grazie Jon. Mi salva da bug gravi. – Otiel

+9

Vedi anche [Post di Phil Haack che espande su questo] (http://feeds.haacked.com/~r/haacked/~3/5hyXGYRO0Bo/hazards-of-converting-binary-data-to-a-string.aspx) –

+0

Vedere anche http://stackoverflow.com/questions/646974/is-there-a-standard-technique-for-packing-binary-data-into-a-utf-16-string –

0

Sì, Encoding.Default è la tabella codici ANSI corrente della macchina e potrebbe essere diversa tra più macchine/locali. Se i dati erano dati testuali e per renderli portabili, è necessario utilizzare un formato di codifica fisso, ad esempio UTF8.

Tuttavia, poiché i dati NON sono dati testuali, non è possibile provare a utilizzare una codifica testuale per convertire in una stringa. L'opzione migliore è usare una codifica esadecimale o Base64 o tenerla come una matrice blob/byte.

+0

Questo è chiaramente * non * i dati testuali - è il risultato di eseguire la crittografia, quindi è dati binari arbitrari. Qualsiasi 'Encoding' è inappropriato qui. –

+0

Sì, ho chiarito un po 'una volta sapevo che i dati non erano affatto di testo. – Deanna

-1

im non sicuro al 100% qui, ma penso che Encoding.Default si riferisce alla codifica di default del sistema e sì che può cambiare da sistema a sistema ..

Se i dove si userei UTF8 o qualche altra codifica che non cambia da sistema a sistema ..

per maggiori informazioni su ASCII esteso guarda qui

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

+1

No, usare UTF-8 non * è * una buona soluzione: questo dato binario è * non * testo codificato in UTF-8; è dati binari arbitrari. –

Problemi correlati