gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:46:23 26 4
gpt4 key购买 nike

我正在通过 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com