Режим GCM (Galois/Counter Mode) объединяет потоковое шифрование в режиме счётчика (CTR) и аутентификацию данных через универсальную хеш-функцию GHASH. В контексте криптобиблиотеки SJCL (Stanford JavaScript Crypto Library) этот режим используется для симметричного шифрования с одновременной защитой целостности и подлинности данных.
GCM работает с двумя основными компонентами:
Ключевая особенность режима заключается в том, что шифрование и проверка целостности выполняются в рамках одного прохода по данным, без необходимости отдельного MAC-алгоритма.
В SJCL реализация GCM находится в пространстве:
sjcl.mode.gcm
Основные функции:
encrypt(key, data, iv, adata, tlen)decrypt(key, data, iv, adata, tlen)Работа происходит на уровне bitArray, внутреннего формата представления данных в SJCL.
Ключевые зависимости:
sjcl.cipher.aes)Режим GCM в SJCL опирается на набор строго определённых параметров, каждый из которых влияет на безопасность и корректность результата.
Ключ передаётся как объект AES:
var aes = new sjcl.cipher.aes(keyBits);
Характеристики:
sjcl.bitArrayИнициализационный вектор (IV) играет критическую роль:
В SJCL:
iv: sjcl.random.randomWords(4, 0)
Важно: повтор IV с тем же ключом полностью компрометирует безопасность режима.
Входные данные:
sjcl.bitArrayAAD не шифруется, но включается в аутентификационный тег.
Используется для:
В SJCL:
adata: sjcl.codec.utf8String.toBits("header")
GHASH учитывает AAD до начала обработки ciphertext.
Параметр определяет размер аутентификационного тега:
Пример:
tlen: 128
Снижение длины тега уменьшает криптостойкость аутентификации.
Алгоритм включает несколько стадий.
Из IV формируется начальный counter block:
для 96-битного IV:
J0 = IV || 0x00000001для других размеров IV: используется GHASH над IV
Каждый блок plaintext:
C_i = P_i ⊕ E_K(CTR_i)
CTR инкрементируется на каждом шаге.
GHASH строится как полиномиальная функция в поле GF(2¹²⁸):
X_i = (X_{i-1} ⊕ block_i) · H
Где:
H = E_K(0¹²⁸)
block_i включает:
Финальный тег:
T = MSB_tlen( E_K(J0) ⊕ GHASH )
SJCL использует несколько специфичных представлений:
Основная структура данных:
Используются для:
В отличие от нативных реализаций:
Если IV ≠ 96 бит:
SJCL строго разделяет:
но выполняет их синхронно в одном проходе данных.
Использование одного IV дважды с тем же ключом приводит к:
Если AAD используется на одной стороне и не используется на другой:
Сокращение tlen без согласования:
Частые проблемы:
var key = sjcl.codec.hex.toBits("00112233445566778899aabbccddeeff");
var aes = new sjcl.cipher.aes(key);
var iv = sjcl.random.randomWords(4, 0);
var data = sjcl.codec.utf8String.toBits("secret message");
var adata = sjcl.codec.utf8String.toBits("header");
var encrypted = sjcl.mode.gcm.encrypt(aes, data, iv, adata, 128);
При расшифровании выполняется:
Любое расхождение тега приводит к немедленному отказу обработки данных.
GCM в SJCL обеспечивает:
Критическим условием безопасности остаётся уникальность IV и корректная синхронизация параметров между сторонами обмена.