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