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

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

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

Так

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

Расшифровка только кусков и возвращаемого байта [] Код - Ошибка

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

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 МБ.

1 ответ

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

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

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

Другие вопросы по тегам