1

我有一個WPF應用程序包含這個類:*反序列化的C#

{[Serializable] 
public class Parametres 
{ 
    private string admin_login; 
    private string admin_pwd; 
    private string server; 
    private string db; 
    private string user; 
    private string pwd;} 

我序列具有這種功能的對象:

public static void Serialize_Parametres(string filename, Parametres obj) 
    { 
     using (FileStream fs = File.Open(filename, FileMode.OpenOrCreate)) 
     { 
      using (CryptoStream cs = new CryptoStream(fs, key.CreateEncryptor(), CryptoStreamMode.Write)) 
      { 
       XmlSerializer xmlser = new XmlSerializer(typeof(Parametres)); 
       xmlser.Serialize(cs, obj); 
      } 
     } 
    } 

它的正常工作,並生成一個文件txt文件,但是當我試圖反序列化這個文件,並得到這個函數的對象參數:

public static Parametres DeSerialize_Parametres(string filename) 
     { 
      using (FileStream fs = File.Open(filename, FileMode.Open)) 
      { 

       using (CryptoStream cs = new CryptoStream(fs, key.CreateDecryptor(), CryptoStreamMode.Read)) 

       { 

        XmlSerializer xmlser = new XmlSerializer(typeof(Parametres)); 
        return (Parametres)xmlser.Deserialize(cs); 

       } 
      } 


     } 

我得到了這個錯誤Length of the data to decrypt is invalid在線return (Parametres)xmlser.Deserialize(cs);

究竟是這個錯誤的原因是什麼?我該如何解決它?

+0

http://stackoverflow.com/questions/942139/length-of-the-data-to-decrypt-is-invalid –

回答

2

當使用這個技術來序列化一個對象時,你必須分兩部分來完成。長度加密流必須作爲最終流的一部分進行存儲,並由您來完成。但是,你應該把它分解成更可持續的形式。

例如,首先將你想要的圖形串入字節流;然後 加密字節流;然後 將其保存到文件。

下面是關於如何序列化到一個文件中使用AES的例子:

public class ObjectXmlSerializer 
    { 
     //--------------------------------------------------------------------- 
     public override Byte[] Serialize(Object obj) 
     { 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       new XmlSerializer(obj.GetType()).Serialize(ms, obj); 
       return ms.ToArray(); 
      } 
     } 
     //--------------------------------------------------------------------- 
     public override T Deserialize<T>(Byte[] bObj) 
     { 
      using (MemoryStream ms = new MemoryStream(bObj)) 
      { 
       return (T)new XmlSerializer(typeof(T)).Deserialize(ms); 
      } 
     } 
     //--------------------------------------------------------------------- 
     public override T Deserialize<T>(Stream iostream) 
     { 
      return (T)new XmlSerializer(typeof(T)).Deserialize(iostream); 
     } 
    } 

//下一

public static class CryptoSerivces 
{ 
     //--------------------------------------------------------------------- 
     public static Byte[] AesEncrypt(Byte[] src, Byte[] key, Byte[] IV) 
     { 
      using (RijndaelManaged myRijndael = new RijndaelManaged()) 
      { 
       try 
       { 
        myRijndael.Mode = CipherMode.CBC; 
        myRijndael.Key = key; 
        myRijndael.IV = IV; 
        myRijndael.Padding = PaddingMode.PKCS7; 

        using (ICryptoTransform encryptor = myRijndael.CreateEncryptor()) 
        using (MemoryStream msEncrypt = new MemoryStream()) 
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
        { 
         csEncrypt.Write(src, 0, src.Length); 
         csEncrypt.FlushFinalBlock(); 

         return msEncrypt.ToArray(); 
        } 
       } 
       finally 
       { 
        myRijndael.Clear(); 
       } 
      } 
     } 
     //--------------------------------------------------------------------- 
     public static Byte[] AesDecrypt(Byte[] src, Byte[] key, Byte[] IV) 
     { 
     using (RijndaelManaged myRijndael = new RijndaelManaged()) 
     { 
      try 
      { 
       myRijndael.Mode = CipherMode.CBC; 
       myRijndael.Key = key; 
       myRijndael.IV = IV; 
       myRijndael.Padding = PaddingMode.PKCS7; 

       using (ICryptoTransform decryptor = myRijndael.CreateDecryptor()) 
       using (MemoryStream msDecrypt = new MemoryStream()) 
       using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Write)) 
       { 
        csDecrypt.Write(src, 0, src.Length); 
        csDecrypt.FlushFinalBlock(); 

        return msDecrypt.ToArray(); 
       } 
      } 
      finally 
      { 
       myRijndael.Clear(); 
      } 
     } 
    } 
} 

//把所有的peices一起

void SaveToFile(String fileName, Parametres obj) 
{ 
    ObjectXmlSerializer oxs = new ObjectXmlSerializer(); 
    Byte[] bObj = oxs.Serialize(obj); 
    Byte[] bEncObj = CryptoSerivces.AesEncrypt(bObj, SomeKey, SomeIV); 

    using (FileStream fs = File.Open(filename, FileMode.OpenOrCreate)) 
    { 
     fs.Write(bEncObj, 0, bEncObj.Length); 
    } 
} 

//我會把讀書留給你。