简体   繁体   中英

“Bad Data” exception when decrypting encrypted file

When I want to DeserializeObject, it gives an error which says "Bad Data".

After file data conversion succeed, it gives error on disposing or closing stream

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

The problem is the usage of OpenOrCreate instead of Create . The reason being is that OpenOrCreate will create a FileStream for appending to the end of a file, if the file already exists. Whereas Create will delete the existing file before creating a new file.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM