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


import socket
import json
import re

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

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

def recv_until(marker):
    """Читает данные, пока не встретит маркер."""
    data = b""
    try:
        while marker not in data:
            chunk = s.recv(4096)
            if not chunk:
                break
            data += chunk
    except socket.timeout:
        pass
    return data.decode('utf-8', errors='ignore')

# 1. Получаем сообщение от Алисы
text = recv_until(b"Send to Bob:")
print(f"[*] Получено от Алисы:\n{text}\n")

# 2. Парсим JSON
match = re.search(r'\{.*\}', text)
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} ({p.bit_length()} бит)")
print(f"[*] g = {g}")
print(f"[*] A (Alice) = {A}")

# 3. Генерируем свой ключ
c = 1337  # наш приватный ключ
C = pow(g, c, p)  # наш публичный ключ
print(f"[*] Наш приватный ключ c = {c}")
print(f"[*] Наш публичный ключ C = {C}")

# 4. Отправляем Бобу наш ключ C (подменяем Алису)
# Пробуем разные форматы JSON
formats = [
    ({"C": C}, "C (int)"),
    ({"C": str(C)}, "C (str)"),
    ({"C": hex(C)}, "C (hex)"),
    ({"pub": C}, "pub (int)"),
    ({"key": C}, "key (int)"),
    ({"B": C}, "B (int)"),
]

for payload_dict, label in formats:
    print(f"\n[*] Пробуем формат: {label}")
    # Переподключаемся каждый раз (чистый старт)
    s.close()
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(10.0)
    s.connect((HOST, PORT))
    
    text = recv_until(b"Send to Bob:")
    match = re.search(r'\{.*\}', text)
    if not match:
        continue
    alice = json.loads(match.group())
    p = int(alice['p'], 16)
    g = int(alice['g'], 16)
    
    c = 1337
    C = pow(g, c, p)
    
    payload = json.dumps(payload_dict)
    print(f"    Отправляем: {payload[:80]}...")
    s.sendall((payload + "\n").encode())
    
    # Ждем ответ от Боба
    try:
        resp = s.recv(4096).decode('utf-8', errors='ignore').strip()
        if resp:
            print(f"    [+] ОТВЕТ: {resp[:200]}")
            # Если ответ похож на ключ Боба — мы нашли формат!
            if '0x' in resp or resp.isdigit():
                print(f"\n[!!!] Боб ответил! Формат найден: {label}")
                print(f"[!!!] Ответ: {resp}")
                break
        else:
            print(f"    [-] Пусто")
    except socket.timeout:
        print(f"    [-] Таймаут")

s.close()