Введение
Алгоритм кода аутентификации сообщений
В криптографии код аутентификации сообщений с шифрованием блоков в режиме цепочки (CBC MAC) — это метод построения кода аутентификации сообщений (MAC) на основе блочного шифра. Сообщение шифруется с использованием некоторого алгоритма блочного шифрования в режиме шифрования цепочки блоков (CBC) для создания цепочки блоков, в которой каждый блок зависит от корректного шифрования предыдущего блока. Эта взаимозависимость гарантирует, что изменение любого бита открытого текста приведет к изменению конечного зашифрованного блока таким образом, который невозможно предсказать или нейтрализовать без знания ключа блочного шифра. Для вычисления CBC MAC сообщения m сообщение m шифруется в режиме CBC с нулевым вектором инициализации, и сохраняется последний блок. Следующая схема иллюстрирует вычисление CBC MAC сообщения, состоящего из блоков, с использованием секретного ключа k и блочного шифра E:
CBC MAC сам по себе не является безопасным для сообщений переменной длины и в TLS 1.2, а также в Bluetooth Low Energy (по состоянию на Bluetooth 4.0, см. NIST SP 800-121 Rev2). Он доступен в TLS 1.3, но не включен по умолчанию в OpenSSL. CBC MAC также используется как "компонент кондиционирования" (также известный как экстрактор случайности, метод генерации битовых строк с полной энтропией) в NIST SP 800-90B.
In cryptography, a cipher block chaining message authentication code (CBC MAC) is a technique for constructing a message authentication code (MAC) from a block cipher. The message is encrypted with some block cipher algorithm in cipher block chaining (CBC) mode to create a chain of blocks such that each block depends on the proper encryption of the previous block. This interdependence ensures that a change to any of the plaintext bits will cause the final encrypted block to change in a way that cannot be predicted or counteracted without knowing the key to the block cipher. To calculate the CBC MAC of message m, one encrypts m in CBC mode with zero initialization vector and keeps the last block. The following figure sketches the computation of the CBC MAC of a message comprising blocks using a secret key k and a block cipher E:
CBC MAC on its own is not secure for variable length messages and TLS 1.2, as well as Bluetooth Low Energy (as of Bluetooth 4.0, see NIST SP 800 121 Rev2). It is available for TLS 1.3, but not enabled by default in OpenSSL. CBC MAC is also used as a "conditioning component" (a. k. a. randomness extractor, a method to generate bitstrings with full entropy) in NIST SP 800 90B.
Стандарты, определяющие алгоритм
FIPS PUB 113 Computer Data Authentication – (в настоящее время устаревший) государственный стандарт США, определяющий алгоритм CBC MAC с использованием DES в качестве блочного шифра. Алгоритм CBC MAC также включен в стандарты ANSI X9.9, ANSI X9.19, ISO 8731-1 и ISO/IEC 9797-1 MAC (Алгоритм 1).
Безопасность с фиксированными и переменными сообщениями
Если используемый блочный шифр является безопасным (то есть представляет собой псевдослучайную перестановку), то CBC MAC безопасен для сообщений фиксированной длины. Однако сам по себе он не является безопасным для сообщений переменной длины. Следовательно, один и тот же ключ должен использоваться только для сообщений фиксированной и известной длины. Это связано с тем, что злоумышленник, знающий правильные теги аутентификации (то есть CBC MAC) для двух сообщений *m₁* и *m₂*, может сгенерировать третье сообщение *m₃*, для которого CBC MAC также будет верен. Это достигается простым применением операции XOR к первому блоку *m₃* с тегом *t*, а затем конкатенацией *m₃* с этим измененным блоком, то есть созданием *m₃ = t || m₃’*. При вычислении MAC для сообщения *m₃*, MAC для *m₃’* вычисляется обычным образом как *t*, но когда это значение передается на следующий этап вычисления, выполняется операция XOR со значением, полученным для MAC первого сообщения *m₁*. Присутствие этого тега в новом сообщении *m₃* приведет к его отмене, исключая какой-либо вклад от блоков открытого текста в первом сообщении *m₁*: и, таким образом, тег для *m₃* будет таким же, как для *m₂*.
This problem cannot be solved by adding a message size block to the end. in fact CBC MAC has been proven secure as long as no two messages that are prefixes of each other are ever used and prepending the length is a special case of this. This can be problematic if the message length may not be known when processing begins.
Эту проблему нельзя решить путем добавления блока с размером сообщения в конец. На самом деле, CBC MAC был доказан безопасным при условии, что никогда не используются два сообщения, являющиеся префиксами друг друга, а добавление длины является частным случаем этой ситуации. Это может быть проблематично, если длина сообщения неизвестна в момент начала обработки.
This problem cannot be solved by adding a message size block to the end. in fact CBC MAC has been proven secure as long as no two messages that are prefixes of each other are ever used and prepending the length is a special case of this. This can be problematic if the message length may not be known when processing begins.
Зашифровать последний блок
Шифрование последнего блока CBC MAC (ECBC MAC) определяется как... По сравнению с другими рассматриваемыми методами расширения CBC MAC для сообщений переменной длины, шифрование последнего блока имеет то преимущество, что не требует знания длины сообщения до завершения вычисления.
Методы борьбы с неправильным использованием
Как и во многих криптографических схемах, непродуманное использование шифров и других протоколов может сделать возможными атаки, снижая эффективность криптографической защиты (или даже полностью ее нейтрализуя). Мы представляем атаки, которые становятся возможными из-за некорректного применения CBC MAC.
Разрешает вектору инициализации изменять значение
При шифровании данных с использованием блочного шифра в режиме шифрования блоками (или другом), обычно вводят вектор инициализации на первом этапе процесса шифрования. Как правило, требуется, чтобы этот вектор выбирался случайным образом (nonce) и не повторялся для любого заданного секретного ключа, под которым работает блочный шифр. Это обеспечивает семантическую безопасность, гарантируя, что один и тот же открытый текст не будет зашифрован в один и тот же шифротекст, что предотвращает возможность вывода злоумышленником о наличии связи между ними. При вычислении кода аутентификации сообщения, например, CBC MAC, использование вектора инициализации может стать вектором атаки. В процессе работы блочного шифра с цепочкой блоков первый блок открытого текста смешивается с вектором инициализации посредством операции XOR. Результат этой операции является входными данными для блочного шифра при шифровании. Однако при выполнении шифрования и расшифрования необходимо передавать вектор инициализации в открытом виде – обычно как блок, непосредственно предшествующий первому блоку шифротекста – чтобы первый блок открытого текста можно было успешно расшифровать и восстановить. Если вычисляется MAC, также необходимо передать вектор инициализации другой стороне в открытом виде, чтобы она могла проверить, соответствует ли тег сообщения вычисленному ею значению. Если разрешить произвольный выбор вектора инициализации, то первый блок открытого текста потенциально можно будет изменить (передав другое сообщение), при этом сохранится тот же тег сообщения. В частности, при вычислении тега сообщения для CBC MAC, предположим, что мы выбираем вектор инициализации таким образом, что вычисление MAC начинается с Это создаёт пару (сообщение, тег). Теперь создадим сообщение Для каждого изменённого бита в , инвертируем соответствующий бит в векторе инициализации, чтобы получить вектор инициализации. Следовательно, для вычисления MAC для этого сообщения мы начинаем вычисление с Поскольку биты как в открытом тексте, так и в векторе инициализации были инвертированы в одних и тех же позициях, модификация отменяется на этом первом этапе, что означает, что входные данные для блочного шифра идентичны тем, что были для . Если больше не вносить изменений в открытый текст, то будет получен тот же тег, несмотря на передачу другого сообщения. Если возможность выбора вектора инициализации исключена, и все реализации CBC MAC фиксируют конкретный вектор инициализации (часто нулевой вектор, но теоретически это может быть любой вектор, при условии, что все реализации согласованы), эта атака невозможна. Подводя итог, если злоумышленник может задать IV, который будет использоваться для проверки MAC, он может произвольно изменять первый блок данных, не делая MAC недействительным.
Now produce the message For each bit modified in , flip the corresponding bit in the initialization vector to produce the initialization vector It follows that to compute the MAC for this message, we begin the computation by As bits in both the plain text and initialization vector have been flipped in the same places, the modification is cancelled in this first stage, meaning the input to the block cipher is identical to that for If no further changes are made to the plain text, the same tag will be derived despite a different message being transmitted. If the freedom to select an initialization vector is removed and all implementations of CBC MAC fix themselves on a particular initialization vector (often the vector of zeroes, but in theory, it could be anything provided all implementations agree), this attack cannot proceed. To sum up, if the attacker is able to set the IV that will be used for MAC verification, he can perform arbitrary modification of the first data block without invalidating the MAC.