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