1

このクラスを含む WPF アプリケーションがあります:*

{[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);

このエラーの正確な理由は何ですか? どうすれば修正できますか?

4

1 に答える 1

2

この手法を使用してオブジェクトをシリアル化する場合、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();
            }
        }
    }
}

// すべてのピースをまとめる

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);
   }
}

// 読み方はお任せします。

于 2013-04-14T01:18:00.493 に答える