Загрузка данных


import socket
import json
import re
import math

HOST = 'tasks.duckerz.ru'
PORT = 30009

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(15.0)
s.connect((HOST, PORT))

data = b""
try:
    while b"Send to Bob:" not in data:
        chunk = s.recv(4096)
        if not chunk:
            break
        data += chunk
except socket.timeout:
    pass

text = data.decode('utf-8', errors='ignore')
match = re.search(r'\{.*\}', text)
alice = json.loads(match.group())

p = int(alice['p'], 16)
g = int(alice['g'], 16)
A = int(alice['A'], 16)

print(f"[*] p = {p} ({p.bit_length()} бит)")
print(f"[*] g = {g}")

# Пробуем факторизовать p-1
print("[*] Факторизуем p-1...")
n = p - 1
factors = []
temp = n

# Перебор маленьких делителей
for i in range(2, 1000000):
    while temp % i == 0:
        factors.append(i)
        temp //= i
    if i % 100000 == 0:
        print(f"[*] Проверено до {i}...")

if temp > 1:
    factors.append(temp)
    print(f"[!] Остаток: {temp} ({temp.bit_length()} бит)")

print(f"[*] Множители p-1: {factors[:20]}...")
print(f"[*] Всего множителей: {len(factors)}")

# Если p-1 гладкое, можно применить Pohlig-Hellman
# Проверяем, все ли множители маленькие
max_factor = max(factors)
print(f"[*] Максимальный множитель: {max_factor} ({max_factor.bit_length()} бит)")

if max_factor < 10**12:
    print("[+] p-1 гладкое! Можно применить Pohlig-Hellman!")
else:
    print("[-] p-1 не гладкое. Нужен другой подход.")

s.close()