CryptoStream
CryptoStream в режиме
Write пишет в
MemoryStream. После
FlushFinalBlock берут
ToArray. Расшифровка тем
же ключом и IV из
Aes
даёт "abcde". Поток закрывают
через using.
Синтаксис
using CryptoStream crypto = new CryptoStream(
target, encryptor, CryptoStreamMode.Write);
crypto.Write(plain, 0, plain.Length);
crypto.FlushFinalBlock();
Пример
Давайте зашифровать через поток:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main()
{
byte[] key = Encoding.UTF8.GetBytes(
"12345678901234567890123456789012");
byte[] iv = Encoding.UTF8.GetBytes("1234567890123456");
byte[] plain = Encoding.UTF8.GetBytes("abcde");
using MemoryStream target = new MemoryStream();
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
using CryptoStream crypto = new CryptoStream(
target,
aes.CreateEncryptor(),
CryptoStreamMode.Write);
crypto.Write(plain, 0, plain.Length);
crypto.FlushFinalBlock();
}
byte[] cipher = target.ToArray();
using Aes aes = Aes.Create();
aes.Key = key;
aes.IV = iv;
byte[] decoded = aes.CreateDecryptor()
.TransformFinalBlock(cipher, 0, cipher.Length);
string res = Encoding.UTF8.GetString(decoded);
Console.WriteLine(res);
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте расшифровать через поток чтения:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main()
{
byte[] key = Encoding.UTF8.GetBytes(
"12345678901234567890123456789012");
byte[] iv = Encoding.UTF8.GetBytes("1234567890123456");
byte[] plain = Encoding.UTF8.GetBytes("abcde");
byte[] cipher;
using (MemoryStream target = new MemoryStream())
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
using CryptoStream crypto = new CryptoStream(
target,
aes.CreateEncryptor(),
CryptoStreamMode.Write);
crypto.Write(plain, 0, plain.Length);
crypto.FlushFinalBlock();
cipher = target.ToArray();
}
using MemoryStream source = new MemoryStream(cipher);
using Aes aes = Aes.Create();
aes.Key = key;
aes.IV = iv;
using CryptoStream crypto = new CryptoStream(
source,
aes.CreateDecryptor(),
CryptoStreamMode.Read);
using MemoryStream output = new MemoryStream();
crypto.CopyTo(output);
string res = Encoding.UTF8.GetString(output.ToArray());
Console.WriteLine(res);
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте проверить, что шифр не пустой:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main()
{
byte[] key = Encoding.UTF8.GetBytes(
"12345678901234567890123456789012");
byte[] iv = Encoding.UTF8.GetBytes("1234567890123456");
byte[] plain = Encoding.UTF8.GetBytes("abcde");
using MemoryStream target = new MemoryStream();
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
using CryptoStream crypto = new CryptoStream(
target,
aes.CreateEncryptor(),
CryptoStreamMode.Write);
crypto.Write(plain, 0, plain.Length);
crypto.FlushFinalBlock();
}
byte[] cipher = target.ToArray();
bool res = cipher.Length > 0;
Console.WriteLine(res);
}
}
Результат выполнения кода:
True
Смотрите также
-
CreateEncryptor,
шифрование байт -
CreateDecryptor,
расшифровка байт -
Aes,
алгоритм AES -
Rfc2898DeriveBytes,
ключ из пароля