2012-12-23 22 views
0

我將如何處理讀取和寫入加密的XML文件?我需要一種方法來保存用戶最後輸入的表單值,但我不希望它們以純文本或XML的形式可讀。我將如何讀寫加密的XML文件?

+3

與加密任何其他字節流相同。 –

+0

請勿爲此使用xml。 – AntoineLev

+0

我會用什麼來做到這一點? – Jack

回答

6

的例子還有就是可在您一次性在System.Security.Cryptography.Xml Namespace確保XML數據類的全面收集。

花一些時間來閱讀下面的文章MSDN文章:

如果您訪問在導航菜單中的根節點上的任何鏈接的文章可以查看更多關於XML安全性的文章。

+0

謝謝,這非常有用! – Jack

0

我想,你可以保存用戶保存的字符串,然後用加密的字符串只寫一個常規的XML文件?

下面是here

public class Crypto 
{ 
    private static byte[] _salt = Encoding.ASCII.GetBytes("o6806642kbM7c5"); 

    /// <summary> 
    /// Encrypt the given string using AES. The string can be decrypted using 
    /// DecryptStringAES(). The sharedSecret parameters must match. 
    /// </summary> 
    /// <param name="plainText">The text to encrypt.</param> 
    /// <param name="sharedSecret">A password used to generate a key for encryption.</param> 
    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 decrytor 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; 
    } 

    /// <summary> 
    /// Decrypt the given string. Assumes the string was encrypted using 
    /// EncryptStringAES(), using an identical sharedSecret. 
    /// </summary> 
    /// <param name="cipherText">The text to decrypt.</param> 
    /// <param name="sharedSecret">A password used to generate a key for decryption.</param> 
    public static string DecryptStringAES(string cipherText, string sharedSecret) 
    { 
     if (string.IsNullOrEmpty(cipherText)) 
      throw new ArgumentNullException("cipherText"); 
     if (string.IsNullOrEmpty(sharedSecret)) 
      throw new ArgumentNullException("sharedSecret"); 

     // Declare the RijndaelManaged object 
     // used to decrypt the data. 
     RijndaelManaged aesAlg = null; 

     // Declare the string used to hold 
     // the decrypted text. 
     string plaintext = null; 

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

      // Create the streams used for decryption.     
      byte[] bytes = Convert.FromBase64String(cipherText); 
      using (MemoryStream msDecrypt = new MemoryStream(bytes)) 
      { 
       // Create a RijndaelManaged object 
       // with the specified key and IV. 
       aesAlg = new RijndaelManaged(); 
       aesAlg.Key = key.GetBytes(aesAlg.KeySize/8); 
       // Get the initialization vector from the encrypted stream 
       aesAlg.IV = ReadByteArray(msDecrypt); 
       // Create a decrytor to perform the stream transform. 
       ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); 
       using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
       { 
        using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 

         // Read the decrypted bytes from the decrypting stream 
         // and place them in a string. 
         plaintext = srDecrypt.ReadToEnd(); 
       } 
      } 
     } 
     finally 
     { 
      // Clear the RijndaelManaged object. 
      if (aesAlg != null) 
       aesAlg.Clear(); 
     } 

     return plaintext; 
    } 

    private static byte[] ReadByteArray(Stream s) 
    { 
     byte[] rawLength = new byte[sizeof(int)]; 
     if (s.Read(rawLength, 0, rawLength.Length) != rawLength.Length) 
     { 
      throw new SystemException("Stream did not contain properly formatted byte array"); 
     } 

     byte[] buffer = new byte[BitConverter.ToInt32(rawLength, 0)]; 
     if (s.Read(buffer, 0, buffer.Length) != buffer.Length) 
     { 
      throw new SystemException("Did not read byte array properly"); 
     } 

     return buffer; 
    } 
}