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


import socket
import json
import re

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

def try_answer(answer_str, label):
    """Пробует отправить ответ и вернуть реакцию сервера."""
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(5.0)
    try:
        s.connect((HOST, PORT))
        data = b""
        while b"Send to Bob:" not in data:
            chunk = s.recv(4096)
            if not chunk:
                break
            data += chunk
        
        # Отправляем JSON
        payload = json.dumps({"answer": answer_str})
        s.sendall((payload + "\n").encode())
        
        resp = s.recv(4096).decode('utf-8', errors='ignore')
        if resp:
            print(f"[+] УСПЕХ с {label}! Ответ: {resp}")
            return resp
    except Exception as e:
        pass
    finally:
        s.close()
    return None

# Основной цикл
for attempt in range(10):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(10.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)
    if not match:
        s.close()
        continue
    
    alice = json.loads(match.group())
    p_str = alice['p']
    g_str = alice['g']
    A_str = alice['A']
    
    print(f"\n[*] Попытка {attempt+1}")
    print(f"[*] p = {p_str[:50]}...")
    print(f"[*] g = {g_str}")
    print(f"[*] A = {A_str[:50]}...")
    
    # Варианты ответов
    try:
        p_int = int(p_str, 16)
        g_int = int(g_str, 16)
        A_int = int(A_str, 16)
        
        candidates = [
            (str(p_int), "p (dec)"),
            (str(A_int), "A (dec)"),
            (str(A_int ^ g_int), "A XOR g"),
            (str(A_int - g_int), "A - g"),
            (str(A_int % p_int), "A mod p"),
            (p_str, "p (raw)"),
            (A_str, "A (raw)"),
        ]
    except:
        candidates = [
            (p_str, "p (raw)"),
            (A_str, "A (raw)"),
        ]
    
    # Пробуем
    found = False
    for ans, label in candidates:
        s.close()
        resp = try_answer(ans, label)
        if resp:
            found = True
            break
    
    if found:
        break
    
    s.close()

print("\n[*] Готово")