Введение

В криптографии, метод кражи шифротекста (CTS) — это общий способ применения режима работы блочного шифра, позволяющий обрабатывать сообщения, длина которых не кратна размеру блока, без увеличения объема шифротекста, но с некоторой потерей в простоте реализации.

Формат шифрованного текста

Существует несколько различных способов организации шифротекста для передачи. Биты шифротекста во всех случаях остаются неизменными, меняется лишь порядок их передачи, поэтому выбор не влияет на безопасность; это исключительно вопрос удобства реализации. Нумерация здесь взята из работы Дворкина, который описывает все эти способы. Третий способ является наиболее распространенным и описан Дейменом и Шнайером; Майер описывает смежную, но несовместимую схему (в отношении порядка битов и использования ключей).

CS2

Часто удобнее поменять местами последние два блока шифротекста, чтобы шифротекст заканчивался полным последним блоком, а затем следовал усеченный предпоследний блок. Это обеспечивает естественное выравнивание блоков шифротекста. Для сохранения совместимости с режимами без кражи, опция CS2 выполняет эту перестановку только если объем украденного шифротекста отличен от нуля, то есть исходное сообщение не было кратно размеру блока. Это поддерживает естественное выравнивание и совместимость с режимами без кражи, но требует различной обработки случаев, когда размер сообщения кратен и не кратен размеру блока.

СО3

Самая распространённая альтернатива безусловно меняет местами два последних блока шифротекста. Такой порядок используется в дальнейших описаниях.

Кража шифрованного текста ЕЦБ

Кража шифротекста в режиме ECB создает взаимозависимость между последними двумя блоками, что приводит к изменению характера распространения ошибок в этих блоках.

Шаги шифрования ЕЦБ (см. рисунок)

En-1 = Зашифровать (K, Pn-1). Зашифровать Pn-1 для создания En-1. Это эквивалентно поведению стандартного режима ECB. Cn = Head (En-1, M). Выбрать первые M битов En-1 для создания Cn. Последний блок шифротекста, Cn, состоит из старших M битов предпоследнего блока шифротекста. Во всех случаях последние два блока отправляются в порядке, отличном от порядка соответствующих блоков открытого текста. Dn = Pn || Tail (En-1, B−M). Дополнить Pn младшими битами из En-1. Cn-1 = Зашифровать (K, Dn). Зашифровать Dn для создания Cn-1. Для первых M битов это эквивалентно тому, что произошло бы в режиме ECB (за исключением порядка шифротекста). Для последних B−M битов это второе шифрование этих данных под этим ключом (они уже были зашифрованы при создании En-1 на шаге 2).

Шаги расшифровки ЕЦБ

Dn = Дешифровка (K, Cn−1). Дешифруем Cn-1 для создания Dn. Это отменяет 4-й шаг процесса шифрования. En−1 = Cn || Хвост (Dn, B−M). Дополняем Cn извлеченным шифротекстом из конца Dn (помещенным туда на 3-м шаге процесса шифрования в режиме ECB). Pn = Начало (Dn, M). Выбираем первые M битов Dn для создания Pn. Как описано на 3-м шаге процесса шифрования в режиме ECB, первые M битов Dn содержат Pn. Мы помещаем этот последний (возможно, частичный) блок в очередь для последующего вывода. Pn−1 = Дешифровка (K, En−1). Дешифруем En-1 для создания Pn-1. Это обращает процесс 1-го шага шифрования.

Пропаганда ошибок кражи шифротекста ЕЦБ

Битовая ошибка при передаче Cn−1 приведет к повреждению всего блока как Pn−1, так и Pn. Битовая ошибка при передаче Cn приведет к повреждению всего блока Pn−1. Это существенное отличие от поведения при распространении ошибок в режиме ECB.

Кража шифровального текста

В CBC уже присутствует взаимодействие при обработке соседних блоков, поэтому CTS оказывает меньшее концептуальное влияние в этом режиме. Распространение ошибок подвержено изменениям.

Шаги шифрования CBC

