import socket
import json
import re
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import hashlib
HOST = 'tasks.duckerz.ru'
PORT = 30009
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(15.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)
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)}")
# Пробуем разные ключи
candidates = {
'g': g,
'p': p,
'A': A,
'g^p': g ^ p,
'hash(g)': int(hashlib.sha256(str(g).encode()).hexdigest(), 16),
'hash(p)': int(hashlib.sha256(str(p).encode()).hexdigest(), 16),
'hash(A)': int(hashlib.sha256(str(A).encode()).hexdigest(), 16),
}
# Для AES нужен ключ 16/24/32 байта
for name, key_int in candidates.items():
print(f"\n[*] Пробуем ключ: {name}")
# Преобразуем ключ в байты (разные длины)
for key_len in [16, 24, 32]:
try:
# Берем первые key_len байт от ключа
key_bytes = key_int.to_bytes((key_int.bit_length() + 7) // 8, 'big')
if len(key_bytes) < key_len:
key_bytes = key_bytes.ljust(key_len, b'\0')
else:
key_bytes = key_bytes[:key_len]
# Пробуем расшифровать A как AES-CBC (первые 16 байт - IV)
if len(A_bytes) > 16:
iv = A_bytes[:16]
ciphertext = A_bytes[16:]
# Дополняем до кратности 16
if len(ciphertext) % 16 != 0:
continue
cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
try:
decrypted = unpad(cipher.decrypt(ciphertext), 16)
decoded = decrypted.decode('utf-8', errors='ignore')
printable = ''.join(c if c.isprintable() else '.' for c in decoded)
print(f" AES-CBC (key_len={key_len}): {printable[:200]}")
except:
pass
# Пробуем AES-ECB
cipher = AES.new(key_bytes, AES.MODE_ECB)
try:
# Для ECB длина должна быть кратна 16
if len(A_bytes) % 16 == 0:
decrypted = unpad(cipher.decrypt(A_bytes), 16)
decoded = decrypted.decode('utf-8', errors='ignore')
printable = ''.join(c if c.isprintable() else '.' for c in decoded)
print(f" AES-ECB (key_len={key_len}): {printable[:200]}")
except:
pass
except:
pass
s.close()