为了账号安全,请及时绑定邮箱和手机立即绑定

加密文件未正确解密

加密文件未正确解密

C#
富国沪深 2022-06-12 10:30:25
我有以下问题:有一个名为 的类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;    }任何人都可以帮助我了解导致文件未完全解密的原因吗?提前致谢!
查看完整描述

1 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

是的,在这里使用绝对是您的朋友!:)


为什么要将对象序列化到一个文件中,只是为了在之后将其加密到另一个文件中?


我已经清理了您的代码,这应该可以按预期工作:


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;

}

问候


查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信