51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
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
|