Ім'я файлу: Романишин Р. Лаб. 4-5.docx
Розширення: docx
Розмір: 888кб.
Дата: 14.12.2021
скачати

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА

кафедра ЗІ



ЗВІТ

до лабораторної роботи № 4-5

з дисципліни: «Безпека технологій зв’язку»

на тему: «Порівняльний аналіз алгоритмів симетричного блокового шифрування даних в безпровідних технологіях. Шифрування повідомлень на основі симетричного блокового алгоритму AES»
Виконав: ст. гр. КБСТ-11

Романишин Р. А.

Прийняввикладач: Микитин Г. В.

Львів 2021

Мета ознайомлення з основними характеристиками блокових алгоритмів симетричного шифрування; вивчення основних характеристик і структури алгоритму шифрування AES; програмна реалізація алгоритму AES на рівні шифрування і дешифрування повідомлення в безпровідних технологіях зв’язку.

  1. Теоретичні відомості.

  1. Порівняльний аналіз характеристик блокових алгоритмів симетричного шифрування.





Порівняльний аналіз алгоритмів симетричного блокового шифрування в безпровідних мережах показує, що ефективно забезпечують конфіденційність, цілісність, доступність інформації алгоритми – 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:

Стандарт

(довжина ключа)

(розмір блоку даних)

(число раундів)

AES-128

10

12

14

AES-192

12

12

14

AES-256

14

14

14

Алгоритм генерування ключів (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 при:

довжині ключа, що дорівнює розміру блоку даних


  1. Програмна реалізація алгоритму шифрування у безпровідних технологіях на основі мови програмування С#

Для програмної реалізації шифрування даних в безпровідних технологіях зв’язку використано мову 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 біт.
скачати

© Усі права захищені
написати до нас