Добавил:
ne_lenya
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная 3 / rsa
.pyimport 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()
Соседние файлы в папке Лабораторная 3
