import pytest from core.private_key import PrivateKey from core.prime_number import PrimeNumber def test_encrypt_decrypt_cycle(): """Проверка: сообщение после encrypt → decrypt восстанавливается""" p1 = PrimeNumber.from_value(61) p2 = PrimeNumber.from_value(53) priv = PrivateKey(p1, p2) pub = priv.make_public_key() messages = [1, 2, 42, 123, priv.n - 1] for m in messages: c = pub.encrypt(m) m_back = priv.decrypt(c) assert m == m_back def test_e_is_prime_and_coprime_with_phi(): """e должно быть простым и взаимно простым с φ(n)""" p1 = PrimeNumber.from_value(61) p2 = PrimeNumber.from_value(53) priv = PrivateKey(p1, p2) assert isinstance(priv.e, PrimeNumber) assert (priv.e.value > 1) assert (priv.phi % priv.e.value != 0) def test_d_is_inverse_of_e_mod_phi(): """e*d ≡ 1 (mod φ(n))""" p1 = PrimeNumber.from_value(61) p2 = PrimeNumber.from_value(53) priv = PrivateKey(p1, p2) assert (priv.e.value * priv.d) % priv.phi == 1 def test_decrypt_invalid_inputs(): """Должны бросаться ошибки при неверных входных данных""" p1 = PrimeNumber.from_value(61) p2 = PrimeNumber.from_value(53) priv = PrivateKey(p1, p2) with pytest.raises(ValueError): priv.decrypt(-5) with pytest.raises(ValueError): priv.decrypt("not a number") # type: ignore