2009-06-08 50 views
8

Qualcuno ha qualche esempio su come crittografare i dati serializzati su un file e quindi leggerlo di nuovo usando DES?C# - Serializzazione/deserializzazione di un file crittografato DES da un flusso

Ho già scritto del codice che non funziona, ma preferirei vedere un nuovo tentativo invece di perseguire il mio codice.

EDIT: Mi dispiace, ho dimenticato di menzionare Ho bisogno di un esempio utilizzando XmlSerializer.Serialize/Deserialize.

+0

A proposito, sto usando il CF, quindi la memoria è un vincolo. – GenericTypeTea

+0

Puoi elaborare? Vuoi criptare qualcosa e poi serializzarlo nel formato XML, o vuoi criptare i dati serializzati? –

+0

Qualunque sia il tempo che richiede meno tempo. Ho una raccolta di informazioni sui clienti che devono essere crittografate su un file. Il modo in cui l'ho visto funzionare era serializzare attraverso un cryptostream in un file (che funziona) e quindi deserializzare attraverso un cryptostream da un file (che non funziona). – GenericTypeTea

risposta

15

crittografia

public static void EncryptAndSerialize(string filename, MyObject obj, SymmetricAlgorithm key) 
{ 
    using(FileStream fs = File.Open(filename, FileMode.Create)) 
    { 
     using(CryptoStream cs = new CryptoStream(fs, key.CreateEncryptor(), CryptoStreamMode.Write)) 
     { 
      XmlSerializer xmlser = new XmlSerializer(typeof(MyObject)); 
      xmlser.Serialize(cs, obj); 
     } 
    } 
} 

decrittografia:

public static MyObject DecryptAndDeserialize(string filename, SymmetricAlgorithm key)  
{ 
    using(FileStream fs = File.Open(filename, FileMode.Open)) 
    { 
     using(CryptoStream cs = new CryptoStream(fs, key.CreateDecryptor(), CryptoStreamMode.Read)) 
     { 
      XmlSerializer xmlser = new XmlSerializer(typeof(MyObject)); 
      return (MyObject) xmlser.Deserialize(cs); 
     } 
    } 
} 

Usage:

DESCryptoServiceProvider key = new DESCryptoServiceProvider(); 
MyObject obj = new MyObject(); 
EncryptAndSerialize("testfile.xml", obj, key); 
MyObject deobj = DecryptAndDeserialize("testfile.xml", key); 

È necessario modificare MyObject a prescindere dal tipo del vostro oggetto è che si sta serializzazione, ma questo è l'idea generale. Il trucco è utilizzare la stessa istanza SymmetricAlgorithm per crittografare e decodificare.

+0

Sembra che abbiamo pubblicato circa lo stesso tempo, accetterò perché è abbastanza vicino quello che volevo davvero! Grazie Bryce. – GenericTypeTea

+0

+1 Come il tuo stile. –

+0

Ma come potrei rendere la chiave da una stringa nota? Come "this_is_a_password_to_unlock_the_file"? Funziona nel caso "Utilizzo", ma se si desidera salvare la chiave e quindi utilizzarla per sbloccare i dati crittografati, come dovrei farlo? :/ – Cipi

0

Here is an example di crittografia DES/decrizione per una stringa.

+1

Siamo spiacenti, ho bisogno di un esempio usando XmlSerializer. Modificheremo la domanda principale. – GenericTypeTea

2

Questo thread ha dato l'idea di base. Ecco una versione che rende generiche le funzioni e consente anche di passare una chiave di crittografia in modo che sia reversibile.

public static void EncryptAndSerialize<T>(string filename, T obj, string encryptionKey) { 
    var key = new DESCryptoServiceProvider(); 
    var e = key.CreateEncryptor(Encoding.ASCII.GetBytes("64bitPas"), Encoding.ASCII.GetBytes(encryptionKey)); 
    using (var fs = File.Open(filename, FileMode.Create)) 
    using (var cs = new CryptoStream(fs, e, CryptoStreamMode.Write)) 
     (new XmlSerializer(typeof (T))).Serialize(cs, obj); 
} 

public static T DecryptAndDeserialize<T>(string filename, string encryptionKey) { 
    var key = new DESCryptoServiceProvider(); 
    var d = key.CreateDecryptor(Encoding.ASCII.GetBytes("64bitPas"), Encoding.ASCII.GetBytes(encryptionKey)); 
    using (var fs = File.Open(filename, FileMode.Open)) 
    using (var cs = new CryptoStream(fs, d, CryptoStreamMode.Read)) 
     return (T) (new XmlSerializer(typeof (T))).Deserialize(cs); 
} 
+0

-1 per l'ordine errato di parametri in CreateEncryptor e vettore di inizializzazione non valido per DES e che non decrittografa il flusso correttamente (a causa di un flushing CryptoStream). –