GHASH
Универсальный хеш внутри GCM: превращает шифртекст в многочлен и вычисляет его в секретной точке.
GHASH нарезает ассоциированные данные, шифртекст и завершающий блок длин на 128-битные части и рассматривает их как коэффициенты многочлена над GF(2128). Многочлен вычисляется в точке H = E_K(0¹²⁸) — блочный шифр, применённый к нулевому блоку. Результат XOR-ится с зашифрованным блоком счётчика, и получается тег аутентификации. Мак-Грю и Виега встроили его в GCM в 2004 году; с тех пор как Intel в 2010 году выпустила инструкцию PCLMULQDQ, в железе он почти бесплатен.
Подвох в том, что всё держится на H. Повторите nonce — и атакующий составит уравнение, из которого получит H, после чего теги можно подделывать сколько угодно. Порядок битов к тому же отражён так, что поколения разработчиков ругались; POLYVAL в GCM-SIV — та же идея, но с порядком байтов, который человек способен понять.