В криптографии кража шифротекста ( CTS ) — это общий метод использования режима работы блочного шифра , который позволяет обрабатывать сообщения, которые не делятся на блоки поровну, не приводя к расширению шифротекста , но за счет небольшого увеличения сложности.
Общая характеристика
Кража шифротекста — это метод шифрования открытого текста с использованием блочного шифра без дополнения сообщения до размера, кратного размеру блока, поэтому размер шифротекста совпадает с размером открытого текста.
Это достигается путем изменения обработки последних двух блоков сообщения. Обработка всех блоков, кроме последних двух, не меняется, но часть шифртекста предпоследнего блока «крадется», чтобы дополнить последний блок открытого текста. Дополненный последний блок затем шифруется как обычно.
Окончательный шифртекст для последних двух блоков состоит из частичного предпоследнего блока (с опущенной «украденной» частью) и полного конечного блока, которые имеют тот же размер, что и исходный открытый текст.
Для расшифровки сначала необходимо расшифровать последний блок, а затем восстановить украденный шифртекст в предпоследнем блоке, который затем можно расшифровать обычным способом.
Кража шифротекста для режима ECB требует, чтобы открытый текст был длиннее одного блока . Возможным решением является использование режима работы блочного шифра, похожего на потоковый шифр , когда длина открытого текста составляет один блок или меньше, например режимы CTR, CFB или OFB.
Кража шифротекста для режима CBC не обязательно требует, чтобы открытый текст был длиннее одного блока . В случае, когда открытый текст имеет длину одного блока или меньше, вектор инициализации (IV) может действовать как предшествующий блок шифротекста. В этом случае получателю должен быть отправлен измененный IV. Это может быть невозможно в ситуациях, когда отправитель не может свободно выбрать IV при отправке шифротекста (например, когда IV является производным или заранее установленным значением), и в этом случае кража шифротекста для режима CBC может происходить только в открытых текстах длиной более одного блока.
Чтобы реализовать шифрование или дешифрование CTS для данных неизвестной длины, реализация должна отложить обработку (и буферизировать) двух последних блоков данных, чтобы их можно было правильно обработать в конце потока данных.
Формат шифротекста
Существует несколько различных способов организовать шифротекст для передачи. Биты шифротекста во всех случаях одинаковы, просто передаются в разном порядке, поэтому выбор не имеет последствий для безопасности; это просто вопрос удобства реализации.
Нумерация здесь взята из Дворкина, который описывает их все. Третья наиболее популярна и описана Дейменом и Шнайером ; Мейер описывает связанную, но несовместимую схему (в отношении порядка битов и использования ключей).
CS1
Вероятно, наиболее очевидным способом организовать шифртекст является передача усеченного предпоследнего блока, за которым следует полный последний блок. Это неудобно для получателя по двум причинам:
Получатель в любом случае должен сначала расшифровать последний блок, и
Это приводит к тому, что конечный блок не выравнивается по естественной границе, что усложняет аппаратную реализацию.
Преимущество этого подхода заключается в том, что если конечный блок открытого текста окажется кратным размеру блока, то шифротекст будет идентичен исходному режиму работы без кражи шифротекста.
CS2
Часто бывает удобнее поменять местами два последних блока шифротекста, так что шифротекст заканчивается полным последним блоком, за которым следует усеченный предпоследний блок. Это приводит к естественно выровненным блокам шифротекста.
Для обеспечения совместимости с режимами без кражи опция CS2 выполняет эту замену только в том случае, если объем украденного шифротекста не равен нулю, т. е. исходное сообщение не было кратно размеру блока.
Это сохраняет естественное выравнивание и совместимость с режимами без кражи, но требует разной обработки случаев выровненного и невыровненного размера сообщения.
CS3
Наиболее популярная альтернатива меняет местами два последних блока шифртекста без каких-либо условий. Этот порядок используется в описаниях ниже.
Описание режима кражи шифротекста
Чтобы зашифровать или расшифровать данные, используйте стандартный режим работы блочного шифрования для всех блоков данных, кроме последних двух.
Следующие шаги описывают, как обрабатывать последние два блока открытого текста, называемые P n −1 и P n , где длина P n −1 равна размеру блока шифра в битах, B ; длина последнего блока, P n , составляет M бит; а K — это используемый ключ. M может находиться в диапазоне от 1 до B , включительно, поэтому P n может быть полным блоком. Описание режима CBC также использует блок зашифрованного текста, непосредственно предшествующий соответствующим блокам, C n −2 , который на самом деле может быть IV, если открытый текст умещается в двух блоках.
Для этого описания используются следующие функции и операторы:
Head (data, a ): возвращает первые a бит строки «data».
Tail (data, a ): возвращает последние a бит строки «data».
Шифрование ( K , данные): использование базового блочного шифра в режиме шифрования строки «данные» с использованием ключа K.
Расшифровать ( K , данные): использовать базовый блочный шифр в режиме расшифровки строки «данные» с использованием ключа K.
XOR : Побитовое исключающее ИЛИ. Эквивалентно побитовому сложению без использования бита переноса.
||: Оператор конкатенации. Объединяет строки по обе стороны от оператора.
0 a : строка из 0 бит.
Кража шифртекста ECB
Кража шифротекста в режиме ECB вносит межблочную зависимость в последние два блока, что приводит к изменению поведения распространения ошибок для последних двух блоков.
Шаги шифрования ECB (см. рисунок)
En −1 = Encrypt ( K , P n −1 ) . Зашифровать P n −1 для создания En −1 . Это эквивалентно поведению стандартного режима ECB.
C n = Head ( En −1 , M ). Выберите первые M бит En −1 для создания C n . Последний блок шифротекста, C n , состоит из ведущих M бит предпоследнего блока шифротекста. Во всех случаях последние два блока отправляются в другом порядке, чем соответствующие блоки открытого текста .
D n = P n || Хвост ( En −1 , B − M ) . Дополнить P n младшими битами из En −1 .
C n −1 = Зашифровать ( K , D n ). Зашифровать D n , чтобы создать C n −1 . Для первых M бит это эквивалентно тому, что произошло бы в режиме ECB (за исключением порядка шифротекста). Для последних B − M бит это второй раз, когда эти данные были зашифрованы с помощью этого ключа (Он уже был зашифрован при создании En −1 на шаге 2 ) .
Шаги расшифровки ECB
D n = Расшифровать ( K , C n −1 ). Расшифровать C n −1 для создания D n . Это отменяет шаг 4 процесса шифрования.
En −1 = C n || Хвост ( D n , B − M ). Дополните C n извлеченным шифротекстом в хвосте D n ( помещенным туда на шаге 3 процесса шифрования ECB).
P n = Head ( D n , M ). Выберите первые M бит D n для создания P n . Как описано в шаге 3 процесса шифрования ECB, первые M бит D n содержат P n . Мы ставим этот последний (возможно, частичный) блок в очередь для окончательного вывода.
P n −1 = Расшифровать ( K , E n −1 ). Расшифровать E n −1 для создания P n −1 . Это отменяет шаг шифрования 1.
Распространение ошибок кражи шифротекста ECB
Ошибка в бите при передаче C n −1 приведет к повреждению P n −1 и P n на уровне всего блока . Ошибка в бите при передаче C n приведет к повреждению P n −1 на уровне всего блока . Это существенное изменение по сравнению с поведением ECB при распространении ошибок.
Кража шифротекста CBC
В CBC уже есть взаимодействие между обработкой различных смежных блоков, поэтому CTS имеет меньшее концептуальное влияние в этом режиме. Распространение ошибок затронуто.
Шаги шифрования CBC
X n −1 = P n −1 XOR C n −2 . Исключающее ИЛИ P n −1 с предыдущим блоком зашифрованного текста C n −2 для создания X n −1 . Это эквивалентно поведению стандартного режима CBC.
En −1 = Encrypt ( K , X n −1 ) . Зашифровать X n −1 для создания En −1 . Это эквивалентно поведению стандартного режима CBC.
C n = Head ( En −1 , M ). Выберите первые M бит En −1 для создания C n . Последний блок шифротекста, C n , состоит из ведущих M бит предпоследнего блока шифротекста. Во всех случаях последние два блока отправляются в другом порядке, чем соответствующие блоки открытого текста .
P = P n || 0 B − M . Дополните P n нулями в конце, чтобы создать P длиной B . Дополнение нулями на этом шаге важно для шага 5.
D n = E n −1 XOR P . Исключающее ИЛИ E n −1 с P для создания D n . Для первых M бит блока это эквивалентно режиму CBC; первые M бит зашифрованного текста предыдущего блока, En −1 , подвергаются операции XOR с M битами открытого текста последнего блока открытого текста. Заполнение нулями P на шаге 4 было важным, поскольку оно делает эффект операции XOR на последние B − M бит эквивалентным копированию последних B − M бит En −1 в конец D n . Это те же самые биты , которые были удалены из En −1 на шаге 3 при создании C n .
C n −1 = Зашифровать ( K , D n ). Зашифровать D n , чтобы создать C n −1 . Для первых M бит это эквивалентно тому, что произошло бы в режиме CBC (за исключением порядка зашифрованного текста). Для последних B − M бит это второй раз, когда эти данные были зашифрованы с помощью этого ключа (Он уже был зашифрован при создании En −1 на шаге 2) .
Шаги расшифровки CBC
D n = Расшифровать ( K , C n −1 ). Расшифровать C n −1 для создания D n . Это отменяет шаг 6 процесса шифрования.
C = C n || 0 B − M . Дополняем C n нулями в конце, чтобы создать блок C длины B . Мы дополняем C n нулями, чтобы помочь на шаге 3.
X n = D n XOR C . Исключающее ИЛИ D n с C для создания X n . Рассматривая первые M бит, этот шаг имеет результат XOR C n (первые M бит процесса шифрования En −1 ) с ( теперь расшифрованной) P n XOR Head ( En −1 , M ) (см. шаги 4-5 процесса шифрования). Другими словами, мы расшифровали CBC первые M бит P n . Рассматривая последние B − M бит, это восстанавливает последние B − M бит En −1 .
P n = Head ( X n , M ). Выбираем первые M бит X n для создания P n . Как описано в шаге 3, первые M бит X n содержат P n . Мы ставим этот последний (возможно, частичный) блок в очередь для окончательного вывода.
En −1 = C n || Хвост ( X n , B − M ). Добавьте хвостовые ( B − M ) биты X n к C n , чтобы создать En −1 . Как описано в шаге 3, En −1 состоит из всего C n ( длиной M бит) , к которому добавлены последние B − M бит X n . Мы собираем En −1 (тот же En −1, который мы видели в процессе шифрования) для обработки на шаге 6 .
X n −1 = Расшифровать ( K , E n −1 ). Расшифровать E n −1 для создания X n −1 . Это отменяет шаг шифрования 2. X n −1 то же самое, что и в процессе шифрования.
P n −1 = X n −1 XOR C n −2 . Исключающее ИЛИ X n −1 с предыдущим блоком зашифрованного текста C n −2 для создания P n −1 . Наконец, мы обращаем шаг XOR с шага 1 процесса шифрования.
Заметки о внедрении CBC
Для кражи шифротекста CBC существует умный (но непрозрачный) метод реализации описанного процесса кражи шифротекста с использованием стандартного интерфейса CBC. Использование этого метода приводит к снижению производительности на этапе расшифровки одной дополнительной операции расшифровки блока по сравнению с тем, что было бы необходимо при использовании специальной реализации.
Кража шифротекста CBC с помощью шифрования с использованием стандартного интерфейса CBC
Дополните последний частичный блок открытого текста нулями.
Зашифруйте весь дополненный открытый текст, используя стандартный режим CBC.
Поменяйте местами два последних блока шифртекста.
Укоротите зашифрованный текст до длины исходного открытого текста.
Расшифровка кражи зашифрованного текста CBC с использованием стандартного интерфейса CBC
D n = Decrypt ( K , C n −1 ). Расшифровать предпоследний блок шифртекста, используя режим ECB.
C n = C n || Хвост ( D n , B − M ). Дополнить шифротекст до ближайшего кратного размеру блока, используя последние B − M бит расшифровки блочного шифра предпоследнего блока шифротекста.
Поменяйте местами два последних блока шифртекста.
Расшифруйте (модифицированный) шифртекст, используя стандартный режим CBC.
Урежьте открытый текст до длины исходного шифртекста.
Распространение ошибок кражи шифротекста CBC
Ошибка в бите при передаче C n −1 приведет к повреждению P n −1 и P n на уровне всего блока . Ошибка в бите при передаче C n приведет к соответствующей ошибке в P n и повреждению P n −1 на уровне всего блока .
Ссылки
Дэмен, Джоан (1995). «2.5.1 и 2.5.2». Разработка шифров и хэш-функций, стратегии, основанные на линейном и дифференциальном криптоанализе (PDF) (кандидатская диссертация). Католический университет Левена.
Шнайер, Брюс (1995). Прикладная криптография (2-е изд.). John Wiley & Sons, Inc. стр. 191, 195. ISBN 978-0-471-12845-8.
Мейер, Карл Х.; Матьяс, Стивен М. (1982). Криптография: новое измерение в безопасности компьютерных данных . John Wiley & Sons, Inc. стр. 77–85. ISBN 978-0-471-04892-3.
Р. Болдуин; Р. Ривест (октябрь 1996 г.). Алгоритмы RC5, RC5-CBC, RC5-CBC-Pad и RC5-CTS. doi : 10.17487/RFC2040 . RFC 2040.
Дворкин, Моррис (октябрь 2011 г.). Рекомендации по режимам работы блочного шифра: три варианта кражи шифртекста для режима CBC (PDF) . Национальный институт стандартов и технологий США (NIST). Приложение к специальной публикации NIST 800-38A.