Я хочу использовать CBC MAC в C ++. Сначала я надеюсь найти некоторую реализацию блочного шифра, которую я буду использовать в режиме CBC, который, как я понимаю, является CBC MAC. Но у меня есть два вопроса:
1) Если длина аутентифицируемого сообщения не кратна длине блочного шифра, что мне делать?
2) Для усиления CBC MAC один из рекомендуемых способов, как упомянуто в Wiki, — поместить длину сообщения в первый блок. Но как я должен кодировать длину, как строку? Или в двоичном? Если длина блока шифра, скажем, 64 бита, кодирую ли я число как 64-битное число? например если сообщение длина 230, я должен использовать следующее значение в качестве первого блока:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 11100110
?
Это зависит от 2-го вопроса. Вы должны «дополнить» сообщение чем-то, пока оно не будет кратно размеру блока. Байты pad добавляются в сообщение до того, как вычисляется MAC, но передается / сохраняется / и т. Д. Только оригинальное сообщение.
Для MAC, самая простая вещь, которую нужно сделать, это заполнить нулями. Однако в этом есть уязвимость — если часть сообщения заканчивается одним или несколькими нулями, злоумышленник может добавить или удалить нули и не изменять MAC. Но если вы выполните шаг 2, эта и другая атака будут смягчены.
Если вы добавляете длину сообщения до сообщение (например, не только в первом блоке, но и в первом блоке в первом блоке), оно уменьшает возможность иногда добавлять / удалять нули. Это также снижает способность злоумышленников подделывать сообщение с добавлением целого произвольного дополнительного блока. Так что это хорошая вещь. И это хорошая идея и для практических целей — вы знаете, сколько байтов содержится в сообщении, не полагаясь на какие-либо внешние средства.
Неважно, какой формат длины — какая-то закодированная версия ASCII или двоичная. Однако на практике это всегда должен быть простой двоичный файл.
Нет причин, по которым количество битов в длине должно соответствовать размеру блока шифра. Размер поля длины должен быть достаточно большим, чтобы представлять размеры сообщений. Например, если размер сообщения может варьироваться от 0 до 1000 байт, можно добавить 16-разрядное целое число без знака.
Это делается в первую очередь до того, как MAC-адрес рассчитывается как для отправителя, так и для получателя. По сути, длина проверяется одновременно с остальной частью сообщения, что исключает возможность для злоумышленника подделывать более длинное или короткое сообщение.
Существует много реализаций блочных шифров с открытым исходным кодом, таких как AES, которые легко найти и начать работать.
Предостережение
Предположительно цель вопроса только для изучения. Любое серьезное использование должно учитывать более сильный MAC, такой как предложенный другими комментариями, и хорошую криптобиблиотеку. Есть и другие слабости и атаки, которые могут быть очень тонкими, поэтому вы никогда не должны пытаться реализовать свою собственную криптографию. Никто из нас не является экспертом по крипто, и это должно быть сделано только для обучения.
Кстати, я рекомендую обе следующие книги Брюса Шнайера:
Других решений пока нет …