Для реализации алгоритма нужно подключить библиотеку
Далее напишем метод для шифрования данных:
Метод, для дешифрирования потока байтов:
Зашифрованное сообщение можно передавать в открытый канал. При перехвате злоумышленники обнаружат лишь шифр, с которым мало что смогут сделать.
Стоит отметить, что сам ключ стоит передавать по закрытому каналу либо используя алгоритмы шифрования с ассиметричным ключом. Например RSA.
Ключ AES шифруется открытым ключом RSA, передается в открытый канал, далее вторая сторона расшифровывает ключ AES закрытым ключом RSA.
Во время передачи шифра в открытый канал может произойти MITM атака — попытка подмены сообщения и т.п. злоумышленником.
Для проверки подлинности сообщения используйте цифровую подпись для каждого сообщения (вычисляется хеш, проверяемый получателем для проверки подлинности сообщения).
Данным методом можно воспользоваться, чтобы зашифровать данные другими алгоритмами с симметричным ключом, например TripleDes.
System.Security.Cryptography
и указать пространство имен:using System.Security.Cryptography;
Далее напишем метод для шифрования данных:
C#:
/// <summary>
/// Шифрует исходное сообщение AES ключом (добавляет соль)
/// </summary>
/// <param name="src"></param>
/// <returns></returns>
public static byte[] ToAes256(string src)
{
//Объявляем объект класса AES
Aes aes = Aes.Create();
//Генерируем соль
aes.GenerateIV();
//Присваиваем ключ. aeskey - переменная (массив байт), сгенерированная методом GenerateKey() класса AES
aes.Key = aeskey;
byte[] encrypted;
ICryptoTransform crypt = aes.CreateEncryptor(aes.Key, aes.IV);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, crypt, CryptoStreamMode.Write))
{
using (StreamWriter sw = new StreamWriter(cs))
{
sw.Write(src);
}
}
//Записываем в переменную encrypted зашиврованный поток байтов
encrypted = ms.ToArray();
}
//Возвращаем поток байт + крепим соль
return encrypted.Concat(aes.IV).ToArray();
}
Метод, для дешифрирования потока байтов:
C#:
/// <summary>
/// Расшифровывает криптованного сообщения
/// </summary>
/// <param name="shifr">Шифротекст в байтах</param>
/// <returns>Возвращает исходную строку</returns>
public static string FromAes256(byte[] shifr)
{
byte[] bytesIv = new byte[16];
byte[] mess = new byte[shifr.Length - 16];
//Списываем соль
for (int i = shifr.Length - 16, j = 0; i < shifr.Length; i++, j++)
bytesIv[j] = shifr[i];
//Списываем оставшуюся часть сообщения
for (int i = 0; i < shifr.Length - 16; i++)
mess[i] = shifr[i];
//Объект класса Aes
Aes aes = Aes.Create();
//Задаем тот же ключ, что и для шифрования
aes.Key = aeskey;
//Задаем соль
aes.IV = bytesIv;
//Строковая переменная для результата
string text = "";
byte[] data = mess;
ICryptoTransform crypt = aes.CreateDecryptor(aes.Key, aes.IV);
using (MemoryStream ms = new MemoryStream(data))
{
using (CryptoStream cs = new CryptoStream(ms, crypt, CryptoStreamMode.Read))
{
using (StreamReader sr = new StreamReader(cs))
{
//Результат записываем в переменную text в вие исходной строки
text = sr.ReadToEnd();
}
}
}
return text;
}
Зашифрованное сообщение можно передавать в открытый канал. При перехвате злоумышленники обнаружат лишь шифр, с которым мало что смогут сделать.
Стоит отметить, что сам ключ стоит передавать по закрытому каналу либо используя алгоритмы шифрования с ассиметричным ключом. Например RSA.
Ключ AES шифруется открытым ключом RSA, передается в открытый канал, далее вторая сторона расшифровывает ключ AES закрытым ключом RSA.
Во время передачи шифра в открытый канал может произойти MITM атака — попытка подмены сообщения и т.п. злоумышленником.
Для проверки подлинности сообщения используйте цифровую подпись для каждого сообщения (вычисляется хеш, проверяемый получателем для проверки подлинности сообщения).
Данным методом можно воспользоваться, чтобы зашифровать данные другими алгоритмами с симметричным ключом, например TripleDes.