Мое требование, как показано ниже. Шаг 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 МБ.