МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” ІКТА кафедра ЗІ ЗВІТ до лабораторної роботи № 4-5 з дисципліни: «Безпека технологій зв’язку» на тему: «Порівняльний аналіз алгоритмів симетричного блокового шифрування даних в безпровідних технологіях. Шифрування повідомлень на основі симетричного блокового алгоритму AES» Виконав: ст. гр. КБСТ-11 Романишин Р. А. Прийняввикладач: Микитин Г. В. Львів 2021 Мета – ознайомлення з основними характеристиками блокових алгоритмів симетричного шифрування; вивчення основних характеристик і структури алгоритму шифрування AES; програмна реалізація алгоритму AES на рівні шифрування і дешифрування повідомлення в безпровідних технологіях зв’язку. Теоретичні відомості. Порівняльний аналіз характеристик блокових алгоритмів симетричного шифрування. Порівняльний аналіз алгоритмів симетричного блокового шифрування в безпровідних мережах показує, що ефективно забезпечують конфіденційність, цілісність, доступність інформації алгоритми – AES, Kalyna i TWOFISH, оскільки саме їм властивий високий ступінь криптостійкості при великій швидкодії. Для безпечного обміну даних в безпровідних мережах ЦІЗ ВНЗ рекомендується використання такого з’єднання з спеціальним налаштуванням використання алгоритму шифрування AES, адже його переваги, пов'язані з реалізацією: • Rijndael може виконуватися швидше, ніж ранні блокові алгоритми шифрування. Забезпечено оптимізацію між розміром таблиці та швидкістю виконання; • Rijndael можна реалізувати у вигляді коду, використовуючи невелику ОЗП (RAM) і маючи невелику кількість циклів. Виконано оптимізацію розміру ROM і швидкості виконання; • перетворення раунду допускає паралельне виконання, що є важливою перевагою для сучасних багатоядерних процесорів і спеціалізованої апаратури; • алгоритм шифрування не використовує арифметичні операції, тому тип архітектури процесора практично немає значення. Можливості розширення: • розробка дозволяє специфікувати варіанти довжини блока і довжини ключа в діапазоні від 128 до 256 бітів з кроком у 32 біти; • хоча кількість раундів Rijndael зафіксована в цій специфікації, у разі виникнення проблем з безпекою він може модифікуватися і мати таку кількість раундів, як параметр. ІІ. Основні елементи криптографічного захисту повідомлень у безпровідних технологія зв’язку на основі алгоритму AES. Основні елементи криптозахисту наведена на рисунку нижче: При зберіганні інформації При передаванні інформації по каналу зв'язку Рис. 1. Основні елементи криптозахисту. Процедури шифрування (encryption) і розшифрування (decryption) представлена в наступному виді: , . де p і с – відкритий (plaintext) і зашифрований (ciphertext) тексти, і – відповідно ключі шифрування і розшифрування, і – функції шифрування з ключем і розшифрування з ключем відповідно. Для будь-якого відкритого тексту р функція шифрування запишеться: . В процесі шифрування інформація ділиться на блоки величиною від одного до сотень біт. Як правило, потокові шифри оперують з бітами відкритого і закритого текстів, а блокові – з блоками фіксованої довжини. Але головна відмінність між цими двома методами полягає в тому, що у блокових шифрах для шифрування усіх блоків використовується один і той же ключ, а в потокових – для кожного блоку використовується свій ключ тієї ж розмірності. Рис. 2. Класифікація методів шифрування інформації. Перевагами алгоритму AES: • висока ефективність на будь-яких платформах • високий рівень захищеності • реалізація в smart-картах • швидка процедура формування ключа • підтримка паралелізму на рівні інструкцій • підтримка різних довжин ключа з кроком 32 біта Серед недоліків – вразливість до аналізу потужності. Рис. 3. Приклад представлення 128-розрядного блока даних у вигляді масиву State: – байт блока даних; кожний стовпець – одне 32-розрядне слово Відповідність між довжиною ключа, розміром блока даних і числом раундів стандарту AES:
Алгоритм генерування ключів (Key Schedule) Раундові ключі генеруються з ключа шифрування за допомогою алгоритму генерування ключів. Він містить два компоненти: розширення ключа (Key Expansion) і вибір раундового ключа (Round Key Selection). Основні принципи алгоритму: – загальне число бітів раундовых ключів дорівнює довжині блока, помноженій на число раундів, плюс 1 (наприклад, для довжини блока 128 біт і 10 раундів потрібно 1408 біт раундових ключів); – ключ шифрування перетворюється в розширений ключ (Expanded Key); – раундові ключі генеруються з розширеного ключа так: перший раундовий ключ містить перші слів, другий – наступні слів і т. д. Розширення ключа (Key Expansion) Розширений ключ в AES є лінійним масивом з 4-байтових слів, . У алгоритмі масив складається з 4-байтових слів, . Вибір раундового ключа (Round Key Selection) Раундовый ключ вибирається зі слів масиву раундового ключа від до . Схема функції шифрования алгоритму AES наведена на рис. 3.5. Основні особливості алгоритму AES: • нова архітектура “Квадрат”, що забезпечує швидке розсіювання і перемішування інформації, при цьому за один раунд перетворенню піддається весь вхідний блок; • байт-орієнтована структура, зручна для реалізації на 8-розрядних мікроконтролерах; • усі раундові перетворення допускають ефективну апаратну і програмну реалізацію на різних платформах. Рис. 4. Схема функції шифрования алгоритму AES при: довжині ключа, що дорівнює розміру блоку даних Програмна реалізація алгоритму шифрування у безпровідних технологіях на основі мови програмування С# Для програмної реалізації шифрування даних в безпровідних технологіях зв’язку використано мову C# C# створювалася як мова компонентного програмування, і в цьому одне з головних переваг мови, спрямоване на можливість повторного використання створених компонентів. Також серед переваг це строга типізація, що у свою чергу зменшує можливі помилки через неуважність розробників. Обрана мова програмування об’єднує в собі потужність і гнучкість універсальних мов програмування з високою ефективністю виконавчого коду й можливістю безпосереднього доступу до апаратних ресурсів комп’ютера. Блок-схема алгоритму програмної реалізації шифрування AES наведена на рис. 5. Рис. 5. Блок-схема алгоритму програмної реалізації шифрування AES Код програми using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Security.Cryptography; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void textBox1_TextChanged(object sender, EventArgs e) { } //static string aes_key = "AXe8YwuIn1zxt3FPWTZFlAa14EHdPAdN9FaZ9RQWihc="; //static string aes_key1 = 2 static string aes_iv = "bsxnWolsAyO7kCfWuyrnqg=="; private void button1_Click(object sender, EventArgs e) { // Console.Write("Введiть ключ: "); string aes_key = textBox3.Text; string original = textBox1.Text; // Encrypt the string to an array of bytes. //byte[] encrypted = EncryptStringToBytes(original, Convert.FromBase64String(aes_key), Convert.FromBase64String(aes_iv)); // Decrypt the bytes to a string. //string roundtrip = DecryptStringFromBytes(encrypted, Convert.FromBase64String(aes_key), Convert.FromBase64String(aes_iv)); // Encrypt the string to an array of bytes. string str_encrypted = EncryptAES(original, aes_key); // Decrypt the bytes to a string. string str_roundtrip = DecryptAES(str_encrypted, aes_key); //Display the original data and the decrypted data. textBox2.Text = str_encrypted.ToString(); Console.ReadLine(); } private void button2_Click_1(object sender, EventArgs e) { // Console.Write("Введiть ключ: "); string str_encrypted = textBox2.Text; string aes_key = textBox3.Text; // Decrypt the bytes to a string. string str_roundtrip = DecryptAES(str_encrypted, aes_key); //Display the original data and the decrypted data. textBox1.Text = str_roundtrip; Console.ReadLine(); } public static string EncryptAES(string plainText, string aes_key) { byte[] encrypted; using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider()) { aes.Key = Convert.FromBase64String(aes_key); aes.IV = Convert.FromBase64String(aes_iv); aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; ICryptoTransform enc = aes.CreateEncryptor(aes.Key, aes.IV); using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, enc, CryptoStreamMode.Write)) { using (StreamWriter sw = new StreamWriter(cs)) { sw.Write(plainText); } encrypted = ms.ToArray(); } } } return Convert.ToBase64String(encrypted); } public static string DecryptAES(string encryptedText, string aes_key) { string decrypted = null; byte[] cipher = Convert.FromBase64String(encryptedText); using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider()) { aes.Key = Convert.FromBase64String(aes_key); aes.IV = Convert.FromBase64String(aes_iv); aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; ICryptoTransform dec = aes.CreateDecryptor(aes.Key, aes.IV); using (MemoryStream ms = new MemoryStream(cipher)) { using (CryptoStream cs = new CryptoStream(ms, dec, CryptoStreamMode.Read)) { using (StreamReader sr = new StreamReader(cs)) { decrypted = sr.ReadToEnd(); } } } } return decrypted; } static byte[] EncryptStringToBytes(string plainText, byte[] Key, byte[] IV) { // Check arguments. if (plainText == null || plainText.Length <= 0) throw new ArgumentNullException("plainText"); if (Key == null || Key.Length <= 0) throw new ArgumentNullException("Key"); if (IV == null || IV.Length <= 0) throw new ArgumentNullException("Key"); byte[] encrypted; // Create an RijndaelManaged object // with the specified key and IV. using (RijndaelManaged rijAlg = new RijndaelManaged()) { rijAlg.Key = Key; rijAlg.IV = IV; // Create a decrytor to perform the stream transform. ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV); // Create the streams used for encryption. using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { //Write all data to the stream. swEncrypt.Write(plainText); } encrypted = msEncrypt.ToArray(); } } } // Return the encrypted bytes from the memory stream. return encrypted; } static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV) { // Check arguments. if (cipherText == null || cipherText.Length <= 0) throw new ArgumentNullException("cipherText"); if (Key == null || Key.Length <= 0) throw new ArgumentNullException("Key"); if (IV == null || IV.Length <= 0) throw new ArgumentNullException("Key"); // Declare the string used to hold // the decrypted text. string plaintext = null; // Create an RijndaelManaged object // with the specified key and IV. using (RijndaelManaged rijAlg = new RijndaelManaged()) { rijAlg.Key = Key; rijAlg.IV = IV; // Create a decrytor to perform the stream transform. ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV); // Create the streams used for decryption. using (MemoryStream msDecrypt = new MemoryStream(cipherText)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { // Read the decrypted bytes from the decrypting stream // and place them in a string. plaintext = srDecrypt.ReadToEnd(); } } } } return plaintext; } public static string DecryptString(string cipherText, string aes_key) { byte[] iv = new byte[16]; byte[] buffer = Convert.FromBase64String(cipherText); using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes(aes_key); aes.IV = Encoding.UTF8.GetBytes(aes_iv); ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); using (MemoryStream memoryStream = new MemoryStream(buffer)) { using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read)) { using (StreamReader streamReader = new StreamReader((Stream)cryptoStream)) { return Convert.ToString(streamReader); } } } } } } } Рис. 6. Результат роботи програмної реалізації шифрування із різними вхідними даними. Отримана в результаті роботи алгоритму зашифрована інформація дозволить забезпечити достатній рівень безпеки мережі. Висновки Під час виконання лабораторної роботи я ознайомився з алгоритмами симетричного блокового шифрування в безпровідних мережах. Розглянув порівняльну характеристику алгоритмів, включаючи AES, Kalyna i TWOFISH, які забезпечують найвищий рівень конфіденційності, цілісності та доступності інформації. Для побудови програми, що реалізовує алгоритм шифрування та дешифрування AES повідомлення в безпровідних технологіях зв’язку було розглянуто основні характеристики і структури алгоритму. Охарактеризовано мову програмування C# як засіб алгоритмічно-програмної реалізації шифрування в контексті захисту даних в мережі. Створено програмну реалізацію алгоритму шифрування даних на основі AES у мові програмування C#; ключ довжиною 128 біт. |