GHASH
GHASH — это универсальная хеш-функция, используемая в режиме аутентифицированного шифрования GCM (Galois/Counter Mode) для обеспечения целостности и аутентичности данных. GHASH основана на умножении в поле Галуа GF(2¹²⁸) и представляет собой полиномиальный хеш, вычисляемый над зашифрованным текстом и дополнительными аутентифицированными данными (AAD). В отличие от криптографических хеш-функций, таких как SHA-256, GHASH не является устойчивой к коллизиям в классическом смысле, но обеспечивает защиту от подделки сообщений при условии секретности ключа.
Математические основы
GHASH оперирует в конечном поле GF(2¹²⁸), где элементы представляются двоичными многочленами степени не выше 127. Умножение выполняется по модулю неприводимого многочлена x¹²⁸ + x⁷ + x² + x + 1. Каждый блок данных размером 128 бит интерпретируется как элемент поля, причём биты упорядочиваются от старшего к младшему (big-endian).
Ключ хеширования H вычисляется как результат шифрования нулевого блока (128 нулевых бит) на блочном шифре, используемом в GCM (обычно AES-128, AES-192 или AES-256). Этот ключ H является секретным и неизвестным атакующему.
Алгоритм вычисления
Входными данными для GHASH являются:
- A — дополнительные аутентифицированные данные (AAD), произвольной длины;
- C — зашифрованный текст, произвольной длины.
Выходом является 128-битный тег аутентичности T.
Алгоритм состоит из следующих шагов:
- Дополнение до границы 128 бит: если длина A или C не кратна 128 битам, к ним добавляется минимальное количество нулевых бит так, чтобы общая длина стала кратной 128. Это дополнение выполняется отдельно для A и C.
- Формирование последовательности блоков: данные разбиваются на 128-битные блоки. Пусть m — количество блоков A (после дополнения), n — количество блоков C (после дополнения). Затем формируется финальный блок L, содержащий 64-битные представления длин A и C (в битах) в порядке big-endian.
- Инициализация: переменная Y₀ устанавливается в нулевой блок (128 нулевых бит).
- Итеративное умножение: для каждого блока Xᵢ (в порядке: сначала блоки A, затем блоки C, затем блок L) выполняется:
Yᵢ = (Yᵢ₋₁ ⊕ Xᵢ) · H, где ⊕ — побитовое исключающее ИЛИ, а · — умножение в GF(2¹²⁸).
- Результат: итоговое значение Y (после обработки блока L) является тегом GHASH.
Использование в GCM
В режиме GCM тег аутентичности T вычисляется как: T = GHASH(A, C) ⊕ E(K, nonce || counter₀), где E(K, nonce || counter₀) — шифрование начального счётчика на ключе K. Это обеспечивает защиту от подделки сообщений: без знания ключа K злоумышленник не может вычислить корректный тег для модифицированного текста.
Криптографические свойства
GHASH является ε-почти универсальной хеш-функцией (ε-AU): вероятность коллизии для двух различных входов при случайном ключе H не превышает ε = (m + n + 1) / 2¹²⁸, где m и n — длины входных данных в блоках. Это свойство гарантирует, что атакующий не может подделать тег с вероятностью, существенно превышающей 2⁻¹²⁸, при условии, что ключ H остаётся секретным.
Однако GHASH не является криптографически стойкой хеш-функцией: она не обладает свойством необратимости (preimage resistance) и устойчивости к коллизиям в классическом смысле. Если ключ H известен, можно легко найти коллизии или подобрать входные данные для заданного тега.
Критика и уязвимости
Атаки на основе известного ключа
Если злоумышленник получает доступ к ключу H (например, через утечку или криптоанализ блочного шифра), он может подделывать любые сообщения. В 2013 году была продемонстрирована атака на GCM с использованием слабых ключей AES, но на практике она маловероятна.
Атаки на основе длины тега
При использовании укороченных тегов (менее 128 бит) вероятность успешной подделки возрастает. Например, для 32-битного тега вероятность составляет 2⁻³², что может быть приемлемо для некоторых приложений, но не для высокозащищённых систем.
Проблемы с неоднократным использованием nonce
В GCM nonce (однократно используемое число) должен быть уникальным для каждого сообщения при одном и том же ключе. Если nonce повторяется, ключ H может быть восстановлен, что приводит к полной потере аутентичности. Это фундаментальное ограничение, вытекающее из структуры GHASH.
Атаки на основе времени
Реализации GHASH, не защищённые от атак по сторонним каналам, могут быть уязвимы к атакам по времени. Умножение в GF(2¹²⁸) может выполняться за разное время в зависимости от входных данных, что позволяет злоумышленнику извлекать информацию о ключе H. Современные реализации (например, с использованием инструкций PCLMULQDQ в процессорах x86) обеспечивают постоянное время выполнения.
Реализации
GHASH реализован во многих криптографических библиотеках, включая OpenSSL, BoringSSL, LibreSSL, а также в аппаратных модулях (например, в Intel AES-NI с инструкцией PCLMULQDQ). В программных реализациях для повышения производительности часто используется табличный метод (precomputed tables), хотя он может быть уязвим к атакам по кэшу.
Альтернативы
В современных протоколах (например, TLS 1.3) GCM с GHASH остаётся широко распространённым, но существуют альтернативы:
- Poly1305 — полиномиальный хеш, используемый в режиме ChaCha20-Poly1305, который не требует умножения в поле Галуа и часто быстрее на платформах без аппаратной поддержки.
- GMAC — вариант GHASH, используемый для аутентификации без шифрования.
- AES-GCM-SIV — модификация GCM, устойчивая к повторному использованию nonce, но с более сложной реализацией.
Источники
- McGrew, D., Viega, J. (2004). «The Galois/Counter Mode of Operation (GCM)». NIST.
- NIST Special Publication 800-38D (2007). «Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC».
- Ferguson, N. (2005). «Authentication weaknesses in GCM». Comments on NIST.
- Saarinen, M.-J. O. (2012). «Cycling Attacks on GCM, GHASH and Other Polynomial MACs and Hashes». FSE 2012.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →