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


import socket
import json
import re

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

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

# 1. Читаем сообщение от Алисы
data = s.recv(4096).decode('utf-8').strip()
print(f"[*] Получено: {data[:100]}...")

# 2. Парсим JSON
match = re.search(r'\{.*\}', data)
if not match:
    print("[-] Не удалось найти JSON")
    exit()

alice = json.loads(match.group())
p = int(alice['p'], 16)
g = int(alice['g'], 16)
A = int(alice['A'], 16)

print(f"[*] p = {p}")
print(f"[*] g = {g}")
print(f"[*] A = {A}")

# 3. Проверяем, насколько большое p
print(f"[*] Размер p: {p.bit_length()} бит")

# 4. Пробуем найти x перебором (если p маленькое)
# Если p большое, это займет вечность, но попробуем до 10^7
print("[*] Ищем x (дискретный логарифм)...")
found_x = None
limit = 10_000_000  # 10 миллионов итераций максимум

for x in range(1, limit):
    if pow(g, x, p) == A:
        found_x = x
        print(f"[+] НАЙДЕНО! x = {x}")
        break
    
    # Прогресс каждые 1 млн
    if x % 1_000_000 == 0:
        print(f"[*] Проверено {x}...")

if found_x is None:
    print("[-] x не найден в пределах лимита. p слишком большое.")
    # Попробуем другой подход: возможно, A - это просто число
    print("[*] Попробуем отправить A как ответ...")
    s.sendall((str(A) + "\n").encode())
else:
    # 5. Отправляем найденный x
    print(f"[*] Отправляем x = {found_x}")
    s.sendall((str(found_x) + "\n").encode())

# 6. Читаем ответ (флаг)
try:
    resp = s.recv(4096).decode('utf-8').strip()
    print(f"[+] Ответ: {resp}")
    
    # Может быть несколько строк
    while True:
        try:
            more = s.recv(4096).decode('utf-8').strip()
            if not more:
                break
            print(f"[+] Еще: {more}")
        except socket.timeout:
            break
except socket.timeout:
    print("[-] Таймаут при чтении ответа")

s.close()