При использовании sjcl.encrypt() библиотека возвращает
строку, содержащую сериализованный JSON-объект. Этот объект представляет
собой полностью самодостаточное описание зашифрованных данных и всех
параметров, необходимых для их расшифровки.
Структура сформирована таким образом, чтобы любой клиент, обладающий корректным паролем или ключом, мог восстановить исходный текст без внешних зависимостей и дополнительных метаданных.
После выполнения шифрования результат имеет следующую логическую структуру:
{
"iv": "...",
"v": 1,
"iter": 10000,
"ks": 128,
"ts": 64,
"mode": "ccm",
"adata": "",
"cipher": "aes",
"salt": "...",
"ct": "..."
}
Каждое поле играет строго определённую роль в процессе восстановления данных и обеспечения криптографической устойчивости.
ct —
зашифрованный текстct (ciphertext) — основное содержимое объекта.
Именно это поле является результатом применения симметричного шифрования к исходной строке.
iv — вектор
инициализацииiv (initialization vector) используется для обеспечения уникальности шифрования даже при одинаковом ключе и одинаковых данных.
Особенности:
Отсутствие уникального IV приводит к криптографической уязвимости, позволяющей анализировать повторяющиеся блоки данных.
salt —
криптографическая сольsalt применяется на этапе преобразования пароля в ключ.
Функции соли:
Соль:
iter —
количество итераций PBKDF2iter определяет, сколько раз выполняется функция деривации ключа.
Пример влияния:
ks — размер ключаks (key size) указывает размер производного ключа в битах.
Типичные значения:
В SJCL чаще всего используется 128 или 256 бит в зависимости от конфигурации AES.
ts —
размер тега аутентификацииts (tag size) отвечает за длину MAC (Message Authentication Code).
Назначение:
Типичные значения:
Чем больше значение, тем выше устойчивость к подделке данных.
mode —
режим работы блочного шифраmode определяет режим работы AES.
В SJCL часто используется:
"ccm" — Counter with CBC-MACОсобенности CCM:
cipher —
используемый алгоритмcipher указывает алгоритм симметричного шифрования.
В SJCL стандартное значение:
"aes"Это означает использование AES (Advanced Encryption Standard), обычно с ключами 128/192/256 бит.
adata — дополнительные аутентифицированные данныеadata (additional authenticated data) — необязательное поле.
Особенности:
Применяется для:
Если не используется, поле обычно пустое:
"adata": ""
v — версия формата
SJCLv указывает версию формата сериализации.
Пример:
"v": 1
SJCL не возвращает объект напрямую — результат всегда сериализуется в строку JSON.
Пример:
var encrypted = sjcl.encrypt("password", "секретный текст");
Результат:
"{"iv":"...","v":1,"iter":10000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"...","ct":"..."}"
При необходимости строка может быть преобразована обратно в объект:
var obj = JSON.parse(encrypted);
Каждое поле напрямую отражает этап криптографического пайплайна:
Структура SJCL-объекта спроектирована так, чтобы:
Часто объект передаётся:
Любая модификация ct приводит к ошибке:
Без этих полей:
Нарушает процесс деривации ключа:
С точки зрения криптосистемы SJCL объект можно представить как:
cipher,
mode, ks, iter,
tsiv,
saltadatactvЭта структура обеспечивает полную воспроизводимость процесса расшифрования при наличии корректного пароля и исходных параметров.