C # TripleDES шифрование плохих данных - PullRequest
0 голосов
/ 19 мая 2018

Я хочу зашифровать файл, сохранить его в XML.После этого я хочу прочитать XML, получить данные, расшифровать их и сохранить в файл.У меня есть метод шифрования и дешифрования, но когда я пытаюсь расшифровать его, я получаю исключение «Плохие данные».Код шифрования:

public string EncryptData(byte[] fileData, byte[] tdesKey, byte[] tdesIV)
        {
            MemoryStream msInput = new MemoryStream(fileData);
            MemoryStream msOutput = new MemoryStream();
            msOutput.SetLength(0);            

            //Create variables to help with read and write.
            byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
            long rdlen = 0;              //This is the total number of bytes written.
            long totlen = msInput.Length;    //This is the total length of the input file.
            int len;                     //This is the number of bytes to be written at a time.

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();

            switch (mw.cmb_encryption_mode.Text)
            {
                case "ECB": tdes.Mode = CipherMode.ECB; break;
                case "CBC": tdes.Mode = CipherMode.CBC; break;
                case "CFB": tdes.Mode = CipherMode.CFB; break;
                case "OFB": tdes.Mode = CipherMode.OFB; break;
                default: break;
            }
            tdes.Padding = PaddingMode.PKCS7;
            tdes.Key = tdesKey;
            tdes.IV = tdesIV;
            CryptoStream encStream = new CryptoStream(msOutput, tdes.CreateEncryptor(), CryptoStreamMode.Write);
            mw.encryption_progress_bar.Maximum = totlen;

            //Read from the input file, then encrypt and write to the output file.
            while (rdlen < totlen)
            {
                len = msInput.Read(bin, 0, 100);
                encStream.Write(bin, 0, len);
                rdlen = rdlen + len;

                mw.encryption_progress_bar.Dispatcher.Invoke(() => mw.encryption_progress_bar.Value = rdlen, System.Windows.Threading.DispatcherPriority.Background);
            }

            encStream.Close();
            byte[] resultArray = msOutput.GetBuffer();
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

Код дешифрования:

public byte[] DecryptData(byte[]encryptedData, byte[] tdesKey, Header header, byte[] tdesIV)
        {
            MemoryStream msInput = new MemoryStream(encryptedData);
            MemoryStream msOutput = new MemoryStream();
            msOutput.SetLength(0);

            //Create variables to help with read and write.
            byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
            long rdlen = 0;              //This is the total number of bytes written.
            long totlen = msInput.Length;    //This is the total length of the input file.
            int len;                     //This is the number of bytes to be written at a time.

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();

            switch (header.cipherMode)
            {
                case "ECB": tdes.Mode = CipherMode.ECB; break;
                case "CBC": tdes.Mode = CipherMode.CBC; break;
                case "CFB": tdes.Mode = CipherMode.CFB; break;
                case "OFB": tdes.Mode = CipherMode.OFB; break;
                default: break;
            }
            tdes.Padding = PaddingMode.PKCS7;
            tdes.Key = tdesKey;
            tdes.IV = tdesIV;
            CryptoStream encStream = new CryptoStream(msOutput, tdes.CreateDecryptor(), CryptoStreamMode.Write);
            mw.decryption_progress_bar.Maximum = totlen;

            //Read from the input file, then encrypt and write to the output file.
            while (rdlen < totlen)
            {
                len = msInput.Read(bin, 0, 100);
                encStream.Write(bin, 0, len);
                rdlen = rdlen + len;
                mw.decryption_progress_bar.Dispatcher.Invoke(() => mw.decryption_progress_bar.Value = rdlen, System.Windows.Threading.DispatcherPriority.Background);
            }            
            encStream.Close(); // <-exception

            return msOutput.GetBuffer();
        }

Если я шифрую и дешифрую одни и те же данные с использованием функций ICryptoTransform и TransformFinalBlock, все работает хорошо, но мне нужно обновлять прогресс по мере выполнениябар каждый обработанный блок.Я не могу понять, почему это не работает, я что-то не так делаю?

1 Ответ

0 голосов
/ 20 мая 2018

Причина, по которой я получил ошибку «Неверные данные», заключалась в использовании MemoryStream.GetBuffer() вместо MemoryStream.ToArray(), как Джеймс написал в комментарии:

MemoryStream.GetBuffer () - это не тот метод, который вам нужен.Вы хотите MemoryStream.ToArray ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...