Криптографические ключи в асимметричных алгоритмах представляют собой строго структурированные данные, описываемые не как произвольные строки, а как формализованные математические и ASN.1-конструкции. В контексте JavaScript-библиотеки Jsrsasign ключи рассматриваются через призму нескольких уровней представления: внутренние объекты алгоритмов, ASN.1-структуры, PEM-контейнеры и внешние стандарты PKCS и X.509.
Ключевой принцип асимметричной криптографии заключается в парности: открытый ключ используется для шифрования или проверки подписи, закрытый — для расшифрования или создания подписи. Однако на уровне реализации это не просто «два значения», а комплекс взаимосвязанных параметров.
Открытый ключ в RSA-системе математически сводится к двум основным компонентам:
RSA_{public} = (n, e)
В Jsrsasign этот набор обычно инкапсулируется в объект
RSAKey, где публичные параметры доступны как свойства
объекта или извлекаются через методы парсинга PEM/DER.
В стандарте X.509 публичный ключ не хранится «в чистом виде». Он упакован в структуру SubjectPublicKeyInfo:
ASN.1-структура выглядит следующим образом:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING
}
В Jsrsasign разбор этой структуры выполняется через
KEYUTIL.getKey(), который автоматически определяет формат и
возвращает объект с удобным интерфейсом.
После декодирования BIT STRING для RSA извлекаются:
Эти значения используются при операциях проверки подписи и шифрования.
Закрытый ключ RSA значительно более сложен. Он включает не только основной секретный показатель ( d ), но и дополнительные параметры для ускорения вычислений по теореме Китайской остатков:
RSA_{private} = (n, e, d, p, q, dP, dQ, qInv)
Эта структура соответствует стандарту PKCS#1 (RSAPrivateKey):
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER,
publicExponent INTEGER,
privateExponent INTEGER,
prime1 INTEGER,
prime2 INTEGER,
exponent1 INTEGER,
exponent2 INTEGER,
coefficient INTEGER
}
В Jsrsasign этот формат разбирается через ASN.1-парсеры
KJUR.asn1 и затем преобразуется в объект
RSAKey, где все параметры становятся доступными для
операций подписи и расшифрования.
Закрытые ключи в реальных системах почти никогда не хранятся напрямую в формате RSAPrivateKey. Вместо этого используется контейнер PKCS#8:
PrivateKeyInfo ::= SEQUENCE {
version Version,
privateKeyAlgorithm AlgorithmIdentifier,
privateKey OCTET STRING
}
PKCS#8 добавляет уровень абстракции:
Jsrsasign автоматически различает PKCS#1 и PKCS#8 при вызове:
KEYUTIL.getKey(pem)KEYUTIL.getPEM(keyObj, "PKCS8PRV")и выполняет вложенный разбор ASN.1 структуры.
PEM-формат не является криптографической структурой. Это лишь Base64-кодированная упаковка DER-данных с заголовками:
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
или
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
Jsrsasign при обработке PEM выполняет:
Таким образом PEM — это внешний слой, а реальная структура находится внутри DER.
Библиотека Jsrsasign использует объект RSAKey как
центральную модель RSA-ключа. Его поля включают:
n — BigInteger модульe — открытая экспонентаd — закрытая экспонентаp, q — факторыisPrivate — флаг наличия приватной частиДополнительно присутствуют оптимизационные параметры CRT:
dmp1dmq1coeffЭти поля позволяют ускорять операции подписи:
m_1 = m p,m_2 = m q
и последующее объединение результатов через китайскую теорему остатков.
Для эллиптических кривых структура отличается принципиально. Открытый ключ состоит из:
Q = d G
где:
В Jsrsasign ECDSA-ключи представляются через объект
KJUR.crypto.ECDSA, а параметры извлекаются из PKCS#8 или
SEC1 форматов.
SEC1 структура приватного ключа включает:
ECPrivateKey ::= SEQUENCE {
version INTEGER,
privateKey OCTET STRING,
parameters [0] EXPLICIT ECParameters OPTIONAL,
publicKey [1] EXPLICIT BIT STRING OPTIONAL
}
DER (Distinguished Encoding Rules) — это бинарная форма ASN.1. Все ключевые структуры (PKCS#1, PKCS#8, X.509) в конечном итоге кодируются в DER.
В Jsrsasign именно DER является промежуточным слоем между:
Парсинг DER осуществляется через ASN.1-дерево, где каждый узел имеет:
Помимо ASN.1 существует JSON Web Key (JWK), где структура ключа выражается JSON-объектом:
RSA:
{
"kty": "RSA",
"n": "...",
"e": "...",
"d": "...",
"p": "...",
"q": "..."
}
В Jsrsasign присутствует конвертация:
JWK упрощает интеграцию с web-API, но не заменяет ASN.1 внутри криптографического ядра.
Структура ключа напрямую влияет на алгоритмы:
s^e n
m^d n
CRT-оптимизация позволяет выполнять операции быстрее за счёт разбиения модуля на простые множители.
В Jsrsasign центральная точка входа для работы с ключами:
var key = KEYUTIL.getKey(pemString);
После этого объект может содержать:
Функция автоматически:
Структура ключа в Jsrsasign проходит несколько уровней:
Эта цепочка обеспечивает совместимость между криптографическими стандартами и JavaScript-реализацией.
Каждый элемент закрытого ключа связан с другими математическими соотношениями:
d e
где:
Эта зависимость гарантирует корректность восстановления исходного сообщения при расшифровании.
Структура ключей в Jsrsasign представляет собой многоуровневую систему, где каждый уровень — от ASN.1 до объектной модели JavaScript — отражает строго определённые криптографические стандарты и математические зависимости.