Учитывая, что любая комбинация битов правильной длины может быть допустимым ключом, и то же самое верно для IV, у криптопотока нет способа определить, является ли любой из них неправильным, пока он не попытается расшифровать последний блок зашифрованный текст - в этот момент он обнаруживает, что заполнение неверно, и выдает исключение. Кроме того, вы не можете использовать любой размер блока, который вам нужен - есть определенные размеры блоков, которые действительны для определенных поставщиков криптографии - для Rijndael, я думаю, допустимые размеры блоков составляют 128, 192 и 256.
Единственный способ избежать «мусорного» файла - это выполнить всю расшифровку в памяти или записать во временный файл, а не в конечный выходной файл. Нет никакого способа избежать исключения, но в любом случае это должно быть необычное явление.
Я бы также избавился от всего управления буфером в вашем коде, проверок длины и т. Д., И просто использовал бы Stream.CopyTo между вашим входным потоком и крипто-потоком. E.g.:
using (FileStream fsInput = new FileStream(strInputFile, FileMode.Open, FileAccess.Read))
{
using (FileStream fsOutput = new FileStream(strOutputFile, FileMode.OpenOrCreate, FileAccess.Write))
{
CryptoStream csCryptoStream = null;
RijndaelManaged cspRijndael = new RijndaelManaged();
cspRijndael.BlockSize = 256;
switch (Direction)
{
case CryptoAction.ActionEncrypt:
csCryptoStream = new CryptoStream(fsOutput, cspRijndael.CreateEncryptor(bytKey, bytIV),
CryptoStreamMode.Write);
break;
case CryptoAction.ActionDecrypt:
csCryptoStream = new CryptoStream(fsOutput, cspRijndael.CreateDecryptor(bytKey, bytIV),
CryptoStreamMode.Write);
break;
}
fsInput.CopyTo(csCryptoStream);
csCryptoStream.Close();
}
}
pRet = true;