Заимствование шифротекста (англ. ciphertext stealing, CTS) в криптографии — общий метод использования блочного режима шифрования, позволяющий обрабатывать сообщения произвольной длины за счет незначительного увеличения сложности реализации. В отличии от дополнения, получившийся шифротекст не становится кратным размеру блока используемого шифра, а остается равным длине исходного открытого текста.[1]
Идея, лежащая в основе метода заимствования шифротекста, не нова. Ещё в 1982 году был предложен алгоритм обработки открытого текста произвольной длины в режиме обратной связи по шифротексту (CBC)[2], названный впоследствии CBC-CSX, который активно использовался с начала 1980-х годов в архитектуре IMB CUSP (Cryptographic Unit Support Program). В 2012 году был показано, что данный способ уязвим к простой атаке на основе выбранного открытого текста.[3]
В 2010 году Национальный институт стандартов и технологий (NIST) выпустил документ, в котором были описаны 3 варианта использования метода заимствования вместе с CBC режимом шифрования.[1] Они названы CBC-CS1, CBC-CS2 и CBC-CS3 и отличаются друг от друга лишь способом упорядочивания бит шифротекста. Режим CBC-CS2 был известен и раньше[4], как и режим CBC-CS3 — указанный в комментариях к протоколу Kerberos 5[5]
В рекомендации NIST SP800-38A[6] указано, что одним из ограничений на использование блочных режимов шифрования является необходимость иметь блок открытого текста, совпадающий по длине с блоком используемого шифра. Для решения данной проблемы можно использовать метод дополнения шифротекста. Однако в этом случае длина зашифрованного текста по сравнению с исходным сообщением увеличивается на количество использованных для дополнения до кратности блоку шифра бит.
Заимствование шифротекста не имеет подобного недостатка благодаря изменению метода обработки последних двух блоков сообщения.[5] Обработка всех блоков, кроме двух последних, остается неизменной, но часть предпоследнего блока шифротекста «заимствуется» для дополнения последнего. Дополненный последний блок затем шифруется как обычный. Итоговый шифротекст для двух последних блоков состоит из части предпоследнего блока (с опущенной «заимствованной» частью) и полного последнего блока.
Для расшифрования требуется сначала расшифровать последний блок, а затем вернуть «заимствованный» шифротекст в предпоследний блок, который затем можно расшифровать как обычно.
В принципе, можно использовать любой режим блочного шифрования[7], но режимы работающие как потоковые шифры уже можно применить к сообщениям произвольной длины без необходимости дополнения, поэтому они не извлекают пользы из этого метода. Популярные режимы использующие заимствование шифротекста — режим электронной кодовой книги (англ. Electronic Codebook, ECB) и режим обратной связи по шифротексту (англ. Cipher Block Chaining, CBC).[5]
Использование метода заимствования шифротекста для ECB режима требует, что бы открытый текст был длиннее, чем один блок[5]. Возможным решением является использование блочных режимов шифрования со свойствами потоковых шифров (streamcipher-like) (например CTR, CFB или OFB) либо метода дополнения[7] в ситуациях, когда размер открытого текста равен одному блоку или меньше.
Использование метода заимствования шифротекста в режиме CBC не накладывает обязательного условия на то, что бы открытый текст был длиннее, чем один блок[8]. В случае, когда текст меньше или равен размеру блока, вектор инициализации[en] (IV) может выступать в качестве предшествующего блока шифротекста. В таком случае изменённый IV должен также быть отправлен получателю. Данный подход может оказаться невозможным в ситуациях, когда IV не может быть свободно выбран отправителем вместе с переданным шифротекстом[8] (например, вектор инициализации вычисляется по номеру сектора жёсткого диска, по отметке времени или является зафиксированным значением), тогда заимствование шифротекста для CBC-режима может происходить только для открытых текстов длины более одного блока.
Самым простым способом упорядочить шифротекст является передача сначала укороченного предпоследнего, а затем полного последнего блока. Недостатки такого подхода заключаются в следующем:
Преимущество же состоит в том, что если последний блок открытого текста оказывается кратен размеру блока шифра, шифротекст идентичен тому, что получается в обычном режиме работы без заимствования.
Удобнее поменять местами два последних блока, так что шифротекст заканчивается полным последним блоком, следом за которым идет неполный предпоследний. В результате зашифрованные блоки получаются выровнены, что упрощает работу с ними.[1]
Для обеспечения совместимости с режимами без заимствования, вариант CS2 выполняет эту перестановку только если количество заимствованного шифротекста отличается от нуля, то есть когда размер исходного сообщения не был кратен размеру блока.[1]
Недостатком является необходимость различной обработки блоков для случаев выровненных и не выровненных сообщений.
Данный вариант всегда меняет местами два последних блока шифротекста, без каких-либо условий. Именно он используется в дальнейших описаниях.
Для шифрования и расшифрования на всех блоках, кроме двух последних, используется стандартный режим работы блочного шифра.
Следующие шаги описывают, как обращаться с последними блоками открытого текста[7], обозначаемыми и , где длина равна размеру блока шифра в битах , а длина последнего блока — бит; - используемый для шифрования ключ. лежит в диапазоне от 1 до включительно, поэтому теоретически может быть полным блоком. Описание принципа работы CBC режима также использует блок шифротекста , предшествующий рассматриваемым. В случае, если открытый текст умещается всего в двух блоках, то вместо можно взять вектор инициализации ( ).
В описании используются следующие функции и операторы:
Ошибка в одном бите при передаче его по каналу связи приведет к полному повреждению блоков и . Ошибка в одном бите полностью повредит блок . Это значительное изменение по сравнению со стандартным распространением ошибок при шифровании в режиме ECB, когда при ошибке в блоке шифротекста повреждается только соответствующий блок открытого текста.[8]
В режиме CBC уже существует взаимодействие при обработке различных смежных блоков, поэтому заимствование шифротекста имеет меньшее концептуальное влияние.[3] Ошибка в одном бите при передаче его по каналу связи приведет к полному повреждению блоков и . Ошибка в одном бите изменит соответствующий бит и полностью повредит .
В 2010 году было показано, что режим CBC-CSX не является надежным.[3]
Пример атаки на различение сообщений[9] с использованием выбранного открытого текста:
Для режимов CBC-CS1-3 была показана их надежность, при выполнении следующих условий:[3]
Метод заимствования шифротекста применяется во многих современных системах шифрования и расшифрования диков. Например 27 января 2010 года NIST опубликовал финальную версию публикации 800-38E,[10] которая рекомендует использовать режим XTS-AES (XEX-based tweaked-codebook mode with ciphertext stealing and AES cipher), стандартизованный IEEE в 2007 году[11], в криптографических модулях. Данный режим используется для посекторного шифрования дисков или файлов, и считается самым безопасным способом хранить данные.[11]
Он поддерживается большинством современных приложений, такими как BestCrypt[12], Botan, dm-crypt, FreeOTFE, TrueCrypt, VeraCrypt[13], DiskCryptor[14], Mac OS X Lion’s FileVault 2 и Windows 10’s BitLocker.[15]
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .