Реализация симметричного алгоритма блочного шифрования AES
Создаём консольное приложение в Visual Studio 2017 и даём ему любое
имя, в нашем случае приложение называется AES, рисунок 1.
Рисунок 1 – Создание консольного приложения
Далее создаём следующие функции в консольном приложении, листинг 1:
- Encrypt() - функция шифрования данных;
- Decrypt() - функция дешифрования данных.
Для использования класса AES необходимо подключить пространство
имён System.Security.Cryptography к проекту.
Функция Encrypt принимает в качестве параметров 2 аргумента:
-
имя исходного файла;
-
имя шифрованного файла, который она создаёт.
Функция Decrypt принимает в качестве параметров 2 аргумента:
-
имя шифрованного файла;
-
имя дешифрованного файла, который она создаёт.
-
Листинг 1 – Программный код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Security.Cryptography;
namespace AES
{
class Program
{
static void Encrypt(string input, string output)
{
StreamReader file = new StreamReader(new FileStream(input, FileMode.Open, FileAccess.Read));
string gg = file.ReadToEnd();
string EncryptionKey = "test123";
byte[] clearBytes = Encoding.Unicode.GetBytes(gg);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[]
{ 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(),
CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
input = Convert.ToBase64String(ms.ToArray());
}
}
StreamWriter SW = new StreamWriter(new FileStream(output, FileMode.Create, FileAccess.Write));
SW.Write(input);
SW.Close();
}
static void Decrypt(string input_t, string output_t)
{
StreamReader file = new StreamReader(new FileStream(input_t, FileMode.Open, FileAccess.Read));
string gg = file.ReadToEnd();
string EncryptionKey = "test123";
byte[] cipherBytes = Convert.FromBase64String(gg);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[]
{ 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(),
CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
}
Console.WriteLine(Encoding.Unicode.GetString(ms.ToArray()));
input_t = Encoding.Unicode.GetString(ms.ToArray());
}
}
StreamWriter SW = new StreamWriter(new FileStream(output_t, FileMode.Create, FileAccess.Write));
SW.Write(input_t);
SW.Close();
}
static void Main(string[] args)
{
if (args.Length == 0)
Console.WriteLine("AES\n");
if (args.Length != 0 && args[0] == "-e") Encrypt(args[1], args[2]);
if (args.Length != 0 && args[0] == "-d") Decrypt(args[1], args[2]);
}
}
}
Для удобства тестирования приложения создадим бат-файл(start.bat) и
файл шифруемого сообщения(input.txt) по следующему пути …Visual Studio
2017 – Projects –
AES– AES – bin – Debug, рисунок 2.
Рисунок 2 – Файлы
Содержимое файлов input.txt и start.bat, рисунок 3.
Рисунок 3 – Содержимое файлов
Запускаем файл start.bat из папки Debug и видим результаты выполнения
приложения, рисунок 4.
Рисунок 4 – Результаты работы приложения
Рисунок 5 – Содержимое файлов после выполнения приложения
Данные представленные на рисунках 3 и 5 позволяют предположить, что
процедуры шифрования и дешифрования реализованы корректно, так как
дешифрованный файл совпадает с исходным файлом.
Do'stlaringiz bilan baham: |