我通過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加密?
這是我錯過了什麼,謝謝。 你確定沒有問題,最後刪除零?是否保證流末尾的所有零都是用於填充的? – MTR 2013-03-05 06:57:40
這應該是因爲你最初加密的xml永遠不會有最終的零。 – Phil 2013-03-05 07:02:12
你是對的,我沒有意識到你正在刪除解密流中的零。 – MTR 2013-03-05 07:18:37