import os
from Crypto.Util.strxor import strxor
def read_file(filepath):
with open(filepath, 'rb') as f:
return f.read()
def write_file(filepath, content):
with open(filepath, 'wb') as f:
f.write(content)
def decrypt(hex_string, key_size):
# 1. Превращаем hex-строку обратно в байты
encrypted_data = bytes.fromhex(hex_string)
# 2. Вспоминаем логику шифрования:
# Исходные данные были раздуты в key_size раз.
# Значит, размер оригинального файла = len(encrypted_data) // key_size
original_length = len(encrypted_data) // key_size
# 3. Берем только первый блок зашифрованных данных длиной original_length.
# Так как данные повторялись, этого блока достаточно для восстановления.
# (Ключ при шифровании тоже повторялся, поэтому для первого блока он уникален и достаточен)
first_block = encrypted_data[:original_length]
# 4. Нам нужен ключ. Мы не знаем его, но знаем, что он повторялся.
# Ключ — это первые key_size байт от расширенного ключа.
# Но чтобы расшифровать XOR, нам нужно просто повторить ключ до длины блока.
# Проблема в том, что мы не знаем сам ключ.
# НО! Мы можем восстановить его, если знаем хотя бы часть исходного текста
# (атака "known plaintext").
# Если же мы не знаем текст, нам придется перебирать key_size от 12 до 44
# и смотреть на результат.
# Для данного скрипта мы предполагаем, что вы знаете key_size.
# Если нет — нужно перебирать.
# Чтобы расшифровать, нам нужно применить XOR с ключом.
# Но так как мы не знаем ключ, этот скрипт не сработает "в лоб" без перебора.
# Однако, если мы знаем, что это был текст (например, английский или русский),
# мы можем перебирать key_size и смотреть на читаемость.
print(f"Длина зашифрованных данных: {len(encrypted_data)} байт")
print(f"Предполагаемая длина ключа: {key_size}")
print(f"Предполагаемая длина исходного файла: {original_length} байт")
# ВАЖНО: Без знания ключа мы не можем расшифровать XOR.
# Но мы можем попробовать перебрать key_size и вывести результат.
# Если вы знаете, что в исходном файле был, например, текст "Hello",
# то можно вычислить ключ: key = encrypted[:5] XOR "Hello".
return first_block # Это просто зашифрованный блок
if __name__ == "__main__":
# Читаем зашифрованный файл (он в hex)
hex_content = read_file('output.txt').decode('utf-8')
# ВАМ НУЖНО ЗНАТЬ ИЛИ ПОДОБРАТЬ ЭТО ЧИСЛО
# Попробуйте разные значения от 12 до 44.
# Например, если исходный файл был маленьким, ключ мог быть любым.
# Если файл был большим, ключ, скорее всего, 12-20.
KEY_SIZE = 12 # <--- ИЗМЕНИТЕ ЭТО ЗНАЧЕНИЕ
# Пытаемся расшифровать
# (На самом деле, для полной расшифровки нужен сам ключ,
# но мы можем попробовать восстановить его, если знаем начало текста)
encrypted_bytes = bytes.fromhex(hex_content)
original_length = len(encrypted_bytes) // KEY_SIZE
# Берем первый блок
first_block = encrypted_bytes[:original_length]
print(f"Первый блок (hex): {first_block.hex()}")
print("Чтобы расшифровать, нужно знать ключ. Попробуйте перебрать KEY_SIZE.")
# Если вы знаете, что в начале файла был, например, текст "flag{",
# вы можете вычислить ключ:
# known_text = b"flag{"
# key_part = strxor(first_block[:len(known_text)], known_text)
# print(f"Восстановленный ключ: {key_part.hex()}")