Чтение байтового массива несовместимо с записью байтового массива в файл - PullRequest
0 голосов
/ 23 марта 2012

так что моя проблема проста. Я хочу зашифровать некоторый текст и записать его в файл как байт массива, а затем мне нужно прочитать содержимое файла и получить как параметр другого метода, который расшифровывает этот байт массива в строку. Метод 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;
    }

Этот метод Ecnrypt байтовый массив в строку

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

Так что моя проблема в том, что данные, которые я читаю из Файла, не совпадают, и в DecryptByte выдается Исключение. Не могли бы вы помочь мне? РЕДАКТИРОВАТЬ да Сообщение об исключении неверные данные

1 Ответ

0 голосов
/ 23 марта 2012

Код в вашей кнопке Decrypt_Click: вы не инициализируете Key и свойства IV вашего Decryptor.
Я подозреваю, что это является причиной вашего исключения.проблема в методах шифрования и дешифрования.DESCryptoServiceProvider - это обертка вокруг SymmetricAlgorithm.Это означает, что он шифрует байты в блоках одинакового размера.Таким образом, входные данные должны быть точно кратными размеру блока.Это не случится все время.Затем необходимо использовать padding .

provider.Padding = PaddingMode.PKCS7;

обеспечит правильный размер блока в зашифрованных байтах (также необходимо, конечно, при расшифровке)

...