c# - 是否可以通过 DataContractSerializer 反序列化加密文件?

标签 c# serialization encryption 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=false 调用这两个函数,一切都会按预期进行。但是,如果我使用 bCrypt=true 调用函数,反序列化时会出现异常。

异常是(从德语翻译成英语):SerializationException:根级别的数据无效。

如果我跟踪解密后读取的数据,数据对我来说似乎没问题,也就是说它看起来就像没有加密的序列化。

您知道我的代码中的 bug 在哪里吗?

或者只是无法使用 DataContractSerializer 进行加密?

最佳答案

问题是加密数据用零填充,因此原始数据的长度不明显。

这是一种删除它们以便反序列化工作的方法:

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

关于c# - 是否可以通过 DataContractSerializer 反序列化加密文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15204739/

相关文章:

c# - Microsoft.VisualStudio.TestTools.UnitTesting 给出错误

c# - XAML 鼠标光标转换器不工作

c# - 属性描述符如何使用同一代码行获取两个控件的值?

java解密得到RSA中的明文

android - 如何在不允许用户下载和使用音乐的情况下将音乐存储在 Android 手机上?

java - 如何导出 .pem 文件中加密的私钥

c# - 如何以当前区域性格式的默认值从 Noda Time OffsetDateTime 生成 DateTimeOffset 字符串?

python - 如何递归地jsonize python对象

c# - 从 XML 文件反序列化 int 数组

C# - 反序列化列表<String>