Мне нужно реализовать алгоритм MAC 1 ISO 9797 в .NET. Перед написанием кода я хочу понять концепции, чтобы не было недоразумений (простите меня, если некоторые вопросы просто «правильно ли»).
Во-первых, в Страница Википедии сказано, что:
Algorithm 1 is commonly known as CBC-MAC
Вопрос 1: В моем справочнике алгоритмы MAC упоминаются в двух местах - в одном месте он упоминается как алгоритм 1 MAC ISO 9797 (DES), а в другом - CBC-MAC (AES). Насколько я понимаю, это должен быть один и тот же CBC-MAC, один с DES, а другой с AES, верно? В моей справке термины просто взаимозаменяемы?
Вопрос 2: Верно ли, что CBC-MAC работает так же, как режим работы CBC? Из того, что я вижу, алгоритмы идентичны - вы берете ввод, выполняете XOR, а затем шифруете его с помощью ключа и так далее.
Вопрос 3: Если я использую DES и мои рассуждения верны, это то же самое, что и ANSI X9.9? Моя ссылка не очень ясна по этому поводу, но это то, что я понял, посмотрев на нее.





Q1: Да, они должны быть такими же. Это также означает, что для DES для защиты MAC используется только один DES. Это небезопасно из-за используемого размера ключа.
Q2: Да, поэтому он называется CBC-MAC, разница в том, что вывод состоит только из последнего блока «зашифрованного текста» или части последнего блока. Это, в свою очередь, означает, что сочетание этого с режимом шифрования, в котором используется тот же ключ, небезопасно, и что MAC уязвим, если используются сообщения с динамическим размером. Помните, что CBC-MAC обычно использует заполнение битов или заполнение ISO (байтовое значение 0x80, за которым следуют 0-7 байтов со значением 0x00 для DES), а не заполнение PKCS # 5 или PKCS # 7.
Q3: ANSI X9.9, кажется, описывает CBC-MAC, где размер вывода составляет всего 4 байта. Описание и картинку можно найти здесь.
Для AES был написан лучший режим MAC, позволяющий передавать сообщения с динамическим размером, называемые AES-CMAC или OMAC. Он состоит из начального и окончательного расчета с использованием стандартного CBC-MAC в середине.