Для объекта RijndaelManaged
установите для свойства Padding
значение PaddingMode.ANSIX923
или PaddingMode.ISO10126
.
Эти нулевые байты были добавлены для заполнения окончательного зашифрованного блока.По умолчанию он дополняется нулями, что означает отсутствие указания на фактическую длину данных.Другие режимы заполнения включают длину в последнем байте, так что заполнение может быть удалено после расшифровки.
Установите для свойства заполнения в подпрограмме шифрования и дешифрования одинаковое значение.
rijndaelCSP.Padding = PaddingMode.ANSIX923;
Если он знает, чего ожидать, то поток дешифрования автоматически удалит заполнение, поэтому дальнейших изменений не требуется.
ОБНОВЛЕНИЕ
Просмотрваш код, кажется, что число байтов, которые вы записываете в выходной файл, равно количеству байтов, считанных из входного файла.
byte[] inputFileData = new byte[(int)inputFileStream.Length];
decryptStream.Read(inputFileData, 0, (int)inputFileStream.Length);
Процесс расшифровки не собирается полностью заполнитьвверх по массиву inputFileData
из-за заполнения входных данных.
Затем выходной поток запишет всю длину буфера, даже если он не был полностью заполнен.
outputFileStream.Write(inputFileData, 0, inputFileData.Length);
Это источник ваших нулей.
Возможно, вы захотите изменить способ шифрования и дешифрования, чтобы он больше не использовал буферы фиксированной длины.Кроме того, вы можете сохранить длину зашифрованных данных в начале и записать только количество байтов, соответствующих этой длине.