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不兼容)等

我一直在调查它的一些是时候了。你有什么建议?

+0

看看这个SO张贴关于序列化对象包含无效字符 http://stackoverflow.com/questions/1165966/xml-serialization-of-an-object-containing-无效字符 也许一些关于序列化和反序列化函数的代码可以帮助...所以我们可以看到你正在使用的类和技术。如果我们不知道您正在使用的课程,则无法为您设置方法或属性。 – Mikanikal

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

+0

我可能会错过某些内容,但我无法看到与我的问题有关的联系。你可以解释吗?我使用RijndaelManaged btw。 – user181218

+0

@ user181218这只有一个重要部分。''cipherText = msEncrypt.ToString();'如果我们将加密文本转换为具有文档编码的字符串。否则XML解析器会在应用编码之后发现许多不常见的字符(与原始文档编码匹配)。 – MarmiK