Олимпиада школьников по информатике. Вопрос по криптографии AES-CBC
Вы обнаружили в ящике стола инсайдера жесткий диск, содержащий несколько зашифрованных контейнеров и текстовый файл «пароль.txt».
В файле содержится строка:
RG1zggw0OrqApme9qb+GEPI3Iyx9nzEVBLokN4wONKpnBZ1sjUGl13Ork1ByP4l1
Известно, что сообщение зашифровано при помощи AES-CBC, а 16-ти символьный секретный ключ как-то связан с любимым числом инсайдера. (Я полагаю, что это число 37)
Нам нужно расшифровать строку.
еще не решил? я догадался что ключ-42
Владислав, пес, ключ не 42
Для расшифровки данной строки, закодированной в AES-CBC, нам понадобится:
Ключ (16 символов), связанный с числом 37.
IV (вектор инициализации) – если он не указан, часто используется нулевой или совпадающий с ключом (но это небезопасно). В вашем случае, возможно, его нужно угадать или он также связан с числом 37.
Алгоритм декодирования – строка, скорее всего, закодирована в base64, её нужно сначала декодировать в бинарные данные, а затем расшифровать AES-CBC.
Шаг 1: Генерация ключа на основе числа 37
Возможные варианты:
Ключ – это повторение числа 37 до 16 символов (например, 3737373737373737).
Ключ – это хеш числа 37 (например, MD5 от "37").
Ключ – это число 37 в какой-то кодировке (например, utf-8 или hex).
Попробуем несколько вариантов:
Вариант 1: Ключ = 37373737373737373737373737373737 (32 символа, но AES-128 требует 16 байт)
Нужно преобразовать в байты:
key = bytes.fromhex("37" * 16) # Но это 32 байта, что слишком много.
Не подходит.
Вариант 2: Ключ = "37" * 8 → "3737373737373737" (16 символов)
key = "3737373737373737".encode() # 16 байт
Попробуем этот вариант.
Вариант 3: MD5 от числа 37
import hashlib
key = hashlib.md5(b"37").digest() # 16 байт
Это более вероятный вариант, так как MD5 даёт ровно 16 байт.
Шаг 2: Вектор инициализации (IV)
Если IV не указан, можно попробовать:
Нулевой IV (b"\x00" * 16).
Совпадающий с ключом (но это плохая практика).
Шаг 3: Декодирование base64
Исходная строка:RG1zggw0OrqApme9qb+GEPI3Iyx9nzEVBLokN4wONKpnBZ1sjUGl13Ork1ByP4l1
Декодируем её из base64 в бинарные данные.
Реализация расшифровки (Python)
import base64
from Crypto.Cipher import AES
# Данные
encrypted_data = base64.b64decode("RG1zggw0OrqApme9qb+GEPI3Iyx9nzEVBLokN4wONKpnBZ1sjUGl13Ork1ByP4l1")
# Вариант 1: Ключ = MD5 от "37"
import hashlib
key = hashlib.md5(b"37").digest() # 16 байт
iv = b"\x00" * 16 # Нулевой IV (возможно, нужно угадать)
# Расшифровка AES-CBC
cipher = AES.new (key, AES.MODE_CBC, iv)
decrypted = cipher.decrypt(encrypted_data)
# Удаление дополнения (padding)
padding_length = decrypted[-1]
decrypted = decrypted[:-padding_length]
print("Расшифрованное сообщение:", decrypted.decode())
Возможные проблемы:
Неправильный ключ – если ключ не md5(b"37"), попробуйте другие варианты.
Неправильный IV – если IV не нулевой, возможно, он тоже связан с числом 37.
Неправильное padding – если после расшифровки получается "мусор", возможно, padding обработан неверно.
Альтернативный вариант (если первый не сработал):
# Вариант 2: Ключ = "3737373737373737" (16 символов)
key = b"3737373737373737" # 16 байт
iv = b"3737373737373737" # Возможно, IV совпадает с ключом
cipher = AES.new (key, AES.MODE_CBC, iv)
decrypted = cipher.decrypt(encrypted_data)
print("Расшифрованное сообщение:", decrypted.decode())
Если ни один вариант не сработает, уточните:
Формат ключа (точно ли он связан с 37?).
Вектор инициализации (если он известен).