Top.Mail.Ru
Ответы

Олимпиада школьников по информатике. Вопрос по криптографии AES-CBC

Вы обнаружили в ящике стола инсайдера жесткий диск, содержащий несколько зашифрованных контейнеров и текстовый файл «пароль.txt».

В файле содержится строка:

RG1zggw0OrqApme9qb+GEPI3Iyx9nzEVBLokN4wONKpnBZ1sjUGl13Ork1ByP4l1

Известно, что сообщение зашифровано при помощи AES-CBC, а 16-ти символьный секретный ключ как-то связан с любимым числом инсайдера. (Я полагаю, что это число 37)
Нам нужно расшифровать строку.

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок
1мес

еще не решил? я догадался что ключ-42

Аватар пользователя
Знаток
1мес

Владислав, пес, ключ не 42

Аватар пользователя
Мастер
1мес

Для расшифровки данной строки, закодированной в 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?).
Вектор инициализации (если он известен).