Шестнадцатеричный (hex) формат — базовый способ представления бинарных данных в читаемом виде. В криптографических операциях, выполняемых с помощью библиотеки jsrsasign, практически все ключевые структуры — хэши, ключи, подписи, ASN.1-объекты — могут быть представлены в hex-формате.
Hex-строка состоит из символов 0–9 и a–f,
где каждая пара символов кодирует один байт. Это делает формат удобным
для:
В jsrsasign hex используется как промежуточный и часто как основной формат данных. Внутренние операции библиотеки ориентированы именно на hex, даже если входные данные задаются в виде строк или Base64.
Ключевые особенности:
Для преобразования текстовых данных в hex используется класс
rstrtohex или утилиты из пространства
KJUR.crypto.Util.
Пример:
var str = "Hello";
var hex = rstrtohex(str);
Результат:
48656c6c6f
Каждый символ строки преобразуется в соответствующий байт, затем кодируется в hex.
Для восстановления исходной строки используется функция
hextorstr:
var original = hextorstr("48656c6c6f");
Важно учитывать кодировку: функции работают с байтовыми строками, поэтому для Unicode может потребоваться дополнительная обработка.
Хэш-функции в jsrsasign возвращают результат именно в hex-формате.
Пример вычисления SHA-256:
var md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateString("data");
var hashHex = md.digest();
Результат:
3a6eb... (hex-строка)
Hex удобен для:
Подписи в jsrsasign формируются и возвращаются в hex:
var sig = new KJUR.crypto.Signature({alg: "SHA256withRSA"});
sig.init(privateKey);
sig.updateString("message");
var signatureHex = sig.sign();
Подпись — это бинарный блок, который в hex-формате становится пригодным для логирования и передачи.
ASN.1 — основа форматов сертификатов и ключей. В jsrsasign
используется класс ASN1HEX для работы с hex-представлением
ASN.1.
Пример:
var hex = "3082010a0282010100...";
var value = ASN1HEX.getV(hex, 0);
Здесь:
hex — полная ASN.1 структураgetV извлекает значение узлаHex используется как универсальный способ представления ASN.1-дерева.
Часто требуется преобразование hex в Base64 и обратно.
Hex → Base64:
var b64 = hextob64(hex);
Base64 → Hex:
var hex = b64tohex(b64);
Это важно при работе с PEM-форматами, где данные кодируются в Base64, но внутри библиотеки обрабатываются как hex.
RSA и EC ключи могут быть представлены в hex-формате, особенно на уровне компонентов.
Пример для RSA:
var rsa = new RSAKey();
rsa.setPublic(nHex, eHex);
Hex используется для точного контроля над значениями без дополнительных кодировок.
Hex позволяет удобно выполнять операции на уровне байтов:
Пример сравнения:
if (hex1 === hex2) {
// данные совпадают
}
Такое сравнение эквивалентно сравнению бинарных массивов.
Hex-строка должна:
Проверка:
function isHex(s) {
return /^[0-9a-fA-F]+$/.test(s) && s.length % 2 === 0;
}
Некорректные hex-данные приводят к ошибкам при криптографических операциях.
Неправильная кодировка строк
JavaScript строки — UTF-16, а криптография работает с байтами. Прямое преобразование может привести к искажению данных.
Потеря ведущих нулей
Hex-строки могут терять ведущие 00, что меняет смысл
данных (особенно в ключах).
Смешивание форматов
Использование Base64 вместо hex без явного преобразования вызывает ошибки.
Hex активно используется в следующих сценариях:
Основные функции:
rstrtohex — строка → hexhextorstr — hex → строкаhextob64 — hex → Base64b64tohex — Base64 → hexДополнительно:
KJUR.crypto.Util содержит вспомогательные методыASN1HEX предоставляет доступ к структурамHex выполняет роль универсального “языка” для представления данных внутри библиотеки. Он обеспечивает:
Понимание hex-представления является ключевым для эффективной работы с jsrsasign и криптографией в JavaScript в целом.