Я пытаюсь зашифровать / расшифровать строку с помощью AES, используя потоки. Я использую следующий код для шифрования:
var provider = Aes.Create();
provider.Mode = CipherMode.CBC;
provider.Padding = PaddingMode.PKCS7;
using var encryptor = provider.CreateEncryptor();
using var memoryStream = new MemoryStream();
using var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
using var streamWriter = new StreamWriter(cryptoStream, Encoding.UTF8);
streamWriter.Write(plainText);
cryptoStream.FlushFinalBlock();
var cipher = memoryStream.ToArray();
Это успешно создает байтовый массив, хотя независимо от длины открытого текста, шифр всегда составляет 16 байтов. Насколько я понимаю, с размером блока 16, текстовая строка длиной 16 или более должна приводить к шифру, который больше 16 байтов. Кроме того, даже для открытого текста размером менее 16 байт расшифровка всегда приводит к пустой строке.
var provider = Aes.Create();
provider.Mode = CipherMode.CBC;
provider.Padding = PaddingMode.PKCS7;
using var decryptor = _provider.CreateDecryptor(key, iv);
using var memoryStream = new MemoryStream(cipher);
using var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
using var streamReader = new StreamReader(cryptoStream, Encoding.UTF8);
var plainText = streamReader.ReadToEnd();
Мой код основан на этом образце в документах Microsoft, хотя я ' После вызова в поток я вызываю cryptoStream.FlushFinalBlock()
, хотя это не работает должным образом.