В схемах симметричного шифрования с аутентификацией (AEAD — Authenticated Encryption with Associated Data) результатом шифрования является не только зашифрованный текст, но и дополнительное значение — тег аутентификации. Он обеспечивает проверку целостности и подлинности данных: любое изменение шифртекста, IV, связанного контекста или самого тега приводит к невозможности успешного расшифрования.
В Stanford JS Crypto Library (SJCL) тег аутентификации является обязательной частью режимов CCM и GCM и настраивается через параметр длины тега.
Тег аутентификации формируется как криптографический результат обработки:
Он не является просто контрольной суммой. В отличие от хеш-функций, тег вычисляется с использованием симметричного ключа, что делает невозможным его подделку без знания ключа.
В случае SJCL, режимы CCM и GCM обеспечивают одновременно:
В SJCL длина тега задаётся параметром:
ts (tag size) — размер тега в битахЭтот параметр является частью JSON-структуры, возвращаемой функцией
sjcl.encrypt, и используется при расшифровании через
sjcl.decrypt.
Пример структуры результата шифрования:
{
"iv": "...",
"v": 1,
"iter": 10000,
"ks": 128,
"ts": 64,
"mode": "ccm",
"adata": "",
"cipher": "aes",
"salt": "...",
"ct": "..."
}
Здесь ts определяет длину тега аутентификации.
В зависимости от режима работы SJCL допускает различные длины тега:
Режим CCM в SJCL поддерживает следующие значения ts:
Некоторые реализации допускают промежуточные значения с шагом в 8 бит, но практическая совместимость обычно ограничивается стандартными уровнями.
В режиме GCM стандартом де-факто является:
Уменьшение длины тега в GCM встречается редко и может приводить к снижению совместимости с другими реализациями.
Криптографическая стойкость тега определяется вероятностью успешной подделки:
[ P_{forge} = 2^{-t}]
где ( t ) — длина тега в битах.
На практике важен не только теоретический уровень, но и устойчивость к:
В некоторых сценариях длина тега уменьшается ради:
Однако усечение тега приводит к экспоненциальному росту вероятности подделки.
Например, переход:
уменьшает безопасность не линейно, а в (2^{64}) раз.
Даже при небольшом количестве попыток атака становится практически осуществимой при наличии активного оракула расшифрования.
При использовании sjcl.encrypt параметры могут
задаваться явно:
const encrypted = sjcl.encrypt("password", "plaintext", {
mode: "ccm",
ts: 128,
ks: 256,
iter: 10000
});
Если ts не задан, библиотека использует значение по
умолчанию, зависящее от режима.
При расшифровании структура с ts обязательна:
const decrypted = sjcl.decrypt("password", encrypted);
Любое несоответствие длины тега приводит к ошибке проверки целостности.
Увеличение ts влияет на:
Однако влияние на производительность обычно минимально по сравнению с:
Основная нагрузка приходится на обработку данных, а не на длину тега.
Тег аутентификации тесно связан с другими параметрами:
При изменении ts между шифрованием и расшифрованием
возникает ошибка проверки целостности:
Использование нестандартных значений может приводить к:
При выборе минимальных значений:
При проектировании систем на SJCL учитываются следующие принципы:
При этом критически важно учитывать:
Внутри SJCL тег:
tsПосле этого он кодируется в Base64 и включается в итоговый JSON как часть структуры шифртекста.
Поле ct содержит только шифртекст, а не тег. Тег
хранится неявно внутри алгоритма и проверяется при расшифровании.
При интеграции SJCL с другими системами важно учитывать:
ts приводит к несовместимости даже при
одинаковом шифртекстеВ системах с повышенными требованиями к безопасности:
ts = 128В таких условиях тег аутентификации становится центральным элементом защиты от подделки и модификации данных, определяя устойчивость всей схемы AEAD в SJCL.