В Stanford JavaScript Crypto Library (SJCL) основная модель данных построена вокруг структуры bitArray — массива 32-битных слов с дополнительной информацией о количестве значащих бит. Такое представление отличается от привычных строк или Uint8Array и позволяет эффективно выполнять криптографические операции без лишних преобразований на уровне байтовых строк.
Однако для взаимодействия с внешним миром криптографические данные
часто требуется представлять в человекочитаемом виде. Один из наиболее
распространённых форматов — hexadecimal (шестнадцатеричная
система). В SJCL для этого используется модуль
sjcl.codec.hex.
Hex-кодирование обеспечивает компактное и однозначное представление
бинарных данных, где каждый байт отображается двумя символами от
0 до f.
Модуль sjcl.codec.hex предоставляет два основных
метода:
encode — преобразует bitArray в hex-строкуdecode — преобразует hex-строку обратно в bitArrayСигнатура функций:
sjcl.codec.hex.encode(bitArray)
sjcl.codec.hex.decode(hexString)
Обе операции работают строго с внутренним представлением SJCL и учитывают длину значимых бит, а не только кратность байтам.
Процесс кодирования заключается в последовательном извлечении байтов из bitArray и преобразовании каждого байта в двухсимвольное шестнадцатеричное представление.
Пример:
var data = sjcl.codec.utf8String.toBits("crypto");
var hex = sjcl.codec.hex.encode(data);
Результатом будет строка вида:
63727970746f
Каждая пара символов соответствует одному байту исходных данных.
Алгоритм кодирования можно описать следующим образом:
Важно учитывать, что SJCL хранит данные в 32-битных словах, поэтому кодек выполняет побайтовую декомпозицию слов.
Обратная операция выполняется методом decode. Он
принимает строку hex и восстанавливает исходное бинарное
представление.
Пример:
var hex = "63727970746f";
var bits = sjcl.codec.hex.decode(hex);
var text = sjcl.codec.utf8String.fromBits(bits);
Результат:
crypto
Строка должна соответствовать следующим условиям:
0-9, a-f,
A-F0xПри нарушении формата SJCL может выбросить исключение или вернуть некорректные данные.
Hex-строки могут быть как в верхнем, так и в нижнем регистре. SJCL не различает регистр при декодировании:
sjcl.codec.hex.decode("AAFF") === sjcl.codec.hex.decode("aaff")
Однако при кодировании стандартом считается использование строчных символов, так как это снижает визуальную нагрузку и соответствует большинству криптографических библиотек.
var hashBits = sjcl.hash.sha256.hash("message");
var hashHex = sjcl.codec.hex.encode(hashBits);
Результат — строка SHA-256 в шестнадцатеричном виде.
Hex часто используется для сериализации ключей:
var key = sjcl.random.randomWords(8);
var keyHex = sjcl.codec.hex.encode(key);
Позже ключ можно восстановить:
var restoredKey = sjcl.codec.hex.decode(keyHex);
Hex удобен для передачи бинарных данных в JSON:
var encrypted = sjcl.encrypt("password", "secret data");
Внутренние поля ciphertext могут быть преобразованы в hex для упрощения совместимости с системами, не поддерживающими base64 или binary.
SJCL поддерживает несколько кодеков:
sjcl.codec.hexsjcl.codec.base64sjcl.codec.utf8Stringsjcl.codec.bytesHex занимает промежуточное положение между компактностью и читаемостью.
Hex проще визуально анализировать, особенно при отладке криптографических данных.
SJCL хранит данные в формате:
[32-битные слова] + [битовая длина]
Hex-кодек выполняет трансформацию:
При декодировании происходит обратный процесс с последующей упаковкой байтов обратно в bitArray.
При работе с sjcl.codec.hex.decode возможны типовые
ошибки:
Некоторые версии SJCL возвращают исключение, другие — некорректный bitArray, поэтому рекомендуется предварительная валидация входных данных.
Hex-кодек в SJCL реализован на чистом JavaScript без нативных ускорений. Его производительность зависит от:
На практике узким местом он становится только при обработке больших массивов данных (мегабайты и более), где base64 показывает более высокую эффективность по памяти и скорости.
Hex-формат является универсальным стандартом и используется в:
SJCL обеспечивает строгую совместимость с классическим представлением hex без дополнительных префиксов, padding или разделителей.
console.log(sjcl.codec.hex.encode(hashBits));
state.signature = sjcl.codec.hex.encode(signatureBits);
var stored = JSON.stringify({
iv: sjcl.codec.hex.encode(iv),
ct: sjcl.codec.hex.encode(ciphertext)
});
Hex-кодек не интерпретирует текстовые данные. Он работает исключительно с bitArray. Поэтому преобразование текста всегда должно выполняться через:
sjcl.codec.utf8String.toBits
и обратно:
sjcl.codec.utf8String.fromBits
Hex является лишь промежуточным представлением этих бинарных данных.
Hex-кодек выполняет функцию низкоуровневого транспорта данных между криптографическими примитивами и внешними системами. Его использование оправдано в сценариях, где важны:
Он не является оптимальным с точки зрения объёма, но остаётся одним из самых предсказуемых и стабильных форматов представления бинарных данных.