Xn−1 = Pn−1 XOR Cn−2. Выполните операцию XOR над Pn−1 и предыдущим блоком шифротекста Cn−2, чтобы создать Xn−1. Это эквивалентно поведению стандартного режима CBC. En−1 = Зашифровать (K, Xn−1). Зашифруйте Xn−1 для создания En−1. Это эквивалентно поведению стандартного режима CBC. Cn = Head (En−1, M). Выберите первые M битов En−1 для создания Cn. Последний блок шифротекста Cn состоит из первых M битов предпоследнего блока шифротекста. Во всех случаях последние два блока отправляются в порядке, отличном от порядка соответствующих блоков открытого текста. P = Pn || 0B−M. Дополните Pn нулями в конце, чтобы получить P длиной B. Нулевое дополнение на этом шаге важно для шага 5. Dn = En−1 XOR P. Выполните операцию XOR над En−1 и P, чтобы создать Dn. Для первых M битов блока это эквивалентно режиму CBC; первые M битов шифротекста предыдущего блока En−1 выполняют XOR с M битами открытого текста последнего блока открытого текста. Нулевое дополнение P на шаге 4 было важно, поскольку это делает эффект операции XOR на последние B−M битов эквивалентным копированию последних B−M битов En−1 в конец Dn. Это те же биты, которые были удалены из En−1 на шаге 3 при создании Cn. Cn−1 = Зашифровать (K, Dn). Зашифруйте Dn, чтобы создать Cn−1. Для первых M битов это эквивалентно тому, что произошло бы в режиме CBC (за исключением порядка шифротекста). Для последних B−M битов это второй раз, когда эти данные зашифрованы под этим ключом (они уже были зашифрованы при создании En−1 на шаге 2).

Шаги расшифровки CBC

Dn = Дешифровка (K, Cn−1). Расшифруем Cn-1 для создания Dn. Это отменяет шаг 6 процесса шифрования. C = Cn || 0B−M. Дополним Cn нулями в конце до блока C длиной B. Мы дополняем Cn нулями, чтобы помочь на шаге 3. Xn = Dn XOR C. Выполним операцию XOR над Dn и C, чтобы создать Xn. Рассматривая первые M битов, этот шаг эквивалентен операции XOR над Cn (первые M битов En−1 из процесса шифрования) с (теперь расшифрованным) Pn XOR Head (En−1, M) (см. шаги 4 и 5 процесса шифрования). Иными словами, мы CBC-расшифровали первые M битов Pn. Рассматривая последние B−M битов, мы восстанавливаем последние B−M битов En−1. Pn = Head (Xn, M). Выделим первые M битов Xn для создания Pn. Как описано в шаге 3, первые M битов Xn содержат Pn. Мы помещаем этот последний (возможно, частичный) блок в очередь для последующего вывода. En−1 = Cn || Tail (Xn, B−M). Присоединим последние (B−M) битов Xn к Cn, чтобы создать En−1. Как описано в шаге 3, En−1 состоит из всех битов Cn (длиной M) и последних B−M битов Xn. Мы восстанавливаем En−1 (тот же En−1, что и в процессе шифрования) для обработки на шаге 6. Xn−1 = Дешифровка (K, En−1). Расшифруем En−1 для создания Xn−1. Это обратное действие шагу 2 шифрования. Xn−1 совпадает с Xn−1 в процессе шифрования. Pn−1 = Xn−1 XOR Cn−2. Выполним операцию XOR над Xn−1 и предыдущим блоком шифротекста Cn−2, чтобы создать Pn−1. Наконец, мы выполняем обратную операцию XOR из шага 1 процесса шифрования.

Примечания по применению СБК

Для кражи шифротекста в режиме CBC существует элегантный (но сложный для понимания) способ реализации описанного процесса кражи шифротекста, использующий стандартный интерфейс CBC. Применение этого способа приводит к снижению производительности на этапе расшифрования из-за выполнения одной дополнительной операции расшифровки блока по сравнению с выделенной реализацией.

CBC шифровая шифровка с использованием стандартного интерфейса CBC

Дополните последний неполный блок открытого текста нулями. Зашифруйте весь дополненный открытый текст в стандартном режиме CBC. Поменяйте местами последние два блока зашифрованного текста. Усеките зашифрованный текст до длины исходного открытого текста.

CBC шифровая кража текста расшифровки с использованием стандартного интерфейса CBC

Dn = Дешифровать (K, Cn−1). Дешифровать предпоследний блок шифротекста в режиме ECB. Cn = Cn || Tail (Dn, B−M). Дополнить шифротекст до ближайшего кратного размера блока, используя последние B−M бит дешифрования предпоследнего блока шифротекста. Поменять местами последние два блока шифротекста. Дешифровать (модифицированный) шифротекст, используя стандартный режим CBC. Усечь открытый текст до длины исходного шифротекста.

Пропаганда ошибки воровства шифровального текста CBC

Битовая ошибка при передаче Cn−1 приведет к повреждению всего блока как Pn−1, так и Pn. Битовая ошибка при передаче Cn приведет к соответствующей битовой ошибке в Pn и к повреждению всего блока Pn−1.