Атака на режим CBC при фиксированном IV

Подскажите, пожалуйста, какую атаку можно построить для такой задачи. Есть строка (ее длина не более 5). Строка дополняется до 16 байт нулями, а потом шифруется при помощи CBC. В качестве IV используется текущее время. После шифрования мы можем получить строку: IV+ciphertext. Также есть доступ к оракулу, который шифрует на том же ключе произвольные сообщения. Необходимо расшифровать детерминированно данную строку.


Ответы (2 шт):

Автор решения: Barmaley

По сути речь идет об атаке на 1 блок шифротекста, который путем нехитрых манипуляций превращается в 1 блок (фактически атака на ECB)

Схема атаки шифротекста:

  1. Json -> Base64
  2. Base64 -> CBC_Byte[16]
  3. CBC_Byte[] xor IV[16] -> ECB_Byte[16]

Далее остается только brute force со словарем [0..9], длиной 5, на полученный массив байтов. Количество переборов 10^5 = сто тысяч вариантов. Максимум несколько минут (с учетом сетевых Rest запросов).

→ Ссылка
Автор решения: Fat-Zer

На сколько я понимаю условие:

  • У нас есть блок шифротекста C0 и вектор инициализации IV0 , который использовался при его шифровании в режиме CBC. И нам известно, что открытый текст P0 для C0 состоит из 1—5 ASCII-цифр, дополненных нулями.
  • Также у нас есть оракул, который для произвольного открытого текста Pn возвращает IVn.Cn — сообщение, зашифрованное тем же алгоритмом и тем же ключём что и исходный текст. При этом IVn — это текущее время в секундах, значение, которое мы с высокой долей вероятности можем предугадать.

Идея атаки:

т.к. при режиме CBC схема шифрования первого блока выглядит как:

  • Сn = E(IVn⊕Pn)

то можно в качестве Pn использовать:

  • Pn = IVn⊕Pt⊕IV0

где Pt — это искомый открытый текст, тогда

  • Сn = E(IVn⊕IVn⊕Pt⊕IV0) = E(IV0⊕Pt)

И в случае если Сn = С0, Pt и будет искомым P0.

Т.к. вероятных Pt относительно немного (111 110, с учётом более коротких строк) то можно организовать их полный перебор. Очередной IVn для формирования Pn можно предугадать с высокой долей вероятности, запросив текущее время. Само собой, проверять, действительно ли текст был зашифрован с предсказанным вектором инициализации нужно для каждого значения.

→ Ссылка