2013-03-04 38 views
2

我通過DataContractSerializer序列化對象沒有任何問題。是否可以通過DataContractSerializer反序列化加密文件?

但是,如果我現在嘗試序列化這個對象到一個加密的文件,我反序列化時得到一個異常。

這裏是我的代碼:

 public static bool SerializeDataContract<t>(Stream fileStream, t o, bool bCrypt = false) 
    { 
     DataContractSerializer serializer = new DataContractSerializer(typeof(t)); 
     if(bCrypt) 
     { 
      TripleDESCryptoServiceProvider crypt = new TripleDESCryptoServiceProvider(); 
      crypt.IV = CRYPT_INIT_VECTOR; 
      crypt.Key = CRYPT_KEY; 
      crypt.Padding = PaddingMode.Zeros; 

      using(CryptoStream cryptoStream = new CryptoStream(fileStream, crypt.CreateEncryptor(), CryptoStreamMode.Write)) 
      { 
       serializer.WriteObject(cryptoStream, o); 
       cryptoStream.Close(); 
      } 
     } 
     else 
      serializer.WriteObject(fileStream, o); 
     return true; 
    } 
    public static bool DeserializeDataContract<t>(Stream fileStream, out t o, bool bCrypt = false) 
    { 
     o = default(t); 

     try 
     { 
      DataContractSerializer serializer = new DataContractSerializer(typeof(t)); 
      if(bCrypt) 
      { 
       TripleDESCryptoServiceProvider crypt = new TripleDESCryptoServiceProvider(); 
       crypt.IV = CRYPT_INIT_VECTOR; 
       crypt.Key = CRYPT_KEY; 
       crypt.Padding = PaddingMode.Zeros; 

       using(CryptoStream cryptoStream = new CryptoStream(fileStream, crypt.CreateDecryptor(), CryptoStreamMode.Read)) 
       { 
        //TraceXML(cryptoStream); 

        o = (t)serializer.ReadObject(cryptoStream); 
        cryptoStream.Close(); 
       } 
      } 
      else 
      { 
       o = (t)serializer.ReadObject(fileStream); 
      } 
     } 
     catch(Exception ex) 
     { 
      return false; 
     } 

     return true; 
    } 

如果我打電話與bCrypt =假,一切都按預期這兩種功能。但是,如果我用bCrypt = true調用函數,反序列化時會出現異常。

異常是(從德語轉換爲英語):SerializationException:根級別的數據無效。

如果我跟蹤解密後讀取的數據,數據對我來說似乎沒問題,那看起來就像沒有加密的序列化。

你知道嗎,錯誤在我的代碼中?

或者只是不可能使用DataContractSerializer加密?

回答

1

問題是加密數據填充了零,因此原始數據的長度不明顯。

這裏的刪除他們,使反序列化運作的一種方式:

using(var cryptoStream = 
     new CryptoStream(fileStream, crypt.CreateDecryptor(), CryptoStreamMode.Read)) 
{    
    using(var reader = new StreamReader(cryptoStream)) 
    { 
     var s = reader.ReadToEnd().TrimEnd(new char[]{'\0'}); 

     using(var stream = new MemoryStream(Encoding.ASCII.GetBytes(s))) 
     { 
      o = (t)serializer.ReadObject(stream); 
     } 
    } 
} 
+0

這是我錯過了什麼,謝謝。 你確定沒有問題,最後刪除零?是否保證流末尾的所有零都是用於填充的? – MTR 2013-03-05 06:57:40

+0

這應該是因爲你最初加密的xml永遠不會有最終的零。 – Phil 2013-03-05 07:02:12

+0

你是對的,我沒有意識到你正在刪除解密流中的零。 – MTR 2013-03-05 07:18:37

0

如果您保存到流之後被decripted我想你可以伊斯利明白問題的所在

只是它在加密前比較序列化文件的文件。

如果它們相同,那麼在解密程序完成其工作之前,您已經過早地進行了deserializyng。

我不認爲你需要調用cryptoStream.Close();調用flush(),而不是

我會用一個MemoryStream作爲緩衝區,而不是直接傳遞到CryptoStream的和DataContractSerializer的反之亦然的。

相關問題