【问题标题】:XmlSerializer fails to deserialize XML containing encrypted stringXmlSerializer 无法反序列化包含加密字符串的 XML
【发布时间】:2014-08-31 05:18:28
【问题描述】:

我正在使用 .net XML 序列化程序将对象序列化为 XML 字符串。该对象包含一个字符串类型的属性,其内容是一个加密 字符串。加密是使用 .net 提供的 Rijndael 算法完成的,调用如下:

var encryptedArr = EncryptStringToBytes(plainText, RijndaelKey, RijndaelIv);
return Encoding.Default.GetString(encryptedArr);

虽然序列化没问题,但问题在于尝试反序列化时。序列化程序抛出一个异常说

"XML 文档中存在错误 (1,1130)。' ',十六进制值 0x02,是一个无效字符。线...”

问题是这些字符是我理解的加密过程的结果,所以我猜想弄乱加密字符串以使其与 XML 兼容不是一种选择。我还尝试对上述代码中的输出字符串进行不同的编码: UTF-8、Base64(抛出异常,说明字符串与 base64 不兼容)等。

我已经研究了很长时间了。你有什么推荐的?

【问题讨论】:

  • 看看这篇关于序列化包含无效字符的对象的 SO 帖子stackoverflow.com/questions/1165966/… 也许一些关于您的序列化和反序列化函数的代码会有所帮助......所以我们可以看到您正在使用的类和技术.如果我们不知道您正在使用的类,那么给您设置方法或属性是没有意义的。

标签: c# xml serialization encryption


【解决方案1】:

你看过MSDN上RijndaelManaged类底部的例子吗?

只是想知道他们有一个方法,与您发布的代码同名。如果您正在或未通过类似方式进行加密,您可以尝试从您的方法中返回字符串而不是字节数组,方法是调用 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 顺便说一句。
  • @user181218 这只有一个重要部分。cipherText = msEncrypt.ToString(); 如果我们将加密文本转换为具有文档编码的字符串。否则 XML 解析器会在应用编码后发现许多不常见的字符(与原始文档编码匹配)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多