2009-06-08 69 views
8

有沒有人有任何關於如何將序列化數據加密到文件然後使用DES讀回的例子?C# - 從流中對DES加密文件進行序列化/反序列化

我已經寫了一些代碼已經不工作,但我寧願看到一個新的嘗試,而不是追求我的代碼。

編輯:對不起,忘了提及我需要一個使用XmlSerializer.Serialize/Deserialize的例子。

+0

順便說一句,我使用CF,所以內存是一個約束。 – GenericTypeTea 2009-06-08 13:58:07

+0

你能詳細說明嗎?你想加密一些東西,然後將其序列化爲XML格式,或者你想要加密序列化的數據嗎? – 2009-06-08 14:16:02

+0

以較少的時間消耗爲準。我收集了需要加密到一個文件的客戶信息。我看到它的工作方式是通過一個cryptostream序列化到一個文件(它工作),然後通過一個文件中的cryptostream反序列化(這是行不通的)。 – GenericTypeTea 2009-06-08 14:21:55

回答

15

加密

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實例來加密和解密。

0

Here is an example DES加密/解密爲一個字符串。

+1

對不起,我需要一個使用XmlSerializer的例子。我會修改主要問題。 – GenericTypeTea 2009-06-08 14:10:27

2

此主題給出了基本思路。這是一個使這些功能通用的版本,並且還允許您傳遞加密密鑰,因此它是可逆的。

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