Заполнение недопустимо и не может быть удалено, исключение и длина данных для расшифровки недействительны. Рейндал

Мое требование, как показано ниже. Шаг 1) Я хочу записать данные размером 101 МБ в локальную файловую систему, зашифровав их фрагментами по 10-10 МБ.

Шаг 2) Во время расшифровки я хочу получить 10-10 МБ данных из файла и хочу расшифровать и передать 10-10 МБ расшифрованных данных какой-либо другой функции (Примечание: размер моего последнего фрагмента будет 1 МБ, так как размер файла 101 МБ).

So

1) Когда я пытаюсь расшифровать только 10 МБ, выдает ошибку «Заполнение недопустимо и не может быть удалено»

2) Теперь, во время расшифровки, если я укажу paddingMode на None, то, когда придет последний фрагмент, т.е. 1 МБ, он выдаст ошибку «Длина данных для расшифровки недействительна». До 100 МБ все работает

Примечание: 1) До 100 МБ все работает как положено. Если я дам размер последнего фрагмента 10 МБ вместо 1 МБ, тогда он будет работать, но, наконец, мой целевой размер файла будет 110 МБ вместо 101 МБ. 2) Я не даю режим заполнения при шифровании, но чтобы избежать ошибки заполнения, это недопустимая ошибка, при расшифровке я не даю его никому. Временно я прокомментировал этот код.

3) Я использую один и тот же ключ и IV для шифрования и дешифрования.

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

private void WriteStreamInChunks(Stream fsstream, string filePath)
    {   
        int chunkSize = 10 * 1024 * 1024;
        byte[] buffer = new byte[chunkSize];

        using (var rijndaelManaged = new RijndaelManaged())
        {
            var encryptor = rijndaelManaged.CreateEncryptor(EncryptionKey, EncryptionIV);

            using (var fileStream = File.Create(filePath))
            {
                using (var cryptoStream = new CryptoStream(fileStream, encryptor, CryptoStreamMode.Write))
                {
                    int bytesRead;
                    while ((bytesRead = fsstream.Read(buffer, 0, chunkSize)) > 0)
                    {
                        cryptoStream.Write(buffer, 0, bytesRead);
                    }

                    if (!cryptoStream.HasFlushedFinalBlock)
                        cryptoStream.FlushFinalBlock();
                }
            }
        }
    }

Расшифровывать только фрагменты и возвращать код byte[] — Ошибка

«заполнение недопустимо», если я устанавливаю нулевой режим заполнения, а затем недопустимое исключение длины данных.

public byte[] GetDecryptedFileContent(string filePath, long chunkSizeInBytes, long seekValue, long fileSize, string encryptionIV)
    {
        var sourceFile = new FileInfo(filePath);
        var buffer = new byte[chunkSizeInBytes];

        byte[] encryptionKey = File.ReadAllBytes(Utils.GetSymmetricAlgoEncryptionKey());

        using (var fileStream = File.Open(sourceFile.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            fileStream.Seek(seekValue, SeekOrigin.Begin);
            using (var binaryReader = new BinaryReader(fileStream))
            {
                binaryReader.Read(buffer, 0, buffer.Length);
            }
        }

        using (MemoryStream dataOut = new MemoryStream())
        {
            using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
            {
                //rijndaelManaged.Padding = PaddingMode.None;

                ICryptoTransform decryptor = rijndaelManaged.CreateDecryptor(encryptionKey, Convert.FromBase64String(encryptionIV));

                using (CryptoStream cryptoStream = new CryptoStream(dataOut, decryptor, CryptoStreamMode.Write))
                {
                    cryptoStream.Write(buffer, 0, buffer.Length);
                    return dataOut.ToArray();
                }
            }
        }
        return null;
    }

Согласно моему требованию, я должен вернуть byte[] из этой функции GetDecryptedFileContent. Я вызываю эту функцию несколько раз, пока размер файла не станет равным 0, т.е. для каждого фрагмента. enter code here Кто-нибудь может мне помочь?

я хочу вернуть только 10-10 МБ.


person Dharmesh Fichadiya    schedule 18.09.2017    source источник


Ответы (1)


Ввод должен быть кратным размеру блока, иначе необходимо использовать заполнение. Заполнение добавляется только к последнему зашифрованному блоку. См. заполнение PKCS#7.

При чтении частей файла за раз убедитесь, что размер фрагмента кратен размеру блока. При чтении не указывать отступы для всех блоков, кроме последнего блока файла, и указывать отступы для последнего блока файла.

Обновление: похоже, вы используете режим CBC, потому что используете IV. В этом случае для всех блоков после первого блока IV будет предыдущим блоком. Просто прочитайте предыдущий блок и используйте его для IV. См. режим CBC.

person zaph    schedule 18.09.2017
comment
Спасибо за ваш ответ. - person Dharmesh Fichadiya; 18.09.2017
comment
Спасибо за ваш ответ. Что я пытаюсь сделать здесь, так это 1) я шифрую все содержимое за один раз и записываю его в файл. 2) Я хочу расшифровать файл, например. если размер файла 101 МБ и размер фрагмента, если 20 МБ, то 20-20 МБ, я хочу расшифровать, и какие бы данные ни были расшифрованы, я хочу вернуть их. - person Dharmesh Fichadiya; 18.09.2017