Заполнение недопустимо и не может быть удалено, исключение и длина данных для расшифровки недопустимы. 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.