Введение
Криптографический алгоритм
В криптографии режим работы блочного шифра — это алгоритм, использующий блочный шифр для обеспечения информационной безопасности, такой как конфиденциальность или аутентичность. Сам по себе блочный шифр подходит только для безопасного криптографического преобразования (шифрования или дешифрования) одной группы битов фиксированной длины, называемой блоком. Режим работы описывает, как многократно применять операцию шифрования одного блока для безопасного преобразования объемов данных, превышающих размер блока. Большинство режимов требуют уникальную двоичную последовательность, часто называемую вектором инициализации (IV), для каждой операции шифрования. IV должен быть не повторяющимся, а для некоторых режимов также и случайным. Вектор инициализации используется для обеспечения того, чтобы даже при многократном независимом шифровании одного и того же открытого текста одним и тем же ключом генерировались различные шифротексты. Блочные шифры могут поддерживать работу с несколькими размерами блока, но в процессе преобразования размер блока всегда фиксирован. Режимы работы блочного шифра оперируют целыми блоками и требуют, чтобы последний фрагмент данных был дополнен до полного блока, если он меньше текущего размера блока.
История и стандартизация
Самые ранние режимы работы, ECB, CBC, OFB и CFB (см. ниже), датируются 1981 годом и были определены в FIPS 81, DES Modes of Operation. В 2001 году Национальный институт стандартов и технологий США (NIST) пересмотрел свой список одобренных режимов работы, включив AES как блочный шифр и добавив режим CTR в SP800 38A, Recommendation for Block Cipher Modes of Operation. В январе 2010 года NIST добавил XTS AES в SP800 38E, Recommendation for Block Cipher Modes of Operation: The XTS AES Mode for Confidentiality on Storage Devices. Существуют и другие режимы конфиденциальности, которые не были одобрены NIST. Например, CTS – это режим кражи шифротекста и он доступен во многих популярных криптографических библиотеках. Блочные режимы шифрования ECB, CBC, OFB, CFB, CTR и XTS обеспечивают конфиденциальность, но не защищают от случайного изменения или злонамеренного вмешательства. Изменение или вмешательство можно обнаружить с помощью отдельного кода аутентификации сообщения, такого как CBC MAC, или цифровой подписи. Криптографическое сообщество признало необходимость специальных гарантий целостности, и NIST отреагировал, предложив HMAC, CMAC и GMAC. HMAC был одобрен в 2002 году как FIPS 198, The Keyed Hash Message Authentication Code (HMAC), CMAC был опубликован в 2005 году в SP800 38B, Recommendation for Block Cipher Modes of Operation: The CMAC Mode for Authentication, а GMAC был формализован в 2007 году в SP800 38D, Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC. Криптографическое сообщество отметило, что комбинирование режима конфиденциальности с режимом аутентификации может быть сложным и чреватым ошибками. Поэтому они стали предлагать режимы, объединяющие конфиденциальность и целостность данных в единый криптографический примитив (алгоритм шифрования). Эти объединенные режимы называются аутентифицированным шифрованием, AE или "аутенк". Примеры режимов AE: CCM (SP800 38C), GCM (SP800 38D), CWC, EAX, IAPM и OCB. Режимы работы определяются рядом национальных и международных органов по стандартизации. К заметным организациям по стандартизации относятся NIST и ISO (с ISO/IEC 10116). Это связано с тем, что оба режима эффективно создают битовый поток, который складывается по модулю 2 (XOR) с открытым текстом, и этот поток зависит только от ключа и IV. В режиме CBC IV должен быть непредсказуемым (случайным или псевдослучайным) во время шифрования; в частности, (ранее) распространенная практика повторного использования последнего блока шифротекста сообщения в качестве IV для следующего сообщения является небезопасной (например, этот метод использовался в SSL 2.0). Если злоумышленник знает IV (или предыдущий блок шифротекста) до указания следующего открытого текста, он может проверить свои предположения об открытом тексте какого-либо блока, который был зашифрован тем же ключом ранее (это известно как атака TLS CBC IV). Для некоторых ключей вектор инициализации, состоящий из нулей, может привести к тому, что некоторые режимы блочного шифрования (CFB 8, OFB 8) перейдут в заблокированное состояние, где внутреннее состояние будет равно нулю. Для CFB 8, нулевой IV и нулевой открытый текст приводят к тому, что 1/256 ключей не генерируют шифрование, и открытый текст возвращается как шифротекст. Для OFB 8 использование нулевого вектора инициализации не приведет к шифрованию для 1/256 ключей. Шифрование OFB 8 возвращает открытый текст в незашифрованном виде для затронутых ключей. Некоторые режимы (такие как AES SIV и AES GCM SIV) разработаны для повышения устойчивости к неправильному использованию nonce, то есть к сценариям, в которых генерация случайных чисел неисправна или находится под контролем злоумышленника. Синтетические векторы инициализации (SIV) синтезируют внутренний IV, выполняя построение псевдослучайной функции (PRF), называемое S2V, на входе (дополнительные данные и открытый текст), предотвращая прямое управление IV внешними данными. Внешние nonce/IV могут быть переданы в S2V в качестве дополнительного поля данных. AES GCM SIV синтезируют внутренний IV, выполняя режим аутентификации POLYVAL Galois на входе (дополнительные данные и открытый текст), а затем выполняя операцию AES.
Наполнители
Блок-шифр работает с единицами фиксированного размера (известными как размер блока), но сообщения могут быть различной длины. Поэтому в некоторых режимах (в частности, ECB и CBC) требуется дополнение последнего блока перед шифрованием. Существует несколько схем дополнения. Самый простой способ – добавить нулевые байты к открытому тексту, чтобы его длина стала кратной размеру блока, но необходимо обеспечить возможность восстановления исходной длины открытого текста; это тривиально, например, если открытый текст является строкой в стиле C, не содержащей нулевых байтов, кроме завершающего. Немного сложнее оригинальный метод DES, который заключается в добавлении одного бита, за которым следует достаточное количество нулевых битов для заполнения блока; если сообщение заканчивается на границе блока, добавляется целый блок дополнения. Наиболее сложными являются схемы, специфичные для CBC, такие как кража шифротекста или завершение остаточного блока, которые не приводят к увеличению объема шифротекста, но требуют некоторой дополнительной сложности. Шнайер и Фергюсон предлагают два простых варианта: добавить байт со значением 128 (hex 80), за которым следует столько нулевых байтов, сколько необходимо для заполнения последнего блока, или заполнить последний блок n байтами, каждый из которых имеет значение n.
Режимы CFB, OFB и CTR не требуют специальных мер для обработки сообщений, длина которых не кратна размеру блока, поскольку эти режимы работают путем применения операции XOR к открытому тексту и выходным данным блочного шифра. Последний неполный блок открытого текста применяется операция XOR к первым нескольким байтам последнего блока ключевого потока, в результате чего получается конечный блок шифротекста того же размера, что и последний неполный блок открытого текста. Эта характеристика потоковых шифров делает их подходящими для приложений, требующих, чтобы размер зашифрованных данных шифротекста совпадал с размером исходных данных открытого текста, а также для приложений, передающих данные в потоковом режиме, где добавление байтов дополнения неудобно.
Режимы аутентификации шифрования с дополнительными данными (AEAD)
Разработан ряд режимов работы, объединяющих конфиденциальность и аутентификацию в едином криптографическом примитиве. Примерами таких режимов являются , , режим с учетом целостности и возможностью параллелизации (IAPM), OCB, EAX, CWC, CCM и GCM. Режимы аутентифицированного шифрования классифицируются как однопроходные или двупроходные. Некоторые алгоритмы аутентифицированного шифрования с одним проходом, такие как режим OCB, защищены патентами, в то время как другие были специально разработаны и опубликованы таким образом, чтобы избежать патентных ограничений. Кроме того, некоторые режимы также позволяют аутентифицировать нешифрованные связанные данные, и они называются схемами AEAD (аутентифицированное шифрование с дополнительными данными). Например, режим EAX является двупроходной схемой AEAD, а режим OCB – однопроходной.
Галуа/счетчик (GCM)
Режим Galois/counter (GCM) сочетает в себе хорошо известный счётный режим шифрования с новым режимом аутентификации Galois. Ключевой особенностью является простота параллельного вычисления умножения в поле Галуа, используемого для аутентификации. Эта особенность обеспечивает более высокую пропускную способность, чем у алгоритмов шифрования. GCM определён для блочных шифров с размером блока 128 бит. Код аутентификации сообщений Galois (GMAC) является вариантом GCM, предназначенным только для аутентификации, и может формировать инкрементный код аутентификации сообщений. И GCM, и GMAC могут принимать векторы инициализации произвольной длины. GCM может в полной мере использовать преимущества параллельной обработки, а реализация GCM может эффективно использовать конвейер инструкций или аппаратный конвейер. Режим работы CBC приводит к остановкам конвейера, снижающим его эффективность и производительность. Как и в CTR, блоки нумеруются последовательно, затем этот номер блока объединяется с вектором инициализации (IV) и шифруется блочным шифром E, обычно AES. Результат этого шифрования затем складывается по модулю 2 (XOR) с открытым текстом для получения шифротекста. Как и все счётные режимы, это по сути потоковый шифр, поэтому важно использовать разные векторы инициализации для каждого шифруемого потока. Блоки шифротекста рассматриваются как коэффициенты полинома, который затем вычисляется в точке H, зависящей от ключа, с использованием арифметики конечного поля. Результат затем шифруется, создавая тег аутентификации, который можно использовать для проверки целостности данных. Зашифрованный текст затем содержит вектор инициализации, шифротекст и тег аутентификации.
Счетчик с шифрованием кода аутентификации сообщений (CCM)
Код аутентификации сообщений с использованием счётчика и шифрования блоками (counter with CBC MAC; CCM) — это алгоритм аутентифицированного шифрования, разработанный для обеспечения как аутентификации, так и конфиденциальности. Режим CCM определён только для блочных шифров с длиной блока 128 бит.
AES-GCM-SIV
AES GCM SIV – это режим работы для стандарта шифрования Advanced Encryption Standard, обеспечивающий производительность, сопоставимую с режимом Galois/counter, а также устойчивость к ошибкам при повторном использовании криптографического одноразового номера (nonce). Описание конструкции приведено в RFC 8452. AES GCM SIV самостоятельно генерирует внутренний IV. Он вычисляет хеш от дополнительных данных для аутентификации и открытого текста, используя хеш-функцию POLYVAL Galois. Затем этот хеш шифруется ключом AES и используется как тег аутентификации и вектор инициализации AES CTR. AES GCM SIV является усовершенствованием алгоритма GCM SIV, имеющего очень похожее название, с несколькими незначительными изменениями (например, в способе инициализации AES CTR), что дает ощутимые преимущества для его безопасности. "Это изменение позволяет шифровать до 250 сообщений одним и тем же ключом, в отличие от существенного ограничения в 232 сообщения, которое было для GCM SIV."
AES GCM SIV synthesizes the internal IV. It derives a hash of the additional authenticated data and plaintext using the POLYVAL Galois hash function. The hash is then encrypted an AES key, and used as authentication tag and AES CTR initialization vector. AES GCM SIV is an improvement over the very similarly named algorithm GCM SIV, with a few very small changes (e. g. how AES CTR is initialized), but which yields practical benefits to its security "This addition allows for encrypting up to 250 messages with the same key, compared to the significant limitation of only 232 messages that were allowed with GCM SIV."
Электронный кодник (ЕЦБ)
Самый простой из режимов шифрования — режим электронной кодовой книги (ECB), названный в честь традиционных физических кодовых книг. Сообщение разбивается на блоки, и каждый блок шифруется отдельно. Использование ECB в криптографических протоколах не рекомендуется: недостатком этого метода является отсутствие диффузии, из-за чего он не скрывает закономерности в данных, шифруя идентичные блоки открытого текста в идентичные блоки шифротекста. Наглядный пример того, как ECB может оставлять закономерности открытого текста в шифротексте, можно увидеть при шифровании растрового изображения, содержащего большие области однородного цвета. Хотя цвет каждого отдельного пикселя предположительно зашифрован, общее изображение все еще может быть различимо, поскольку структура пикселей одинакового цвета в исходном изображении остается видимой в зашифрованной версии. Режим ECB также может сделать протоколы, не имеющие защиты целостности, еще более уязвимыми для атак повторного использования, поскольку каждый блок расшифровывается одинаковым образом.
Пример
Режим СКБ (CBC) был наиболее часто используемым режимом работы. Его основными недостатками являются последовательное шифрование (то есть, его нельзя распараллелить) и необходимость дополнения сообщения до кратного размера блока шифра. Один из способов решения этой последней проблемы – метод, известный как кража шифротекста. Важно отметить, что изменение одного бита в открытом тексте или векторе инициализации (IV) влияет на все последующие блоки шифротекста. Дешифрование с неверным IV приводит к повреждению первого блока открытого текста, но последующие блоки будут расшифрованы верно. Это происходит потому, что каждый блок складывается по XOR с шифротекстом предыдущего блока, а не с открытым текстом, поэтому нет необходимости расшифровывать предыдущий блок перед использованием его в качестве IV для расшифровки текущего. Это означает, что блок открытого текста можно восстановить из двух соседних блоков шифротекста. Следовательно, дешифрование можно распараллелить. Важно отметить, что изменение одного бита в шифротексте приводит к полному повреждению соответствующего блока открытого текста и инвертирует соответствующий бит в следующем блоке открытого текста, при этом остальные блоки остаются неизменными. Эта особенность используется в различных атаках типа "оракул дополнения", таких как POODLE. Явные векторы инициализации используют это свойство, добавляя к открытому тексту один случайный блок. Шифрование выполняется как обычно, за исключением того, что IV не нужно передавать процедуре дешифрования. Независимо от того, какой IV использует дешифровщик, "повреждается" только случайный блок. Его можно безопасно отбросить, а остальная часть дешифрованного текста – это исходный открытый текст.
Полный блок CFB
В режиме обратной связи по шифру (CFB) в простейшей форме используется весь выход блока шифра. В этом варианте он очень похож на CBC, преобразуя блочный шифр в самосинхронизирующийся потоковый шифр. Дешифрование в режиме CFB в этом варианте почти идентично шифрованию CBC, выполненному в обратном порядке.
CFB-1, CFB-8, CFB-64, CFB-128 и т.д.
NIST SP800 38A определяет CFB с указанием ширины битов. Режим CFB также требует целочисленный параметр, обозначаемый s, такой что 1 ≤ s ≤ b. В спецификации режима CFB, представленной ниже, каждый сегмент открытого текста (Pj) и сегмент шифротекста (Cj) состоит из s бит. Значение s иногда включается в название режима, например, режим CFB с шириной 1 бит, режим CFB с шириной 8 бит, режим CFB с шириной 64 бита или режим CFB с шириной 128 бит. Эти режимы усекают выход базового блочного шифра. CFB 1 считается самосинхронизирующимся и устойчивым к потере шифротекста; "Когда используется режим CFB с шириной 1 бит, синхронизация автоматически восстанавливается через b+1 позиций после вставленного или удаленного бита. Для других значений s в режиме CFB, а также для других режимов конфиденциальности, рекомендованных в данном документе, синхронизация должна быть восстановлена внешним способом." (NIST SP800 38A). То есть, потеря 1 бита в блочном шифре шириной 128 бит, таком как AES, приведет к появлению 129 недействительных битов перед выдачей действительных битов. CFB также может самосинхронизироваться в некоторых особых случаях, отличных от описанных. Например, изменение одного бита в CFB 128 с базовым 128-битным блочным шифром приведет к повторной синхронизации после двух блоков. (Однако, CFB 128 и т.п. не обрабатывает потерю битов корректно; потеря одного бита приведет к потере синхронизации между дешифровщиком и шифровщиком).
CFB по сравнению с другими режимами
Как и в режиме CBC, изменения в открытом тексте бесконечно распространяются в зашифрованном тексте, и шифрование нельзя распараллелить. Как и в CBC, расшифровка может быть распараллелена. Режимы CFB, OFB и CTR обладают двумя преимуществами перед режимом CBC: блочный шифр используется исключительно в режиме шифрования, и сообщение не требует дополнения до кратного размера блока шифра (хотя для режима CBC также можно использовать технику кражи шифротекста, чтобы избежать необходимости дополнения).
Счетчик (CTR)
Примечание: Режим CTR (CM) также известен как режим счетчика целых чисел (ICM) и режим счетчика сегментированных целых чисел (SIC). Как и OFB, режим CTR преобразует блочный шифр в потоковый шифр. Он генерирует следующий блок ключевого потока, шифруя последовательные значения "счетчика". Счетчиком может быть любая функция, которая производит последовательность, гарантированно не повторяющуюся в течение длительного времени, хотя простое увеличение счетчика на единицу является самым простым и распространенным способом. Использование простой детерминированной входной функции ранее вызывало споры; критики утверждали, что "преднамеренное предоставление криптосистеме известного систематического ввода представляет собой ненужный риск". Однако сегодня режим CTR широко принят, и любые возникающие проблемы рассматриваются как слабость лежащего в основе блочного шифра, который, как ожидается, будет безопасным независимо от систематической предвзятости во входных данных. Режим CTR был представлен Уитфилдом Диффи и Мартином Хеллманом в 1979 году. Режим CTR имеет характеристики, схожие с OFB, но также обеспечивает возможность произвольного доступа при дешифровании. Режим CTR хорошо подходит для работы на многопроцессорных машинах, где блоки могут шифроваться параллельно. Кроме того, он не подвержен проблеме короткого цикла, которая может возникать в OFB. Если IV/nonce является случайным, его можно объединить со счетчиком, используя любую обратимую операцию (конкатенацию, сложение или XOR), чтобы получить фактический уникальный блок счетчика для шифрования. В случае неслучайного nonce (например, счетчика пакетов) nonce и счетчик должны быть конкатенированы (например, хранить nonce в старших 64 битах и счетчик в младших 64 битах 128-битного блока счетчика). Простое сложение или XOR nonce и счетчика в одно значение может нарушить безопасность при атаке с выбранным открытым текстом во многих случаях, поскольку злоумышленник может манипулировать всей парой IV–счетчик, чтобы вызвать коллизию. Как только злоумышленник контролирует пару IV–счетчик и открытый текст, XOR шифротекста с известным открытым текстом даст значение, которое, будучи XORed с шифротекстом другого блока, использующего ту же пару IV–счетчик, расшифрует этот блок. Обратите внимание, что nonce на этой схеме эквивалентен вектору инициализации (IV) на других схемах. Однако, если информация об офсете/местоположении повреждена, частичное восстановление таких данных будет невозможно из-за зависимости от байтового смещения.
Другие режимы и другие криптографические примитивы
Было предложено множество других режимов работы для блочных шифров. Некоторые из них были приняты, полностью описаны (даже стандартизированы) и используются. Другие были признаны небезопасными и никогда не должны применяться. Некоторые же не подпадают под категории конфиденциальности, аутентичности или аутентифицированного шифрования – например, режим обратной связи по ключу и хеширование Дэвиса-Мейера. NIST поддерживает список предлагаемых режимов для блочных шифров на странице Modes Development. Шифрование диска часто использует специализированные режимы, разработанные конкретно для этой задачи. Режимы шифрования узких блоков с возможностью настройки (LRW, XEX и XTS) и режимы шифрования широких блоков (CMC и EME) предназначены для безопасного шифрования секторов диска (см. теорию шифрования диска). Многие режимы используют вектор инициализации (IV), который, в зависимости от режима, может иметь требования, такие как использование только один раз (nonce) или непредсказуемость до его публикации и т.п. Повторное использование IV с одним и тем же ключом в режимах CTR, GCM или OFB приводит к операции XOR с одним и тем же потоком ключей для двух или более открытых текстов, что является явным злоупотреблением потоком и приводит к катастрофической потере безопасности. Детерминированные режимы аутентифицированного шифрования, такие как алгоритм NIST Key Wrap и режим SIV (RFC 5297) AEAD, не требуют IV в качестве входных данных и возвращают один и тот же шифротекст и тег аутентификации каждый раз для заданного открытого текста и ключа. Другие режимы, устойчивые к неправильному использованию IV, такие как AES GCM SIV, выигрывают от использования IV, например, в максимальном объеме данных, которые можно безопасно зашифровать одним ключом, при этом повторное использование одного и того же IV не приводит к катастрофическим последствиям. Блочные шифры также могут использоваться в других криптографических протоколах. Обычно они используются в режимах работы, аналогичных описанным здесь блочным режимам. Как и в случае с любыми протоколами, для обеспечения криптографической безопасности необходимо тщательно разрабатывать эти режимы работы. Существуют различные схемы, использующие блочный шифр для построения криптографической хеш-функции. См. одностороннюю функцию сжатия для описания нескольких таких методов. Криптографически безопасные генераторы псевдослучайных чисел (CSPRNG) также могут быть построены с использованием блочных шифров. Коды аутентификации сообщений (MAC) часто строятся на основе блочных шифров. Примерами являются CBC MAC, OMAC и PMAC.