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

本文关键字:数组 字节数 字节 文件 不一致 读取 | 更新日期: 2023-09-27 18:28:55

所以我的问题很简单。我想加密一些文本并将其像数组的字节一样写入文件,然后我需要读取文件的内容并像parameter一样将数组的字节解密为字符串的另一种方法。方法Encrypt和Decrypt运行良好,我尝试过它,但当我使用FILE中的字节数组时,它引发了异常。

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

此方法将字节数组加密为字符串

private static string DecryptByte(byte[] text, byte[] key, byte[] vektor)
    {
        string result = 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("Key");
        try
        {
            using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
            {
                provider.Key=key;
                provider.IV=vektor;
                using (MemoryStream memory = new MemoryStream(text))
                {
                    using (CryptoStream crypto = new CryptoStream(memory, provider.CreateDecryptor(provider.Key, provider.IV), CryptoStreamMode.Read))
                    {
                        using (StreamReader read = new StreamReader(crypto))
                        { 
                            result=read.ReadToEnd();
                        }
                    }
                }
            }
        }
        catch(Exception e)
        {
            Console.WriteLine("Error in DecryptByte:{0}"+e.Message);
        }
        return result;
    }

好吧,我保存加密文本,然后当按下按钮时

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

所以我的问题是,我从File读取的数据不一样,并且在DecryptByte中抛出了Exception。你能帮我吗?编辑是异常消息为无效数据

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

按钮Decrypt_Click中的代码不会初始化解密器的Key和IV属性
我怀疑这就是你例外的原因。

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

provider.Padding = PaddingMode.PKCS7;

将确保加密字节中的正确块大小(当然解密时也需要)