C # - Сериализация / десериализация зашифрованного файла DES из потока - PullRequest
9 голосов
/ 08 июня 2009

Есть ли у кого-нибудь примеры того, как зашифровать сериализованные данные в файл и затем прочитать его обратно с помощью DES?

Я уже написал некоторый код, который не работает, но я предпочел бы увидеть новую попытку, вместо того, чтобы преследовать мой код.

РЕДАКТИРОВАТЬ : Извините, забыл упомянуть, мне нужен пример использования XmlSerializer.Serialize / Deserialize.

Ответы [ 3 ]

18 голосов
/ 08 июня 2009

Шифрование

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

дешифрование:

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

Использование:

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

Вам нужно изменить MyObject на тот тип вашего объекта, который вы сериализуете, но это общая идея. Хитрость заключается в том, чтобы использовать один и тот же экземпляр SymmetricAlgorithm для шифрования и дешифрования.

2 голосов
/ 16 мая 2012

Эта тема дала основную идею. Вот версия, которая делает функции общими, а также позволяет передавать ключ шифрования, чтобы он был обратимым.

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 голосов
/ 08 июня 2009

Вот пример шифрования / дешифрования DES для строки.

...