Кратко: нужен перебор seed — времени в формате ЧЧММ. Для каждого варианта строится та же гамма, что и в encrypt.py, и делается XOR с secret.bin. Правильный seed даст читаемый флаг вида vsosh{...}.
import random
from pathlib import Path
def keystream(seed, n):
r = random.Random(seed)
return bytes(r.randrange(256) for _ in range(n))
def xor(data, key):
return bytes(a ^ b for a, b in zip(data, key))
blob = Path("secret.bin").read_bytes()
for h in range(24):
for m in range(60):
seed = h * 100 + m # именно так работает int("ЧЧММ")
msg = xor(blob, keystream(seed, len(blob)))
try:
text = msg.decode("utf-8")
except UnicodeDecodeError:
continue
if text.isprintable():
print(f"seed = {h:02d}{m:02d}")
print(text)
Почему это работает:
random.Random(seed)при одинаковом seed всегда выдаёт одну и ту же последовательность.- XOR обратим:
\[ (m \oplus k)\oplus k = m. \] - Время
ЧЧММдаёт всего \(24 \cdot 60 = 1440\) вариантов — их легко перебрать. - Ведущий ноль исчезает из-за
int(...), поэтому09:05превращается в905, а в коде это9*100+5.
Запустите скрипт в одной папке с secret.bin; он выведет seed и исходное сообщение.
По фотографии точный флаг восстановить нельзя: последнее изображение — искажённое отображение двоичного файла, одного неверно прочитанного байта уже достаточно для ошибки. Можете прикрепить сам secret.bin или прислать hex-дамп его байтов?
