C# 使用BinaryFormatter反序列化加密数据时出现问题

C# 使用BinaryFormatter反序列化加密数据时出现问题,c#,serialization,deserialization,binaryformatter,cryptostream,C#,Serialization,Deserialization,Binaryformatter,Cryptostream,这是我的密码: public static void Save<T>(T toSerialize, string fileSpec) { BinaryFormatter formatter = new BinaryFormatter(); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); using (FileStream stream = File.

这是我的密码:

    public static void Save<T>(T toSerialize, string fileSpec) {
        BinaryFormatter formatter = new BinaryFormatter();
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();

        using (FileStream stream = File.Create(fileSpec)) {
            using (CryptoStream cryptoStream = new CryptoStream(stream, des.CreateEncryptor(key, iv), CryptoStreamMode.Write)) {
                formatter.Serialize(cryptoStream, toSerialize);
                cryptoStream.FlushFinalBlock();
            }
        }
    }

    public static T Load<T>(string fileSpec) {
        BinaryFormatter formatter = new BinaryFormatter();
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();

        using (FileStream stream = File.OpenRead(fileSpec)) {
            using (CryptoStream cryptoStream = new CryptoStream(stream, des.CreateEncryptor(key, iv), CryptoStreamMode.Read)) {
                return (T)formatter.Deserialize(cryptoStream);
            }
        }
    }
publicstaticvoidsave(T-toSerialize,stringfilespec){
BinaryFormatter formatter=新的BinaryFormatter();
DESCryptoServiceProvider des=新的DESCryptoServiceProvider();
使用(FileStream-stream=File.Create(fileSpec)){
使用(CryptoStream CryptoStream=new CryptoStream(stream,des.CreateEncryptor(key,iv),CryptoStreamMode.Write)){
序列化(加密流,toSerialize);
cryptoStream.FlushFinalBlock();
}
}
}
公共静态T加载(字符串文件规范){
BinaryFormatter formatter=新的BinaryFormatter();
DESCryptoServiceProvider des=新的DESCryptoServiceProvider();
使用(FileStream-stream=File.OpenRead(fileSpec)){
使用(CryptoStream CryptoStream=new CryptoStream(stream,des.CreateEncryptor(key,iv),CryptoStreamMode.Read)){
返回(T)格式化程序。反序列化(加密流);
}
}
}
Key和iv都是静态字节数组,长度为8,我正在使用它们进行测试。错误如下:

二进制流“178”不包含有效的BinaryHeader。可能的原因是序列化和反序列化之间的无效流或对象版本更改


非常感谢您的帮助

一个小错误:您的
Load
方法应该使用
des.CreateDecryptor
,如下所示:

publicstatict加载(stringfilespec)
{
BinaryFormatter formatter=新的BinaryFormatter();
DESCryptoServiceProvider des=新的DESCryptoServiceProvider();
使用(FileStream-stream=File.OpenRead(fileSpec))
{
使用(加密流加密流=
新的加密流(流,des.CreateDecryptor(密钥,iv),
CryptoStreamMode.Read)
{
返回(T)格式化程序。反序列化(加密流);
}
}
}

在调用“保存”和“加载”之间,您是否更新了windows或修改了项目中的任何其他DLL?@ScottChamberlain是的,有没有其他方法来完成我正在做的事情而不考虑这一点?我将定期更新我的应用程序。
Load
不应该使用
CreateDecryptor
,而不是
CreateEncryptor
binaryFormatter
不允许版本更改,你就完蛋了。您不应该持久化由BinaryFormatter序列化的数据,您需要使用XMLSeralizer或类似ProtoBuf的第三方二进制格式。BinaryFormatter仅用于IPC通信。“您需要使用XMLSeralizer或ProtoBuf之类的第三方二进制格式。BinaryFormatter仅用于IPC通信。”我不敢相信我做了那个xD