C# 读取字节数组与将字节数组写入文件不一致

C# 读取字节数组与将字节数组写入文件不一致,c#,filestream,C#,Filestream,所以我的问题很简单。我想对一些文本进行加密,然后像数组的字节一样将其写入文件,然后我需要读取文件的内容,然后像parametr一样获取另一个方法的参数,该方法将数组的字节解密为字符串。 方法Encrypt和Decrypt工作得很好,我尝试了它,但当我使用文件中的字节数组时,它引发了异常 private static byte[] EncryptString(string text,byte[] key,byte[] vektor) { byte[] array=null;

所以我的问题很简单。我想对一些文本进行加密,然后像数组的字节一样将其写入文件,然后我需要读取文件的内容,然后像parametr一样获取另一个方法的参数,该方法将数组的字节解密为字符串。 方法Encrypt和Decrypt工作得很好,我尝试了它,但当我使用文件中的字节数组时,它引发了异常

private static byte[] EncryptString(string text,byte[] key,byte[] vektor)
    {
        byte[] array=null;
        // Check arguments.
        if (text == null || text.Length <= 0)
            throw new ArgumentNullException("plainText");
        if (key == null || key.Length <= 0)
            throw new ArgumentNullException("Key");
        if (vektor == null || vektor.Length <= 0)
            throw new ArgumentNullException("Vektor");
        try
        {
            using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
            {
                provider.Key = key;
                provider.IV = vektor;
                using (MemoryStream memory = new MemoryStream())
                {
                    using (CryptoStream crypto = new CryptoStream(memory, provider.CreateEncryptor(provider.Key, provider.IV), CryptoStreamMode.Write))
                    {
                        using (StreamWriter writer = new StreamWriter(crypto))
                        {
                            writer.WriteLine(text);
                        }
                    }
                    array = memory.ToArray();
                }
            }
        }
        catch (ArgumentNullException e)
        {
            Console.WriteLine("Error in EncryptString  {0}", e.Message);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error in EncryptString  {0}", e.Message);
        }
        return array;
    }
所以我的问题是,我从文件中读取的数据是不同的,并且在解密字节中抛出异常。你能帮我吗?
编辑yeah异常消息是无效数据

按钮中的代码加密\u单击您不初始化解密器的密钥和IV属性。
我怀疑这就是你例外的原因

此外,我认为您在加密和解密方法方面还有另一个问题。 DecryptoServiceProvider是对称算法的包装器。这意味着它在大小相同的块中加密字节。因此,输入数据需要是块大小的精确倍数。这不会一直发生。然后需要使用

provider.Padding = PaddingMode.PKCS7;

将确保以加密字节为单位的正确块大小(当然在解密时也需要)

异常是什么(确切地说),以及引发异常的代码行是什么?此外,您的代码有点混乱-您应该真正将您的读/写代码提取到它们自己的方法中,与GUI分离。重构代码以更好地分离责任将有助于您调试此类问题。您能告诉我们异常是怎么说的吗?我敢打赌!填充无效,无法删除!CryptographyException坏数据属性不需要初始化。使用(DESCryptoServiceProvider prov=new DESCryptoServiceProvider()){byte=EncryptString(textik,prov.Key,prov.IV);text=DecryptByte(bajt,prov.Key,prov.IV);}文本与加密前相同。所以我认为错误在我从文件中写入或读取数据的某个地方。我尝试复制异常,当然,我得到了相同的异常。但问题是我使用了两个不同的DescriptorServiceProvider实例。这两个ISTANCE包含不同的键和IV值。所以,如果你用同一个实例加密然后解密(正如你之前的评论所说的),你不会得到任何异常,但是如果你创建了两个不同的DecryptoServiceProvider(可能在两个不同的按钮点击事件中),你将无法解密用第一个实例加密的文件。哦,我的天哪,这是个愚蠢的错误,我花了两天时间试图解决这个问题。非常感谢,我想我重新编写了方法。
private void buttonDecrypt_Click(object sender, RoutedEventArgs e)
    {
        byte[] text=null,helper=null;
        string result = null;
        try
        {
            using (FileStream filestream = File.OpenRead(path))
            {
                helper = new byte[filestream.Length];
                filestream.Read(helper, 0, (int)filestream.Length);
            }
                    using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
                    {
                        result = DecryptByte(helper, provider.Key, provider.IV);
                    }
        }
        catch(Exception ex)
        {
            Console.WriteLine("Error v ButtonDecrypt.{0}_____{1}",ex.Message,ex.Data);
        }
    }
provider.Padding = PaddingMode.PKCS7;