2009-06-08 6 views
8

Hat jemand Beispiele dafür, wie serialisierte Daten in einer Datei verschlüsselt und dann mit DES zurückgelesen werden?C# - Serialisierung/Deserialisierung einer verschlüsselten DES-Datei aus einem Stream

Ich habe bereits Code geschrieben, der nicht funktioniert, aber ich würde lieber einen neuen Versuch sehen, anstatt meinen Code zu verfolgen.

EDIT: Sorry, vergessen zu erwähnen, ich brauche ein Beispiel mit XmlSerializer.Serialize/Deserialize.

+0

Übrigens benutze ich die CF, so Speicher ist eine Einschränkung. – GenericTypeTea

+0

Können Sie es ausarbeiten? Möchten Sie etwas verschlüsseln und anschließend in das XML-Format serialisieren oder möchten Sie die serialisierten Daten verschlüsseln? –

+0

Welcher ist weniger zeitaufwendig. Ich habe eine Sammlung von Kundeninformationen, die zu einer Datei verschlüsselt werden müssen. Die Art, wie ich es funktionierte, bestand darin, durch einen Kryptostream in eine Datei zu serialisieren (was funktioniert) und dann durch einen Kryptostream aus einer Datei zu deserialisieren (was nicht funktioniert). – GenericTypeTea

Antwort

15

Encryption

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

Decryption:

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

Verbrauch:

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

Sie müssen MyObject, was auch immer die Art des Objekts zu ändern, ist, dass Sie die Serialisierung, aber das ist die allgemeine Idee. Der Trick besteht darin, dieselbe SymmetricAlgorithm-Instanz zum Verschlüsseln und Entschlüsseln zu verwenden.

+0

Sieht so aus, als hätten wir ungefähr zur gleichen Zeit gepostet, ich werde akzeptieren, da es nahe genug ist, was ich eigentlich wollte! Danke Bryce. – GenericTypeTea

+0

+1 Wie dein Stil. –

+0

Aber wie würde ich Schlüssel aus einer bekannten Zeichenfolge machen? Wie "this_is_a_password_to_unlock_the_file"? Dies funktioniert in Ihrem "Usage" -Fall, aber wenn Sie den Schlüssel speichern und dann zum Entsperren der verschlüsselten Daten verwenden möchten, wie würde ich das tun? :/ – Cipi

0

Here is an example von DES Verschlüsselung/Beschreibung für eine Zeichenfolge.

+1

Entschuldigung, ich brauche ein Beispiel mit XmlSerializer. Ich werde die Hauptfrage ändern. – GenericTypeTea

2

Dieser Thread gab die Grundidee. Hier ist eine Version, die die Funktionen generisch macht und Ihnen erlaubt, einen Chiffrierschlüssel zu übergeben, so dass er reversibel ist.

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 für falsche Sortierung von Parametern in CreateEncryptor und ungültigen Initialisierungsvektor für DES und dass es den Stream nicht richtig entschlüsseln wird (wegen unflushed Kryptostrom). –