Initial commit
This commit is contained in:
@@ -0,0 +1 @@
|
||||
#
|
||||
@@ -0,0 +1,19 @@
|
||||
from secrets import randbelow
|
||||
from .public_params import PublicParams
|
||||
|
||||
|
||||
class Participant:
|
||||
"""
|
||||
Участник протокола (Алиса или Боб).
|
||||
Держит свой секрет, публикует g^secret mod p,
|
||||
умеет вычислять общий ключ.
|
||||
"""
|
||||
|
||||
def __init__(self, params: PublicParams, secret: int | None = None):
|
||||
self.params = params
|
||||
self.secret = secret if secret is not None else (2 + randbelow(9998))
|
||||
self.public_value = pow(self.params.generator,
|
||||
self.secret, self.params.prime_modulus)
|
||||
|
||||
def compute_shared_key(self, other_public: int) -> int:
|
||||
return pow(other_public, self.secret, self.params.prime_modulus)
|
||||
@@ -0,0 +1,12 @@
|
||||
def is_prime(n: int) -> bool:
|
||||
"""Проверка на простоту"""
|
||||
if n < 2:
|
||||
return False
|
||||
if n % 2 == 0:
|
||||
return n == 2
|
||||
d = 3
|
||||
while d * d <= n:
|
||||
if n % d == 0:
|
||||
return False
|
||||
d += 2
|
||||
return True
|
||||
@@ -0,0 +1,30 @@
|
||||
from dataclasses import dataclass
|
||||
from .prime_utils import is_prime
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class PublicParams:
|
||||
"""
|
||||
Публичные параметры протокола:
|
||||
- prime_modulus: простое число p
|
||||
- generator: порождающий элемент g
|
||||
"""
|
||||
prime_modulus: int
|
||||
generator: int
|
||||
|
||||
def __post_init__(self):
|
||||
p = self.prime_modulus
|
||||
g = self.generator
|
||||
|
||||
# Проверка простоты модуля
|
||||
if not is_prime(p):
|
||||
raise ValueError(f"prime_modulus={p} не является простым числом")
|
||||
|
||||
# Проверка допустимости генератора
|
||||
if g <= 1 or g >= p - 1:
|
||||
raise ValueError(
|
||||
f"generator={g} вне допустимого диапазона (2..p-2)")
|
||||
|
||||
# Проверка, что генератор не сворачивается в малую подгруппу
|
||||
if pow(g, (p - 1) // 2, p) == 1:
|
||||
raise ValueError(f"generator={g} не является корректным для p={p}")
|
||||
Reference in New Issue
Block a user