В основе Stanford JavaScript Crypto Library лежит принцип строгого
разделения между внутренним представлением данных и их внешними
форматами. Криптографические алгоритмы оперируют не строками и не
байтами в привычном смысле JavaScript, а специализированной структурой —
bitArray. Поверх неё построен слой кодеков (codecs),
отвечающих за преобразование данных между человекочитаемыми форматами и
внутренним представлением библиотеки.
Ключевой тип данных в SJCL — это bitArray. Он
представляет собой массив 32-битных слов с дополнительным первым
элементом, содержащим длину в битах.
Структура:
[bitLength, word0, word1, word2, ...]
где:
bitLength — количество значимых битwordN — 32-битные целые числаТакой подход позволяет эффективно реализовать криптографические операции без привязки к строковым или байтовым ограничениям среды исполнения.
Стандартные типы JavaScript плохо подходят для криптографии:
bitArray решает эти проблемы:
Кодеки в SJCL находятся в пространстве sjcl.codec. Они
отвечают за преобразование:
Каждый кодек реализует два базовых метода:
toBits(data)fromBits(bitArray)Дополнительно могут использоваться вспомогательные функции для работы с подформатами.
Hex (шестнадцатеричное представление) — один из базовых способов отображения бинарных данных.
sjcl.codec.hex.fromBits(bitArray)
Каждые 4 бита преобразуются в один символ [0-9a-f].
sjcl.codec.hex.toBits(hexString)
0xconst hashHex = sjcl.codec.hex.fromBits(hashBits);
const bits = sjcl.codec.hex.toBits(hashHex);
Hex остаётся основным форматом для низкоуровневого представления криптографических значений.
Base64 используется для компактного представления бинарных данных в текстовом виде.
=sjcl.codec.base64.fromBits(bitArray)
sjcl.codec.base64.toBits(base64String)
В SJCL существует несколько режимов base64:
UTF-8 кодек предназначен для преобразования строк JavaScript в битовый формат и обратно.
sjcl.codec.utf8String.toBits("текст")
sjcl.codec.utf8String.fromBits(bitArray)
JavaScript строки используют UTF-16, поэтому кодек выполняет:
bitArrayХотя SJCL не использует нативные Uint8Array в ядре,
существует концептуальная совместимость через промежуточные
преобразования.
Используется построчная декомпозиция 32-битных слов:
SJCL включает JSON-кодек для сериализации структур, содержащих
bitArray.
Типичная структура:
{
"iv": "...",
"salt": "...",
"ct": "..."
}
Где все поля — закодированные bitArray.
| Кодек | Назначение | Плотность | Читаемость |
|---|---|---|---|
| hex | отладка, ключи | низкая | высокая |
| base64 | передача данных | средняя | средняя |
| utf8String | текстовые данные | переменная | высокая |
| bitArray | внутренний формат SJCL | максимальная | отсутствует |
Кодеки не участвуют в криптографических вычислениях напрямую. Их задача ограничена:
Любая криптографическая функция SJCL принимает и возвращает
bitArray, что делает кодеки вспомогательным, но критически
важным слоем.
Типичный жизненный цикл данных в SJCL выглядит следующим образом:
utf8String.toBitsbitArraybase64.fromBitsbase64.toBitsutf8String.fromBitsОдной из ключевых проблем при работе с бинарными данными в JavaScript является выравнивание.
SJCL решает это через:
Пример:
[13, 0b10101000000000000000000000000000]
означает только первые 13 бит значимы.
Использование bitArray и кодеков имеет компромиссы:
Однако:
Архитектура SJCL допускает добавление собственных кодеков.
Для этого достаточно реализовать интерфейс:
{
toBits: function (data) { ... },
fromBits: function (bits) { ... }
}
Это позволяет интегрировать:
При работе с кодеками важно учитывать:
Ошибки на уровне кодеков часто приводят не к сбоям, а к тихой порче данных, что особенно критично в криптографии.
Кодеки тесно связаны с высокоуровневыми API библиотеки:
sjcl.encryptsjcl.decryptsjcl.miscЭти функции принимают строки, но внутри всегда преобразуют их в
bitArray, а затем возвращают результат через кодек.
Таким образом, кодеки формируют границу между: