112
сторона может получить полное описание измененного шифртекста. Хотя атаки
такого типа разрешены Определением 3.33, не очень понятно, являются ли они ре-
альной проблемой на практике. Здесь мы покажем атаку с выбором шифртекста на
естественную и используемую повсеместно шифровальную схему. Более того, эта
атака лишь требует от атакующей стороны способности определять, правильно или
нет расшифрован измененный шифртекст. Эту информацию
часто легко получить,
так как, например, сервер может запросить повторную передачу или прервать се-
анс, если он получает шифртекст, дешифруемый неправильно, и оба этих события
произведут заметные изменения в наблюдаемом потоке информации. Было про-
демонстрировано, что эта атака работает на практике на различных используемых
протоколах. Мы приведем один конкретный пример в конце этого раздела.
Как ранее упоминалось, при использовании режима СШВ,
длина открытого тек-
ста должна быть кратной длине блока. Если открытый текст не удовлетворяет это
условие, он должен быть дополнен перед шифрованием. Мы будем называть ис-
ходный открытый текст сообщением, а полученный результат после дополнения
закодированными данными. Используемая схема дополнения должна позволять
получателю однозначно определить, где находится конец закодированных данных.
Одним из популярных и стандартных методов является использование дополнения
PKCS #5. Предположим, что исходное сообщение содержит целой число байтов, и
пусть L обозначает длину блока (в байтах) используемого блочного шифра. Пусть
b обозначает число байтов, который должны быть добавлены к сообщению, чтобы
общая длина закодированных данных стала кратной длине блока. Здесь, b больше
или равно 1 и меньше или равно L. (b не может быть равно 0, так как это приведет
к неоднозначному дополнению. Так, если длина сообщения кратна длине блока,
добавляются L байтов дополнения.) Затем, мы добавляем к сообщению последо-
вательность, содержащую число b (представленное в 1 байте или 2 шестнадцате-
ричных числах), повторенное b раз. То есть, если необходим 1 байт дополнения,
то добавляется последовательность 0x01 (в шестнадцатеричной системе); если не-
обходимо 4 байта дополнения, то добавляется шестнадцатеричная последователь-
ность 0x04040404, и так далее. Закодированные данные затем шифруются с помо-
щью обычного шифрования в режиме СШВ.
При расшифровке, получатель сначала применяет расшифровку в режиме
СШВ для получения закодированных данных, а затем проверяет, правильно ли
они дополнены. (Это делается легко: нужно просто прочитать значение b послед-
него байта, а затем удостовериться, что последние b байтов полученного результа-
та все имеют значение b.) Если это так, то дополнение удаляется и возвращается
исходное сообщение. В противном случае, стандартной процедурой является воз-
вращение ошибки «плохое дополнение» (например, в Java стандартное исклю-
чение называется
javax.crypto.BadPaddingException ). Наличие такого сообще-
113
ния об ошибке дает противнике часть оракула дешифровки. То есть, противник
может послать серверу любой шифртекст и узнать (на основе того, получил ли
он ошибку о «плохом дополнении» или нет), правильным ли образом дополнены
исходные закодированнные данные. Хотя это может показаться бесполезной ин-
формацией, мы покажем, что она позволяет противнику полностью восстановить
исходное сообщение для любого выбранного шифртекста.
Для простоты, опишем атаку а трехблочный шифртекст. Пусть IV, c1, c2 — наблю-
даемый атакующей стороной шифртекст, и пусть m1, m2 — исходные закодирован-
ные данные (неизвестные атакующему), соответствующие дополненному сообще-
нию, как обсуждалось выше. (Каждый блок имеет длину L байтов.) Заметим, что
m2 = Fk −1(c2) ⊕ c1, (3.15)
где k — это ключ (что, конечно, неизвесто атакующему), используемый честны-
ми участниками. Второй блок m2
заканчивается на
где
0xb обозначает однобайтную репрезентацию числа b. Ключевое свойство, исполь-
зуемое при этой атаке, заключается в том, что определенные изменения в шифр-
тексте приводят к предсказуемым изменениям в исходных закодированных данных
после расшифровки в режиме СШВ. А именно, пусть1 идентично c1 за исключе-
нием изменения в последнем байте. Рассмотрим расшифровку измененного шифр-
текста IV, cr , c2. Ее результатом будут закодированные данные mr , mr , где mr = F
−1(c2) ⊕ cr . Сравнивая с Уравнением (3.15), мы видим, что mr будет идентично m2
за исключением изменения в последнем байте. (Значение mr непредсказуемо, но
это не повредит атаке.) Аналогично, если if cr равно c1 за исключением изменения
в его i-м байте, то расшифровка IV, cr , c2 даст mr , mr , где mr равно m2 за ис-
ключением изменения в его i-м байте.
Более обобщенно, если cr= c1 ⊕ ∆ для лю-
бой последовательности ∆, то расшифровка IV, cr , c2 дает mr , mr , где mr = m2 ⊕ ∆.
Таким образом, атакующая сторона имеет значительный контроль над по-
следним блоком закодированных данных.
Для тренировки посмотрим, как противник может это использовать, чтобы узнать b
— количество дополнения. (Это укажет на длину исходного сообщения.) Напомним,
что после расшифровки, получатель смотрит на значение b последнего байта второго
блока закодированных данных, и затем проверяет, что все последние b байтов имеют
одно и то же значение. Атакующий сначала изменяет первый байт из c1 и посылает
полученный шифртекст IV, cr , c2 получателю. Если расшифровка неудачна (т.е.
получатель возвращает ошибку), то это значит, что получатель проверяет все L байтов
из mr , и следовательно b = L! В противном случае, атакующий узнает, что b < L, и
может повторить этот процесс со вторым байтом, и так далее. Крайний слева байт,
для которого расшифровка была неудачной, точно указывает на крайний слева байт,
114
проверяемый
получателем, то есть фактически указывает на b.
Зная b , атакующий может узнать все байты сообщения один за другим. Про-
иллюстрируем эту идею для последнего байта сообщения, который мы обо-
значим B. Атакующий знает, что m2 заканчивается на 0xB0xb • • • 0xb (с 0xb
повторяющимся b раз), и хочет узнать B. Определим
для 0 ≤ i < 28; т.е., последние b + 1 байтов из ∆i содержат число i (представленного
в шестнадцатеричной системе), и затем значение (b + 1) ⊕ b (в шестнадцатеричной
системе) повторяющееся b раз. Если атакующий посылает IV, c1 ⊕ ∆i, c2 получателю,
то после расшифровки в режиме СШВ полученные закодированные данные будут
равны 0x(B ⊕ i)0x(b + 1) • • • 0x(b + 1) (с 0x(b + 1) повторяющимся b раз). Расшифровка
будет неудачной, если не выполняется 0x(B ⊕ i) = 0x(b + 1). Атакующий всего лишь
должен попробовать максимум 28 значений ∆0, . . . , ∆28 пока расшифровка не будет
удачной для некоторого ∆i, и в этот момент он может сделать вывод, что B = 0x(b + 1)
⊕
i. Мы предоставим полное описания того, как расширить эту атаку, чтобы узнать
весь открытый текст, а
не только последний блок, в качестве упражнения.
Достарыңызбен бөлісу: