2013-04-08 6 views
1

Я использую следующий метод для шифрования данных перед их хранением в базе данных. Данные будут преобразованы в XML после извлечения и переданы на уровень доступа к данным для десериализации в известный объект бизнес-объекта.Шестнадцатеричные символы в закодированном XML-атрибуте

Проблема заключается в том, что некоторые данные имеют шестнадцатеричные символы из-за кодирования, что делает xml недействительным XML-документом, поэтому его нельзя десериализовать.

Как решить эту проблему?

public static string EncryptStringAES(string plainText, string sharedSecret) 
{ 
    if (string.IsNullOrEmpty(plainText)) 
     throw new ArgumentNullException("plainText"); 
    if (string.IsNullOrEmpty(sharedSecret)) 
     throw new ArgumentNullException("sharedSecret"); 

    string outStr = null;      // Encrypted string to return 
    RijndaelManaged aesAlg = null;    // RijndaelManaged object used to encrypt the data. 

    try 
    { 
     // generate the key from the shared secret and the salt 
     Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt); 

     // Create a RijndaelManaged object 
     aesAlg = new RijndaelManaged(); 
     aesAlg.Key = key.GetBytes(aesAlg.KeySize/8); 

     // Create a decryptor to perform the stream transform. 
     ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 

     // Create the streams used for encryption. 
     using (MemoryStream msEncrypt = new MemoryStream()) 
     { 
      // prepend the IV 
      msEncrypt.Write(BitConverter.GetBytes(aesAlg.IV.Length), 0, sizeof(int)); 
      msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length); 
      using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
      { 
       using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
       { 
        //Write all data to the stream. 
        swEncrypt.Write(plainText); 
       } 
      } 
      outStr = Convert.ToBase64String(msEncrypt.ToArray()); 
     } 
    } 
    finally 
    { 
     // Clear the RijndaelManaged object. 
     if (aesAlg != null) 
      aesAlg.Clear(); 
    } 

    // Return the encrypted bytes from the memory stream. 
    return outStr; 
} 
+0

Я отметил ваш вопрос как C#, так как я считаю, что этот язык используется. Пожалуйста, исправьте, если неправильно. –

ответ

-1

Обычно я использую HttpUtility.HtmlEncode для исключения значений для XML.

+0

Вы имеете в виду, что я не могу вылечить этот метод? – Afflatus

+0

Вы можете использовать этот метод для исключения значений из строки XML, а на стороне клиента используйте HttpUtility.HtmlDecode для декодирования значения обратно. Также вы можете использовать тег [CDATA] (http://en.wikipedia.org/wiki/CDATA), когда вы поместите это значение в xml, а на стороне клиента вам нужно будет обрабатывать CDATA. – outcoldman

+0

ну, к сожалению, HttpUtility не решила мою проблему. Я все еще сталкиваюсь с такой же ошибкой. – Afflatus

Смежные вопросы