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


import socket
import json
import re

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

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(20.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')
print(f"[*] Получено:\n{text}\n")

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

# Переводим A в байты
A_bytes = A.to_bytes((A.bit_length() + 7) // 8, 'big')
print(f"[*] Длина A: {len(A_bytes)} байт")

# Разбиваем на блоки по 16 байт
print("\n[*] Разбиваем A на блоки по 16 байт...")
for i in range(0, len(A_bytes), 16):
    block = A_bytes[i:i+16]
    print(f"\n[*] Блок {i//16 + 1}: {block.hex()}")
    
    # Пробуем XOR с g
    for name, key in [('g', g), ('p', p)]:
        # Берем младшие 16 байт ключа
        key_bytes = key.to_bytes((key.bit_length() + 7) // 8, 'big')
        if len(key_bytes) >= 16:
            key_block = key_bytes[-16:]
        else:
            key_block = key_bytes.ljust(16, b'\0')
        
        xored = bytes(a ^ b for a, b in zip(block, key_block))
        printable = ''.join(c if c.isprintable() else '.' for c in xored.decode('utf-8', errors='ignore'))
        if any(c.isdigit() or c in '+-*/' for c in printable):
            print(f"    [+] XOR с {name}: {printable}")
    
    # Пробуем XOR с маленькими числами
    for k in range(1, 256):
        xored = bytes(a ^ k for a in block)
        printable = ''.join(c if c.isprintable() else '.' for c in xored.decode('utf-8', errors='ignore'))
        if any(c.isdigit() or c in '+-*/' for c in printable):
            print(f"    [+] XOR с {k}: {printable}")
            break  # Показываем только первое совпадение

s.close()