Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Лабораторна робота №8
з дисципліни «Захист інформації в комп’ютерних системах»
на тему: «Шифрування даних за допомогою AES»
Мета роботи:
Мета роботи – ознайомитись з одним із сучасних симетричних алгоритмів блочного шифрування AES, навчитися його застосовувати для різних типів даних.
Завдання:
1. Розробити графічний інтерфейс на мові C# для коду алгоритму реалізації шифрування файлів за допомогою AES (наведений у додатку).
2. Налаштувати алгоритм згідно свого варіанту відповідно до таблиці варіантів.
Теоретичні відомості
Advanced Encryption Standard (AES) – симетричний алгоритм блочного шифрування (розмір блока 128 біт, ключ 128/192/256 біт), фіналіст конкурсу AES і прийнятий в якості американського стандарту шифрування урядом США. Станом на 2009 рік AES був одним із найпоширеніших алгоритмів симетричного шифрування.
AES являє собою симетричний алгоритм шифрування з ключем. Ключ може мати довжину 128, 192 і 256 біт. Алгоритми з ключем довжиною 128, 192 і 256 біт позначаються відповідно як AES-128, AES-192, AES-256.
AES-128, AES-192, AES-256 обробляють блоки даних за відповідно 10, 12 та 14 ітерацій. Кожна ітерація (раунд) являє собою визначену послідовність трансформацій. Всі ітерації однакові за виключенням останньої, з якої виключене одне з перетворень. Кожен раунд працює з двома 128-бітними блоками: “поточний” та “ключ раунду”. Всі раунди використовують різні “ключі раунду”, які отримуються за допомогою алгоритму розширення ключа. Цей алгоритм не залежить від даних, які ми шифруємо, і може виконуватися незалежно від фази шифрування/дешифрування.
Хід виконання:
Варіант №6
Код реалізації алгоритму роботи шифру:
using System;
using System.Security.Cryptography;
using System.IO;
namespace AES_Encryption
{
public class AES
{
public AES()
{
}
// Encrypt a byte array into a byte array using a key and an IV
private byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV)
{
// Create a MemoryStream that is going to accept the encrypted bytes
MemoryStream ms = new MemoryStream();
Rijndael alg = Rijndael.Create();
alg.Key = Key;
alg.IV = IV;
CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(clearData, 0, clearData.Length);
cs.Close();
byte[] encryptedData = ms.ToArray();
return encryptedData;
}
/// <summary>
/// Returns an encrypted string using Rijndael (128,192,256 Bits).
/// </summary>
public string Encrypt(string Data, string Password,int Bits)
{
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(Data);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
new byte[] {0x00, 0x01, 0x02, 0x1C,0x1D,0x1E,0x03,0x04,0x05,0x0F,0x20,0x21,0xAD,0xAF,0xA4});
if (Bits == 128)
{
byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(16), pdb.GetBytes(16));
return Convert.ToBase64String(encryptedData);
}
else if(Bits == 192)
{
byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(24), pdb.GetBytes(16));
return Convert.ToBase64String(encryptedData);
}
else if(Bits == 256)
{
byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16));
return Convert.ToBase64String(encryptedData);
}
else
{
return string.Concat(Bits);
}
}
// Decrypt a byte array into a byte array using a key and an IV
private byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV)
{
MemoryStream ms = new MemoryStream();
Rijndael alg = Rijndael.Create();
alg.Key = Key;
alg.IV = IV;
CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherData, 0, cipherData.Length);
cs.Close();
byte[] decryptedData = ms.ToArray();
return decryptedData;
}
public string Decrypt(string Data, string Password,int Bits)
{
byte[] cipherBytes = Convert.FromBase64String(Data);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
new byte[] {0x00, 0x01, 0x02, 0x1C,0x1D,0x1E,0x03,0x04,0x05,0x0F,0x20,0x21,0xAD,0xAF,0xA4});
if (Bits == 128)
{
byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(16), pdb.GetBytes(16));
return System.Text.Encoding.Unicode.GetString(decryptedData);
}
else if(Bits == 192)
{
byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(24), pdb.GetBytes(16));
return System.Text.Encoding.Unicode.GetString(decryptedData);
}
else if(Bits == 256)
{
byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(32), pdb.GetBytes(16));
return System.Text.Encoding.Unicode.GetString(decryptedData);
}
else
{
return string.Concat(Bits);
}
}
}
}
Результат виконання:
відкритий текст:
/
шифрований текст:
/
Висновок: на лабораторній роботі я ознайомився із шифром AES.