Initial commit

This commit is contained in:
user
2026-07-12 14:06:45 +04:00
commit a75028d68f
148 changed files with 3275 additions and 0 deletions
+1
View File
@@ -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}")