В основе всей криптографии в SJCL лежит тип данных
bitArray. Это не строки и не байты в привычном виде, а
массивы 32-битных слов с дополнительным служебным представлением длины.
Именно через него проходят все операции шифрования, хэширования и
кодирования.
Ключевой принцип работы библиотеки: внутри — bitArray, снаружи — кодеки (codec)
Кодеки отвечают за преобразование между bitArray и
внешними форматами данных:
bitArray устроен следующим образом:
Пример:
var arr = sjcl.codec.utf8String.toBits("test");
Внутри это уже не строка "test", а структура вида:
[1952805748, 1819043144, 6647396, 64]
Последний элемент 64 — длина в битах.
Все кодеки находятся в пространстве:
sjcl.codec
Основные реализации:
sjcl.codec.hexsjcl.codec.base64sjcl.codec.base64urlsjcl.codec.utf8StringКаждый кодек реализует два обязательных метода:
toBits(input)fromBits(bitArray)var bits = sjcl.codec.utf8String.toBits("hello");
var hex = sjcl.codec.hex.fromBits(bits);
Результат:
68656c6c6f
var bits = sjcl.codec.hex.toBits("68656c6c6f");
var text = sjcl.codec.utf8String.fromBits(bits);
UTF-8 кодек работает с человеческими строками и выполняет преобразование в bitArray.
var bits = sjcl.codec.utf8String.toBits("Привет");
Особенность: символы кириллицы кодируются в несколько байт, поэтому размер bitArray увеличивается непропорционально длине строки.
var str = sjcl.codec.utf8String.fromBits(bits);
Base64 используется для компактного представления бинарных данных в текстовом виде.
var bits = sjcl.codec.utf8String.toBits("crypto");
var b64 = sjcl.codec.base64.fromBits(bits);
Результат:
Y3J5cHRv
var bits = sjcl.codec.base64.toBits("Y3J5cHRv");
var text = sjcl.codec.utf8String.fromBits(bits);
Отличие от стандартного Base64:
+ заменяется на -/ заменяется на _=Используется в токенах, URL и JWT-подобных структурах.
var bits = sjcl.codec.utf8String.toBits("data");
var urlsafe = sjcl.codec.base64url.fromBits(bits);
var bits = sjcl.codec.base64url.toBits(urlsafe);
var text = sjcl.codec.utf8String.fromBits(bits);
При преобразованиях важно учитывать:
Пример потери семантики:
var bits = sjcl.codec.utf8String.toBits("1234");
var hex = sjcl.codec.hex.fromBits(bits);
Обратно:
var restored = sjcl.codec.utf8String.fromBits(
sjcl.codec.hex.toBits(hex)
);
Результат сохраняется только при корректной последовательности преобразований.
SJCL часто используется в цепочках вида:
var key = sjcl.codec.utf8String.toBits("password");
var data = sjcl.codec.utf8String.toBits("secret message");
var encrypted = sjcl.encrypt("password", "secret message");
var parsed = JSON.parse(encrypted);
Здесь внутри encrypt автоматически используется:
Для работы с произвольными байтами часто используется HEX как промежуточный формат.
var bits = sjcl.random.randomWords(4);
var hex = sjcl.codec.hex.fromBits(bits);
var key = sjcl.codec.hex.toBits("00112233445566778899aabbccddeeff");
bitArray хранит длину в битах, что влияет на:
Пример:
var bits = sjcl.codec.utf8String.toBits("a");
Это не просто 1 символ, а:
| Кодек | Назначение | Особенности |
|---|---|---|
| UTF-8 | текст | работа с символами |
| HEX | байты в строке | читаемость |
| Base64 | компактное хранение | стандарт бинарных данных |
| Base64URL | URL-safe формат | без padding |
Типичные проблемы:
sjcl.codec.hex.toBits("zzzz"); // ошибка
HEX требует корректных символов 0-9, a-f.
sjcl.codec.base64.toBits(12345);
Кодек ожидает строку, а не число.
sjcl.codec.hex.toBits(
sjcl.codec.base64.fromBits(bits)
);
Без промежуточного перевода результат будет некорректным.
Типичный поток данных:
"message"
sjcl.codec.utf8String.toBits(...)
sjcl.encrypt(key, message)
JSON-структура с ciphertext
Обратное преобразование происходит в обратном порядке строго через соответствующие codec-методы.
SJCL позволяет строить гибкие конвейеры:
var hex = sjcl.codec.hex.fromBits(
sjcl.codec.utf8String.toBits("data")
);
var base64 = sjcl.codec.base64.fromBits(
sjcl.codec.hex.toBits(hex)
);
Каждый шаг превращает представление, но не теряет исходные биты при корректной цепочке.
Кодеки в SJCL выполняют не просто преобразование форматов, а роль адаптеров между:
bitArray является точкой консолидации всех этих представлений, а codec — механизмом входа и выхода из криптографического ядра библиотеки.