2014-12-23 71 views
0

当我想要反序列化对象时,它会给出一个错误,指出“错误的数据”。解密加密文件时出现“错误数据”异常

文件数据转换成功后,它给上设置或关闭流

错误 #########错误
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 
at System.Security.Cryptography.Utils._DecryptData(SafeKeyHandle hKey, Byte[] data, Int32 ib, Int32 cb, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode PaddingMode, Boolean fDone) 
at System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) 
at System.Security.Cryptography.CryptoStream.FlushFinalBlock() 
    at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) 
    at System.IO.Stream.Close() 
    at System.IO.Stream.Dispose() 
    at BinaryFileHelper.DeserializeObject[T](String filename) 
#########错误
private static DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider() 
{ 
    Key = System.Text.Encoding.UTF8.GetBytes("12345678".Substring(0, 8)), 
    IV = new byte[] { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF } 
}; 

public static void SerializeObject(string filename, object objectToSerialize) 
{ 
    using (Stream stream = File.Open(filename, FileMode.OpenOrCreate)) 
    { 
     BinaryFormatter binaryFormatter = new BinaryFormatter(); 
     using (Stream cryptoStream = new CryptoStream(stream, cryptic.CreateEncryptor(), CryptoStreamMode.Write)) 
     { 
      binaryFormatter.Serialize(cryptoStream, objectToSerialize); 
     } 
    } 
} 

public static T DeserializeObject<T>(string filename) 
{ 
    T objectFromDeserialize; 
    using (Stream stream = File.Open(filename, FileMode.Open)) 
    { 
     BinaryFormatter binaryFormatter = new BinaryFormatter(); 
     using (Stream cryptoStream = new CryptoStream(stream, cryptic.CreateDecryptor(), CryptoStreamMode.Read)) 
     { 
      objectFromDeserialize = (T)binaryFormatter.Deserialize(cryptoStream); 
     } // After conversion succeed, it gives error on disposing or closing at this line 
    } 
    return objectFromDeserialize; 
} 
+0

http://blogs.msmvps.com/jonskeet/2014/01/20/diagnosing-issues-with-reversible-data-transformations/ – Aron

回答

0

问题是使用OpenOrCreate而不是Create。原因是如果文件已经存在,OpenOrCreate将创建一个FileStream用于追加到文件末尾。 Create将在创建新文件之前删除现有文件。

public static void SerializeObject(string filename, object objectToSerialize) 
{ 
    using (Stream stream = File.Open(filename, FileMode.Create))//Changed 
    { 
     BinaryFormatter binaryFormatter = new BinaryFormatter(); 
     using (Stream cryptoStream = new CryptoStream(stream, cryptic.CreateEncryptor(), CryptoStreamMode.Write)) 
     { 
      binaryFormatter.Serialize(cryptoStream, objectToSerialize); 
     } 
    } 
} 
相关问题