Министерство науки и высшего образования Российской Федерации
Федеральное государственное автономное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
АССИМЕТРИЧНЫЕ ШИФРЫ
Отчет по лабораторной работе №3
по дисциплине «Методы и средства криптографической защиты информации»
Студент гр. 712-2
_______Л.С. Болтушкин
«__» __________2025 г.
Руководитель
Преподаватель
кафедры КИБЭВС
______ ______ В.А. Полюга
«__» __________2025 г.
Томск 2025
Введение
Целью данной лабораторной работы является реализация алгоритмов RSA, ранцевой криптосистемы, криптосистемы Эль-Гамаля при помощи знакомого языка программирования; реализовать алгоритмы быстрого возведения в степень и тест Ферма при помощи знакомого языка программирования.
1 Ход работы
На рисунке 1.1 представлен код реализации алгоритм RSA и результат работы.
Листинг программы представлен в Приложении А.
Рисунок 1.1 – Реализация алгоритма RSA
Ниже представлен код реализации алгоритма криптосистемы Эль-Гамаля, на рисунке 1.2 представлен результат работы программы.
Листинг программы представлен в Приложении Б.
Рисунок 1.2 – Реализация алгоритма Эль-Гамаля
Ниже представлен код реализации алгоритма ранцевой криптосистемы, на рисунке 1.3 представлен результат работы программы.
Листинг программы представлен в Приложении В.
Рисунок 1.3 – Реализация ранцевой криптосистемы
Ниже представлен код реализации теста Ферма, на рисунке 1.4 представлен результат работы программы.
Листинг программы представлен в Приложении Г.
Рисунок 1.4 – Реализация теста Ферма
Также был решен тренажер на быстрое возведение в степень по модулю, код реализации алгоритма и успешный результат работы представлен на рисунке 1.5.
Листинг программы представлен в Приложении Д.
Рисунок 1.5 – Реализация кода на быстрое возведение в степень по модулю
На рисунке 1.6 представлено успешное выполнение тренажера.
Рисунок 1.6 – Тренажер
Заключение
В ходе выполнения данной лабораторной работы были изучены и реализованы основные криптографические алгоритмы: RSA, ранцевая криптосистема и криптосистема Эль-Гамаля. Также была реализована функция быстрого возведения в степень по модулю и проведён тест Ферма программными средствами. Полученные результаты продемонстрировали практическую применимость теоретических основ криптографии. Реализация алгоритмов на языке программирования позволила глубже понять процессы генерации ключей, шифрования и расшифрования информации, а также особенности работы с большими простыми числами и модульной арифметикой. Все алгоритмы успешно отработали заданные входные данные, что подтверждает корректность их реализации.
Приложение а
(обязательное)
Листинг программы алгоритма RSA
import random
from sympy import isprime, mod_inverse
# Генерация большого простого числа больше 10^5
def generate_prime(lower_bound=10 ** 5):
while True:
candidate = random.randint(lower_bound, lower_bound * 10)
if isprime(candidate):
return candidate
# Функция для шифрования
def do_encrypt(message, public_exponent, modulus):
return pow(message, public_exponent, modulus)
# Функция для расшифровки
def do_decrypt(ciphertext, private_exponent, modulus):
return pow(ciphertext, private_exponent, modulus)
def rsa_simulation():
plaintext = int(input("Введите сообщение для шифрования (целое число меньше модуля): "))
first_prime = generate_prime()
second_prime = generate_prime()
while first_prime == second_prime:
second_prime = generate_prime()
modulus = first_prime * second_prime
phi_n = (first_prime - 1) * (second_prime - 1)
public_exponent = 65537 # часто используемое значение
while phi_n % public_exponent == 0:
public_exponent = random.randrange(2, phi_n)
# Расчёт закрытого ключа
private_exponent = mod_inverse(public_exponent, phi_n)
print(f"p = {first_prime}, q = {second_prime}")
print(f"n = {modulus}, e = {public_exponent}, d = {private_exponent}")
if plaintext >= modulus:
print("Сообщение слишком большое для шифрования этим ключом. Повторите с меньшим числом.")
return
ciphertext = do_encrypt(plaintext, public_exponent, modulus)
print(f"Зашифрованное сообщение: {ciphertext}")
decrypted_plaintext = do_decrypt(ciphertext, private_exponent, modulus)
print(f"Расшифрованное сообщение: {decrypted_plaintext}")
if __name__ == "__main__":
rsa_simulation()
