Безопасно ли использовать один и тот же ключ для разных сообщений?
Конечно; это не был бы очень хороший MAC, если бы ключ можно было использовать для одного сообщения.
и зачем мне IV для GMAC?
Потому что CMAC и GMAC имеют разные внутренние компоненты.
С CMAC вы делаете в основном те же вычисления, что и при шифровании в режиме CBC, за исключением того, что вы сохраняете только последний блок (и это MAC). Я сказал в основном потому, что если вы просто выполните эту операцию (известную как CBCMAC), это позволит злоумышленнику играть в некоторые игры с расширением сообщения - чтобы предотвратить это, CMAC xor в некоторых секретных данных с последним блоком, срывая такие игры .
Причина, по которой мы просим, чтобы IV был другим (и непредсказуемым) в режиме CBC, заключается в том, что начальный блок не пропускает информацию; CMAC не выводит начальный блок режима CBC (если только сообщение не помещается в один блок, и даже если это так, операция xor секретных данных предотвратит любую подобную утечку), и поэтому CMAC не разделяет опасений по поводу IV.
Что касается GMAC, то тут совсем другое дело; при этом вы логически преобразуете сообщение в коэффициенты полинома $M_k, M_{k-1}, ..., M_1$; затем вы конвертируете IV в постоянный термин $M_0$ в секретном ключе, а затем вычислить многочлен (в конечном поле) в секретной точке $Ч$, то есть вы вычисляете:
$$M_kH^k + M_{k-1}H^{k-1} + ... + M_1 H^1 + M_0$$
и это МАК. Обратите внимание, что злоумышленник знает все, кроме секретных значений. $Ч$ (который является постоянным для данного ключа) и $M_0$ (а последнее зависит от IV).
Теперь, если у вас есть два MAC-адреса для двух разных сообщений с одним и тем же IV, $M_0$ значения будут одинаковыми; Вы можете вычесть их, а затем решить для $Ч$ - это дает вам все секреты, и поэтому вы можете генерировать сообщения с действительными значениями MAC по желанию.
И на довольно высоком уровне, который я описал, Poly1305 работает точно так же (и поэтому имеет ту же слабость к повторению IV).
В моем случае я не шифрую никаких сообщений, я просто создаю MAC, который я прикрепляю к сообщению (открытый текст). Это уязвимо?
Подойдет любой хороший MAC — это действительно тот вариант использования, для которого MAC должен адресовать [1]. CMAC в порядке - GMAC и Poly1305 также подойдут, если вы избегаете повторения IV.
[1]: Предполагая, конечно, что отправитель и получатель используют один и тот же секретный ключ - если вам нужно что-то, где получатель не может генерировать действительные сообщения, вам нужно посмотреть на подписи.