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


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))

# Читаем
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:
    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 = {A}")

# Пробуем разные ключи для XOR
keys = {
    'g': g,
    'p': p,
    'g^p': g ^ p,
    'g+p': g + p,
    'g*p': g * p,
    'p-g': p - g,
    'p//g': p // g,
    'A-g': A - g,
    'A^g': A ^ g,
    'A+p': A + p,
    'A-p': A - p,
}

print("\n[*] Пробуем XOR с разными ключами...")
for name, key in keys.items():
    decrypted = A ^ key
    # Переводим в байты
    try:
        b = decrypted.to_bytes((decrypted.bit_length() + 7) // 8, 'big')
        decoded = b.decode('utf-8', errors='ignore')
        # Проверяем, есть ли читаемый текст
        printable = ''.join(c if c.isprintable() else '.' for c in decoded)
        if any(c.isdigit() or c in '+-*/' for c in decoded):
            print(f"[+] Ключ '{name}': {printable[:200]}")
    except:
        pass

# Пробуем XOR с (A - key)
print("\n[*] Пробуем (A - key) XOR...")
for name, key in keys.items():
    decrypted = (A - key) ^ key
    try:
        b = decrypted.to_bytes((decrypted.bit_length() + 7) // 8, 'big')
        decoded = b.decode('utf-8', errors='ignore')
        printable = ''.join(c if c.isprintable() else '.' for c in decoded)
        if any(c.isdigit() or c in '+-*/' for c in decoded):
            print(f"[+] Ключ '{name}': {printable[:200]}")
    except:
        pass

s.close()