Библиотека Jsrsasign активно работает с различными форматами представления криптографических ключей. Понимание различий между ними необходимо для корректной конвертации, импорта и экспорта ключевого материала.
Основные форматы:
PEM представляет собой Base64-кодированные данные DER с заголовками:
-----BEGIN RSA PRIVATE KEY-----
(base64)
-----END RSA PRIVATE KEY-----
DER — это тот же набор данных, но в бинарной форме.
В Jsrsasign конвертация между ними выполняется через утилиты:
var pem = KEYUTIL.getPEM(keyObj, "PKCS1PRV");
var derHex = KEYUTIL.getHexFromPEM(pem);
Обратное преобразование:
var pem = KEYUTIL.getPEMFromHex(derHex, "RSA PRIVATE KEY");
PKCS#1 используется исключительно для RSA и содержит структуру:
PKCS#8 является универсальным контейнером, поддерживающим:
Конвертация PKCS#1 → PKCS#8:
var keyObj = KEYUTIL.getKey(pemPKCS1);
var pemPKCS8 = KEYUTIL.getPEM(keyObj, "PKCS8PRV");
Обратное преобразование:
var keyObj = KEYUTIL.getKey(pemPKCS8);
var pemPKCS1 = KEYUTIL.getPEM(keyObj, "PKCS1PRV");
Публичный ключ может быть представлен:
Конвертация:
var keyObj = KEYUTIL.getKey(pkcs1PubPEM);
var x509PubPEM = KEYUTIL.getPEM(keyObj);
Jsrsasign по умолчанию экспортирует публичные ключи в формате X.509.
JWK используется в веб-протоколах (JWT, OAuth). Пример:
{
"kty": "RSA",
"n": "...",
"e": "AQAB",
"d": "..."
}
Импорт JWK:
var keyObj = KEYUTIL.getKey(jwkObject);
Экспорт в JWK:
var jwk = KEYUTIL.getJWKFromKey(keyObj);
Особенности:
Пример полного цикла:
// PEM PKCS#1 → объект
var keyObj = KEYUTIL.getKey(pemPKCS1);
// → PKCS#8
var pkcs8 = KEYUTIL.getPEM(keyObj, "PKCS8PRV");
// → JWK
var jwk = KEYUTIL.getJWKFromKey(keyObj);
// → обратно в PEM
var keyObj2 = KEYUTIL.getKey(jwk);
var pem = KEYUTIL.getPEM(keyObj2, "PKCS1PRV");
Для эллиптических кривых используется только PKCS#8:
var keyObj = KEYUTIL.getKey(ecPem);
var jwk = KEYUTIL.getJWKFromKey(keyObj);
Обратное преобразование:
var keyObj = KEYUTIL.getKey(jwk);
var pem = KEYUTIL.getPEM(keyObj, "PKCS8PRV");
PKCS#8 поддерживает шифрование:
-----BEGIN ENCRYPTED PRIVATE KEY-----
Импорт:
var keyObj = KEYUTIL.getKey(encryptedPem, "password");
Экспорт:
var pem = KEYUTIL.getPEM(keyObj, "PKCS8PRV", "password");
Поддерживаемые алгоритмы:
Jsrsasign оперирует ASN.1-структурами через hex-представление.
Пример извлечения DER:
var hex = KEYUTIL.getHexFromPEM(pem);
ASN.1 структура RSA:
SEQUENCE {
INTEGER (n)
INTEGER (e)
INTEGER (d)
...
}
Это позволяет:
Метод KEYUTIL.getKey() определяет формат
автоматически:
var keyObj = KEYUTIL.getKey(input);
Поддерживаемые входные типы:
Несоответствие формата:
Ошибки кодировки:
Пароли:
Приведение ключей к единому формату:
function normalizeKey(input) {
var keyObj = KEYUTIL.getKey(input);
return {
pem: KEYUTIL.getPEM(keyObj, "PKCS8PRV"),
jwk: KEYUTIL.getJWKFromKey(keyObj)
};
}
Jsrsasign выступает как универсальный адаптер между этими форматами.
После преобразования важно проверять ключ:
var keyObj = KEYUTIL.getKey(pem);
if (keyObj.isPrivate === true) {
// корректный приватный ключ
}
Для RSA:
if (keyObj.n && keyObj.e) {
// валидный ключ
}
keyObj используется как промежуточное
представлениеТакая архитектура позволяет легко интегрировать библиотеку в любые криптографические процессы, где требуется работа с различными форматами ключей.