C # - Сериализация / десериализация зашифрованного файла DES из потока
-
12-09-2019 - |
Вопрос
Есть ли у кого-нибудь примеры того, как зашифровать сериализованные данные в файл, а затем прочитать их обратно с помощью DES?
Я уже написал некоторый код, который не работает, но я предпочел бы увидеть новую попытку вместо того, чтобы продолжать мой код.
Редактировать:Извините, забыл упомянуть, что мне нужен пример использования XmlSerializer.Сериализовать / десериализовать.
Решение
Шифрование
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 для шифрования и дешифрования.
Другие советы
Эта тема дала основную идею.Вот версия, которая делает функции универсальными, а также позволяет передавать ключ шифрования, чтобы он был обратимым.
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);
}
Вот один из примеров of DES шифрование / расшифровка для строки.