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


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