You are on page 1of 10

Міністерство освіти та науки України

Харківський національний університет радіоелектроніки


Кафедра Безпеки інформаційних технологій

Звіт з лабораторної роботи №2


з дисципліни
«Математичні методи моделювання та оптимізації процесів кібербезпеки»

Виконав: Перевірив:
ст. гр. БІКСм-23-2 Руженцев В.І.
Колесников Д.

2023
Завдання: дослідити можливості криптоаналізу простого криптоперетворення з
використанням нейронних мереж.
Хід роботи:

Для виконання завдання реалізуємо алгоритм криптоперетворення, для цього


візьмемо випадкову таблицю підстановок та раундовий ключ.
Функція для генерації(cipher_text) наведена в лістингу програми

Приклад роботи функції cipher_text та функції number_to_8_bits_array:

chipher_text – бере вхідне число від 0 до 255 (8 біт) та повертає перетворене


число, використовуючи раундовий ключа та масив підстановок, згідно наданому
алгоритму.

А функція number_to_8_bits_array повертає представлення числа у бінарному


вигляді (8 біт), де кожен біт знаходиться у окремій ділянці масиву (листа у
пайтон).

Реалізуємо набори даних для тренування та тестування. Використаємо


бібліотеку numpy для зручності роботи з масивами, та функцію train_test_split з
бібліотеки sklearn для швидкого розбиття датасету на тренувальний та тестовий.
Рисунок 3 — стоверний датасет та код створення

Рисунок 4 — розмір створеного датасету

Датасет створювався шляхом перебору всіх значень від 0 до 255 (включно) та


перетворення цих чисел функцією chipher_text та number_to_8_bits_array
(для створення вихідних даних), та number_to_8_bits_array для створення
вхідних у нейронну мережу даних.

Створений датасет розбито на 230 тренувальних та 26 тестових значень (в


цілому 256 чисел)

Для навчання використаємо бібліотеку для машинного навчання TensorFlow.


Рисунок 5 – результат побудови моделі

Модель має:

 8 вхідних (тобто 8 елементів масиву, який відображає в кожному


елементі біт числа) шарів
 512 скритих шарів, де кожен шар з’єднано з кожним вхідним та
вихідним
 8 вихідних (тобто 8 елементів масиву числа шифротексту, який
відображає в кожному елементі біт числа) шарів.
Рисунок 6 – навчання моделі

Як можна бачити з рисунку, модель навчалась з оптимізатором Адам з


learning_rate=0.015 (його було підібрано експериментально), розмір вибірки –
50, та кількість епох – 15 також відібрані в ході експерименту, щоб отримати
задовільну точність.

Метрика для оцінки точності – MSE (mean squared error), визначається за

формулою , тобто береться середньоквадратичне значення між


різницею істинних та вгаданих моделлю виходів мережі.

У ході тренування були обрані також інші параметри моделі, проте вони
видавали погану точність, або приводили до «заучування» моделлю паттернів
(наприклад, якщо взяти занадто багато шарів мережі, вона не буде вчитися, а
просто запам’ятає всі дані на вході та виході, бо в неї вистачає ресурсів на це).

Перевірка точності

Окрім точності під час тренування, потрібно перевірити модель на тестовій


виборці, яку модель не бачила під час тренування.

Рисунок - візуалізація роботи на одному елементі тестової вибірки

Як видно з рисунку вище, модель видала результат масив з елементами,


де чим більше елемент, тим більша вірогідність, що там повинна стояти 1 в
реальному масиві (що проілюстровано на рисунку). Якщо в виданому елементі
0 чи значення достатньо мале (в нашому випадку візьмемо менше 0.5), тоді це
значення вважається нулем.

Рисунок 7 – перевірка точності моделі на всій тестовій виборці

На тестовій таким же чином відбувалася перевірка моделі за методом


MSE. Результат показав, що похибка моделі є 0.0071, тобто менше 1 відсотка (це
значення через те, що не відбувалося округлення).
Висновок: на цій лабаторній ми побудували багатошарову нейронну
мережу яка показала можливість криптоаналізу простого криптографічного
перетворення.

Лістінг Коду:

import numpy as np

import tensorflow as tf

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import OneHotEncoder

def cipher_text(message):

s_box_l = []

s_box_r = []

left = message[:4]

right = message[4:]

left_result = s_box_l[left[0]] ^ s_box_l[left[1]]

right_result = s_box_r[right[0]] ^ s_box_r[right[1]]

result = [left_result, right_result]


result = [result[i] ^ 0x0F for i in range(2)]

result = result[5:] + result[:5]

return result

def number_to_8_bits_array(number):

return [int(bit) for bit in format(number, '08b')]

data_size = 1000

input_data = np.random.rand(data_size, 8)

output_data = np.array([cipher_text(number_to_8_bits_array(int(x * 255))) for


x in input_data])

x_train, x_test, y_train, y_test = train_test_split(input_data, output_data,


test_size=0.2, random_state=42)

# Створення та компіляція моделі нейронної мережі з використанням


TensorFlow

model = tf.keras.Sequential([
tf.keras.layers.Dense(5, activation='sigmoid', input_shape=(8,)),

tf.keras.layers.Dense(8, activation='sigmoid')

])

model.compile(optimizer='adam',loss='mean_squared_error',
metrics=['accuracy'])

# Тренування моделі

model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2)

# Оцінка точності моделі на тестовому наборі

accuracy = model.evaluate(x_test, y_test)[1]

print(accuracy)

You might also like