Поля iv, salt, ct, adata, ks, iter, mode, ts

Поле iv содержит инициализационный вектор, используемый симметричными режимами шифрования для обеспечения уникальности шифротекста при одинаковом ключе и одинаковом открытом тексте.

В контексте SJCL (Stanford Javascript Crypto Library) iv имеет критическое значение для режимов, требующих случайности:

  • CCM (Counter with CBC-MAC)
  • OCB2 (в устаревших реализациях)

Основные свойства:

  • Длина обычно фиксирована режимом (например, 96 или 128 бит)
  • Должен быть уникальным для каждой операции шифрования при одном ключе
  • Не обязан быть секретным, но обязан быть непредсказуемым

Пример структуры:

{
  "iv": "base64-encoded-string"
}

Использование повторного IV с одним ключом в режимах CTR/CCM приводит к критическим утечкам информации, вплоть до восстановления исходного текста.


salt

Поле salt используется при деривации ключей из пароля, чаще всего через PBKDF2, который реализован в SJCL как sjcl.misc.pbkdf2.

Назначение salt:

  • Защита от атак с предвычислением (rainbow tables)
  • Обеспечение уникальности ключа даже при одинаковом пароле

Особенности:

  • Генерируется случайным образом
  • Не требует секретности
  • Хранится вместе с зашифрованными данными
  • Обычно имеет длину 64–256 бит

Типичная структура:

{
  "salt": "base64-encoded-string"
}

При расшифровке salt используется вместе с iter, ks и паролем для восстановления ключа.


ct (ciphertext)

Поле ct содержит зашифрованный текст (ciphertext), результат применения симметричного шифрования к исходным данным.

Особенности:

  • Представлен в base64-формате
  • Включает только зашифрованные данные без метаданных (за исключением случаев AEAD, где часть структуры может быть логически связана с аутентификацией)
  • Может иметь переменную длину в зависимости от входных данных и режима шифрования

Структура:

{
  "ct": "base64-encoded-ciphertext"
}

В CCM-режиме SJCL ciphertext логически связан с тегом аутентификации, хотя сам тег хранится отдельно через ts.


adata (Additional Authenticated Data)

Поле adata содержит дополнительные аутентифицированные данные, которые не шифруются, но включаются в вычисление MAC (Message Authentication Code).

Назначение:

  • Обеспечение целостности метаданных
  • Защита от подмены структуры сообщения
  • Привязка шифротекста к контексту (например, заголовкам протокола)

Ключевые свойства:

  • Не шифруется
  • Входит в расчет аутентификационного тега
  • Любое изменение приводит к ошибке расшифровки

Пример:

{
  "adata": "{\"alg\":\"AES\",\"version\":1}"
}

В SJCL adata обычно сериализуется в строку JSON и затем кодируется в бинарное представление перед включением в MAC-вычисления.


ks (key size)

Поле ks определяет размер ключа в словах по 32 бита (word size в SJCL).

Важный нюанс:

  • 1 слово = 32 бита
  • ks = 4 → 128-битный ключ
  • ks = 8 → 256-битный ключ

Типичные значения:

  • 4 (128 бит)
  • 8 (256 бит)

Пример:

{
  "ks": 8
}

Используется при:

  • Деривации ключа из пароля (PBKDF2)
  • Генерации ключевого материала для AES

Связь с криптографией:

  • ks напрямую определяет безопасность симметричного ключа
  • должен соответствовать выбранному алгоритму (например, AES-128 или AES-256)

iter (iterations)

Поле iter задаёт количество итераций функции деривации ключа PBKDF2.

Назначение:

  • Увеличение вычислительной стоимости подбора пароля
  • Замедление brute-force атак

Особенности:

  • Чем выше iter, тем безопаснее, но медленнее процесс шифрования/дешифрования
  • Значение подбирается балансом между безопасностью и производительностью

Пример:

{
  "iter": 10000
}

Рекомендации:

  • Минимальные значения в старых системах: 1000–2000
  • Современные практики: 10000–100000+
  • В JS-среде важно учитывать производительность браузера

В SJCL iter используется только в контексте паролей, не в прямом шифровании ключом.


mode

Поле mode определяет режим работы блочного шифра AES.

SJCL поддерживает несколько режимов:

  • ccm — основной и рекомендуемый режим
  • ocb2 — устаревший режим (патентные ограничения)
  • gcm — отсутствует в стандартной SJCL реализации (в отличие от WebCrypto)

Пример:

{
  "mode": "ccm"
}

Роль mode:

  • Определяет схему шифрования блоков
  • Определяет способ аутентификации данных
  • Влияет на структуру итогового JSON

CCM (Counter with CBC-MAC):

  • Объединяет CTR-режим для шифрования
  • И CBC-MAC для аутентификации
  • Обеспечивает конфиденциальность и целостность

OCB2:

  • Более эффективный, но юридически ограниченный
  • В современных системах используется редко

ts (tag size)

Поле ts определяет размер аутентификационного тега (authentication tag size) в битах.

Назначение:

  • Определяет длину MAC, защищающего целостность данных
  • Используется в CCM-режиме

Типичные значения:

  • 64 бит
  • 96 бит
  • 128 бит

Пример:

{
  "ts": 128
}

Особенности:

  • Чем больше ts, тем выше криптостойкость к подделке сообщений
  • Увеличение ts снижает вероятность успешной атаки на целостность
  • Влияет на размер итогового зашифрованного объекта

Взаимосвязь с adata:

  • ts определяет длину тега, который вычисляется также с учётом adata
  • изменение любого байта входных данных или adata делает тег недействительным

Взаимосвязь полей в типичной структуре SJCL

Типичный объект шифрования в SJCL выглядит как связка этих полей:

{
  "iv": "...",
  "v": 1,
  "iter": 10000,
  "ks": 8,
  "ts": 128,
  "mode": "ccm",
  "adata": "...",
  "ct": "...",
  "salt": "..."
}

Логика взаимодействия:

  • salt + iter + ks → формирование ключа из пароля
  • iv + mode → настройка режима шифрования
  • ct → результат шифрования
  • adata + ts → защита целостности
  • всё вместе → единый криптографический контейнер

Ключевой принцип структуры SJCL — объединение конфиденциальности (ct) и аутентичности (ts + adata) в одном объекте, при этом обеспечивая воспроизводимость через параметры деривации ключа (salt, iter, ks).