Обычная и зашифрованная не имеют одинаковую длину для шифрования в режиме CBC, который вы используете.Открытый текст должен быть дополнен до того, как он может быть зашифрован, поэтому размер зашифрованного текста всегда больше, чем текстовое сообщение для CBC (это режим по умолчанию, который использует расшифровщик).
Режимы потоковой передачи не нужнырасширять зашифрованный текст, так как они не требуют заполнения.К сожалению, Microsoft решила не включать режим счетчика в .NET.Вы можете использовать режим CFB.
Вы также можете решить внедрить режим счетчика с использованием ECB, если вам требуется параллельное шифрование (в комментариях под вопросом).Обычно AES настолько быстр, что параллелизм не требуется.Реализация счетчика статического размера и буфера CTR должна побледнеть по сравнению с созданием многопоточного кода.
Это неверно и может вызвать проблему:
int read = cryptoStream.Read(buffer, 0, inputencdec.Length);
Вы, конечно, должны поставитьв buffer.length
, а не inputencdec.length
.Использование буфера для хранения данных в буфере путем считывания до buffer.length
байтов за цикл.
Это также неверно:
plainStream.Write(buffer, totalRead, read);
проблема в том, чтоtotalRead
должно быть смещением в buffer
, а не смещением в потоке .Вы читаете в смещение 0 буфера, поэтому вы должны начать запись также со смещения 0.
Вы также можете создать MemoryStream
для открытого текста, обернуть его CryptoStream
используя расшифровщик, а затем напишите зашифрованный текст все за один раз.Насколько я вижу, для шифрования / дешифрования нет необходимости использовать другую схему.Кажется, вы все равно сохраняете весь открытый / зашифрованный текст в памяти.
Примечания:
- для режима CBC IV должен быть случайным;он часто добавляется к зашифрованному тексту и удаляется и используется расшифровщиком; ключи
- и IV должны состоять из случайных байтов;они должны не быть строками.