Скачиваний:
0
Добавлен:
31.10.2025
Размер:
2.06 Кб
Скачать
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()
Соседние файлы в папке Лабораторная 3