Если вы переведете Rijndael в режим CFB с размером блока 8, то он будет действовать как потоковый шифр - для каждого вставленного байта вы снова получаете байт.
public static void Main(string[] args)
{
var algorithm = new RijndaelManaged()
{
Mode = CipherMode.CFB,
// This is the equivalent of BlockSize in CFB mode. We set it to 8 (bits) to prevent any buffering of data
// while waiting for whole blocks.
FeedbackSize = 8,
};
// Don't hard-code in real life, obviously
var key = new byte[32];
var iv = new byte[16];
var input = new byte[] { 1, 2, 3 };
byte[] result;
using (var ms = new MemoryStream())
{
using (var cryptoStream = new CryptoStream(ms, algorithm.CreateEncryptor(key, iv), CryptoStreamMode.Write))
{
cryptoStream.Write(input, 0, input.Length);
}
result = ms.ToArray();
}
}
Обратите внимание, чтопохоже, это работает только на .NET Framework - .NET Core, кажется, не поддерживает CFB (см. эту проблему GitHub ).
Обратите внимание, что шифрование не предотвращает взлом! Люди не могут прочитать ваше открытое текстовое сообщение, но они могут очень легко изменить зашифрованный текст, чтобы контролировать то, к чему оно расшифровывается. Потоковые шифры, как правило, особенно уязвимы для этого. Если вам нужно запретить кому-либо контролировать то, во что расшифровывается зашифрованный вывод, то вам нужна подпись.
Также обратите внимание, что вы не должны использовать один и тот же IV для нескольких сообщений. Создайте случайный IV и передайте его вместе с вашим сообщением, часто в виде первых 2 байтов.