10 Stimmen

C# - Serialisierung/Deserialisierung einer DES-verschlüsselten Datei aus einem Stream

Hat jemand ein Beispiel dafür, wie man serialisierte Daten in einer Datei verschlüsselt und dann mit DES zurückliest?

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

EDITAR : Sorry, ich vergaß zu erwähnen, dass ich ein Beispiel mit XmlSerializer.Serialize/Deserialize brauche.

19voto

Bryce Kahle Punkte 8009

Verschlüsselung

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

Entschlüsselung:

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

Verwendung:

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

Sie müssen MyObject in den Typ des Objekts ändern, das Sie serialisieren, aber das ist die allgemeine Idee. Der Trick besteht darin, zum Verschlüsseln und Entschlüsseln dieselbe SymmetricAlgorithm-Instanz zu verwenden.

3voto

Wade Hatler Punkte 1715

Dieser Thread lieferte die Grundidee. Hier ist eine Version, die die Funktionen generisch macht, und erlaubt Ihnen auch, einen Verschlüsselungsschlüssel zu übergeben, so dass es 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);
}

0voto

Max Galkin Punkte 16522

Hier ein Beispiel der DES-Verschlüsselung/Beschreibung für eine Zeichenkette.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X