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
@@ -0,0 +1,44 @@
from secrets import randbelow, randbits
from core.prime_utils import is_prime
class ParamGenerator:
"""
Генератор параметров протокола Диффи–Хеллмана.
Возвращает тройку (p, q, g):
- p = 2*q + 1, где p и q простые
- g — корректный генератор для группы по модулю p
"""
@staticmethod
def generate() -> tuple[int, int, int]:
"""
Случайным образом выбирает размерность (кол-во бит) для q,
подбирает безопасное простое p и генератор g.
Возвращает (p, q, g).
"""
# Размер числа выбираем случайно от 8 до 16 бит (от 256 до 65 535)
bits = 8 + randbelow(9)
# Генерация безопасного простого
while True:
q = randbits(bits - 1) | 1 # нечётное число
if not is_prime(q):
continue
p = 2 * q + 1
if not is_prime(p):
continue
# Найдём генератор
g = ParamGenerator._find_generator(p, q)
return p, q, g
@staticmethod
def _find_generator(p: int, q: int) -> int:
"""
Ищет генератор g: минимальное число 2..p-2,
для которого g^q mod p != 1.
"""
for g in range(2, p - 1):
if pow(g, q, p) != 1:
return g
raise ValueError("Не удалось найти генератор для p")