Вы находитесь на странице: 1из 9

MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII

AL REPUBLICII MOLDOVA
Universitatea Tehnică a Moldovei
Facultatea Calculatoare, Informatică și Microelectronică
Departamentul Informatică și Ingineria Sistemelor

Disciplina: Tehnolosii ale securitatii informationale

Отчёт
Для лабораторной работы 4

Тема: Алгоритм шифрования RSA и


алгоритм Diffie-Hellman

Выполнил: ст. гр. IA-214 Bahrin Ion

Проверил: Струна Вадим

Chișinău – 2023
Содержание
1. Этапы работы.................................................................................3 - 5
2. Шифр RSAи его результаты.........................................................3 - 4
3. Алгоритм Diffie-Hellman ……......................................................5
4. Вывод……………………………………………………………..6
5. Вебография……………………………………………………….7

2
Этапы работы:
Алгоритм шифрования RSA:
Выбираем два простых числа p = 3 и q = 7.

Вычисляем их произведение n = p * q = 21. Это число будет использоваться для


шифрования и расшифровки сообщений.

Вычисляем значение функции Эйлера от числа n: phi(n) = (p-1) * (q-1) = 12.

Выбираем случайное число e = 5 такое, что 1 < e < phi(n) и e взаимно простое с
phi(n).

Находим число d = 5, обратное числу e по модулю phi(n), то есть такое число d, что
(d * e) mod phi(n) = 1.

Таким образом, открытый ключ (e, n) будет равен (5, 21), а закрытый ключ d = 5.

Допустим, мы хотим зашифровать сообщение m = 9. Для этого мы преобразуем его


в число, меньшее чем n, то есть m = 9 mod 21 = 9. Затем мы вычисляем c = m^e mod
n = 9^5 mod 21 = 3 и отправляем полученное число c = 3 в зашифрованном виде.

Для расшифровки сообщения мы используем закрытый ключ d = 5. Полученное


зашифрованное число c = 3 мы возводим в степень d по модулю n: m = c^d mod n =
3^5 mod 21 = 9. Полученное число m = 9 является исходным сообщением.

import random

# функция для проверки, является ли число простым


def is_prime(n):
if n <= 1:
return False
elif n <= 3:
return True
elif n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True

# функция для нахождения наибольшего общего делителя двух чисел


def gcd(a, b):
if b == 0:
3
return a
else:
return gcd(b, a % b)

# функция для нахождения обратного элемента в кольце по модулю


def mod_inverse(a, m):
m0 = m
y = 0
x = 1

if m == 1:
return 0

while a > 1:
q = a // m
t = m

m = a % m
a = t
t = y

y = x - q * y
x = t

if x < 0:
x = x + m0

return x

# функция для генерации ключей


def generate_keys(p, q):
if not (is_prime(p) and is_prime(q)):
raise ValueError("Оба числа должны быть простыми.")
elif p == q:
raise ValueError("p и q не должны быть равны.")

n = p * q

phi = (p - 1) * (q - 1)

# выбираем случайное целое число e такое, что 1 < e < phi и


e и phi взаимно просты
e = random.randrange(1, phi)

g = gcd(e, phi)
while g != 1:
e = random.randrange(1, phi)
g = gcd(e, phi)

# вычисляем закрытый ключ d, обратный к e по модулю phi


d = mod_inverse(e, phi)

# возвращаем открытый и закрытый ключи


4
return ((e, n), (d, n))

# функция для шифрования сообщения


def encrypt(message, public_key):
e, n = public_key
cipher = [pow(ord(char), e, n) for char in message]
return cipher

# функция для дешифрования сообщения


def decrypt(cipher, private_key):
d, n = private_key
message = [chr(pow(char, d, n)) for char in cipher]
return ''.join(message)

# генерируем ключи
p = 17
q = 19
public_key, private_key = generate_keys(p, q)

# шифруем сообщение
message = "My name is Anton, nice to meet you!"
cipher = encrypt(message, public_key)

# дешифруем сообщение
decrypted_message = decrypt(cipher, private_key)

# выводим результаты
print("Открытый ключ:", public_key)
print("Закрытый ключ:", private_key)
print("Исходное сообщение:", message)
print("Зашифрованное сообщение:", cipher)
print("Расшифрованное сообщение:", decrypted_message)

Результат программы:

5
6
Алгоритм Diffie-Hellman:
import math

def modPow(a, b, p):


return pow(a, b, p)

p = int(input("Введите число p: "))


g = int(input("Введите число g: "))
a = int(input("Введите число a: "))

A = modPow(g, a, p)

b = int(input("Введите число b: "))

B = modPow(g, b, p)

secretKeyA = modPow(B, a, p)
secretKeyB = modPow(A, b, p)

print("Общий секретный ключ: " + str(secretKeyA))

Результаты программы:

7
Выводы:
RSA и Diffie-Hellman - это два важных алгоритма, которые играют важную роль в
современной криптографии. Оба алгоритма используются для шифрования данных, и они
были разработаны в разное время, но имеют много общего.
RSA - это асимметричный алгоритм, который использует пару ключей для шифрования и
расшифрования сообщений. Этот алгоритм был разработан Ривестом, Шамиром и
Адлеманом в 1977 году. RSA используется во многих приложениях, таких как
электронная почта, виртуальная частная сеть (VPN) и онлайн-банкинг.
Diffie-Hellman - это также асимметричный алгоритм, который используется для обмена
ключами. Он был разработан Уитфилдом Диффи и Мартином Хеллманом в 1976 году.
Diffie-Hellman используется в многих приложениях, таких как SSL/TLS, VPN и SSH.
Оба алгоритма играют важную роль в безопасности интернет-коммуникаций. RSA
используется для шифрования данных, а Diffie-Hellman - для обмена ключами. Вместе они
обеспечивают конфиденциальность, целостность и аутентификацию данных.
Однако, существует некоторые уязвимости в использовании RSA и Diffie-Hellman.
Например, атака по времени, уязвимость к атакам маленькими ключами и атаки на
протоколы обмена ключами.

8
Библиография
https://ru.wikipedia.org/wiki/Протокол_Диффи_—_Хеллмана
https://ru.wikipedia.org/wiki/RSA
https://else.fcim.utm.md/pluginfile.php/87383/mod_resource/content/0/SI_lab4.pdf

Вам также может понравиться