XmlSerializer无法反序列化包含加密字符串的XML

时间:2014-07-10 01:42:59

标签: c# xml serialization encryption

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

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

虽然序列化很顺利,但问题是在尝试反序列化时。序列化器抛出异常说

  

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

问题是这些字符是我理解加密过程的结果所以我猜想弄乱加密字符串使它与XML兼容不是一种选择。我也尝试不同地编码上面代码中的输出字符串: UTF-8,Base64(抛出异常,表示字符串与base64不兼容)等。

我已经看了很长时间了。你推荐什么?

1 个答案:

答案 0 :(得分:0)

您是否看过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;

    }

如果你的plainText会发生什么?也许有关明文的更多信息。可能是这样的情况:Old Post