加密文件未正确解密

我有以下问题:有一个名为 的类UserConfigStorage,其中有 8 个字符串。程序第一次运行时,会要求用户输入他们的个人信息,这些信息存储在上述 8 个字符串中。一旦用户点击一个按钮,这个类就会被序列化和加密,以防止用户修改它。然后,当程序第二次运行时,根据Form_Load事件,文件被解密,并使用反序列化方法将其中的信息加载到文本框。但是,System.Runtime.Serialization.SerializationException: End of Stream encountered before parsing was completed抛出异常,并且无法读取文件。


在查看代码和生成的文件时,我发现生成的解密文件没有所有信息。它实际上只存储了 8 个字符串中的 6 个。


方法如下:


序列化方法


    public void SerializeUserConfig(string fileName)

    {

        try

        {

            FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);

            BinaryFormatter binForm = new BinaryFormatter();

            binForm.Serialize(fileStream, userconfigstorage);

            fileStream.Close();


            encryptor.Encrypt(fileName, perfilAcesso.GetUserConfigPath() + "Encrypted", "syndra15OP");


            File.Delete(fileName);


            MessageBox.Show("Dados salvos com sucesso!");

        }

        catch (Exception exception)

        {

            errorlog.SetError(exception.ToString());

            SerializeError(perfilAcesso.GetUserErrorLogPath());

            MessageBox.Show("Houve um erro ao salvar as configurações!\nPor favor, contate o desenvolvedor.\n\nEID: 002");

        }

    }

反序列化方法


    public UserConfigStorage DeserializeUserConfig(string fileName)

    {

        encryptor.Decrypt(perfilAcesso.GetUserConfigPath() + "Encrypted", fileName, "syndra15OP");


        FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

        BinaryFormatter binForm = new BinaryFormatter();

        UserConfigStorage userconfigstorage = (UserConfigStorage)binForm.Deserialize(fileStream);

        fileStream.Close();

        return userconfigstorage;

    }


任何人都可以帮助我了解导致文件未完全解密的原因吗?提前致谢!


富国沪深
浏览 173回答 1
1回答

白衣非少年

是的,在这里使用绝对是您的朋友!:)为什么要将对象序列化到一个文件中,只是为了在之后将其加密到另一个文件中?我已经清理了您的代码,这应该可以按预期工作:public void SerializeUserConfig(string fileName){    try    {        Encrypt(userconfigstorage, Path.Combine(perfilAcesso.GetUserConfigPath(), fileName), "syndra15OP");        MessageBox.Show("Dados salvos com sucesso!");    }    catch (Exception exception)    {        errorlog.SetError(exception.ToString());        SerializeError(perfilAcesso.GetUserErrorLogPath());        MessageBox.Show("Houve um erro ao salvar as configurações!\nPor favor, contate o desenvolvedor.\n\nEID: 002");    }}public UserConfigStorage DeserializeUserConfig(string fileName){    return Decrypt(Path.Combine(perfilAcesso.GetUserConfigPath(), fileName), "syndra15OP");}public void Encrypt(UserConfigStorage input, string filePath, string strHash){    using (TripleDESCryptoServiceProvider tdc = new TripleDESCryptoServiceProvider())    {        using (FileStream outStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write))        {            using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())            {                tdc.Key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strHash));                md5.Clear();            }            tdc.Mode = CipherMode.ECB;            using (CryptoStream cryStream = new CryptoStream(outStream, tdc.CreateEncryptor(), CryptoStreamMode.Write))            {                BinaryFormatter binForm = new BinaryFormatter();                binForm.Serialize(cryStream, input);            }        }    }}public UserConfigStorage Decrypt(string filePath, string strHash){    UserConfigStorage output;    using (TripleDESCryptoServiceProvider tdc = new TripleDESCryptoServiceProvider())    {        using (FileStream outStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))        {            using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())            {                tdc.Key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strHash));                md5.Clear();            }            tdc.Mode = CipherMode.ECB;            using (CryptoStream cryStream = new CryptoStream(outStream, tdc.CreateDecryptor(), CryptoStreamMode.Read))            {                BinaryFormatter binForm = new BinaryFormatter();                output = binForm.Deserialize(cryStream) as UserConfigStorage;            }        }    }    return output;}问候
打开App,查看更多内容
随时随地看视频慕课网APP