XmlSerializer无法反序列化包含加密字符串的XML
我使用.net XML序列化程序将对象序列化为XML字符串。该对象包含一个字符串类型的属性,其内容是一个加密的字符串。加密是利用Rijndael算法也由.NET提供的完成,以及呼叫看起来是这样的:XmlSerializer无法反序列化包含加密字符串的XML
var encryptedArr = EncryptStringToBytes(plainText, RijndaelKey, RijndaelIv);
return Encoding.Default.GetString(encryptedArr);
虽然系列化去罚款,问题是尝试反序列化时。串行抛出一个异常说
“有XML文档中的错误(1,1130)。‘’,十六进制值 0×02,是无效的字符。行......”
问题是,这些字符是我对加密过程的理解结果,所以我想搞乱加密的字符串以使其与XML兼容不是一种选择。我也尝试以不同的方式编码输出字符串: UTF-8,Base64(抛出一个异常说该字符串是base64不兼容)等
我一直在调查它的一些是时候了。你有什么建议?
您是否看过MSDN上RijndaelManaged类底部的示例?
只是想知道他们有一个方法,与您发布的代码具有相同的名称。如果正在或通过类似手段的arent加密,你可以尝试返回一个字符串,而不是一个字节数组,从你的方法,通过调用MemoryStream.GetString()
并返回一个值:
static string EncryptStringToBytes(string plainText, byte[] Key, byte[] IV)
{
//...
string cipherText = null;
// Create an RijndaelManaged object
// with the specified key and IV.
using (RijndaelManaged rijAlg = new RijndaelManaged())
{
rijAlg.Key = Key;
rijAlg.IV = IV;
// Create a decrytor to perform the stream transform.
ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
}
cipherText = msEncrypt.ToString();
}
}
}
// Return the encrypted bytes from the memory stream.
return cipherText;
}
会发生什么事,如果你的明文去,虽然是什么?也许需要更多关于明文的信息。可能的情况:Old Post
我可能会错过某些内容,但我无法看到与我的问题有关的联系。你可以解释吗?我使用RijndaelManaged btw。 – user181218
@ user181218这只有一个重要部分。''cipherText = msEncrypt.ToString();'如果我们将加密文本转换为具有文档编码的字符串。否则XML解析器会在应用编码之后发现许多不常见的字符(与原始文档编码匹配)。 – MarmiK
看看这个SO张贴关于序列化对象包含无效字符 http://stackoverflow.com/questions/1165966/xml-serialization-of-an-object-containing-无效字符 也许一些关于序列化和反序列化函数的代码可以帮助...所以我们可以看到你正在使用的类和技术。如果我们不知道您正在使用的课程,则无法为您设置方法或属性。 – Mikanikal