В криптосистеме DSA (Digital Signature Algorithm) ключевая пара состоит из приватного ключа x и публичного ключа y, которые вычисляются на основе параметров домена: простого числа p, подгруппы q и генератора g. В Jsrsasign работа с этими параметрами скрыта за высокоуровневыми API, но при необходимости их можно задавать явно и контролировать процесс генерации.
В библиотеке Jsrsasign генерация ключей DSA реализуется через
KEYUTIL.generateKeypair, а также через низкоуровневые
криптографические классы KJUR.crypto.
DSA требует заранее определённого набора доменных параметров:
y = g^x p
Эта формула определяет связь между открытой и закрытой частью ключа и является основой стойкости алгоритма.
Jsrsasign предоставляет высокоуровневую функцию, которая автоматически генерирует параметры и ключи:
const kp = KEYUTIL.generateKeypair("DSA", 2048);
В этом случае:
DSA — алгоритм2048 — размер p (битность)Библиотека самостоятельно подбирает параметры q и g в соответствии со стандартами FIPS 186-4.
Результат содержит объект:
{
prvKeyObj: ...,
pubKeyObj: ...
}
После генерации ключевой пары можно извлечь ключи:
const prv = kp.prvKeyObj;
const pub = kp.pubKeyObj;
Дальнейшая работа происходит через методы объектов:
prv.sign(...)pub.verify(...)или через сериализацию в PEM:
const prvPEM = KEYUTIL.getPEM(prv, "PKCS8PRV");
const pubPEM = KEYUTIL.getPEM(pub);
Jsrsasign позволяет задать параметры домена вручную, что важно для совместимости с внешними системами.
Пример задания параметров:
const param = {
p: "FCA682CE8E12CABA26EFCCF7110E526DB078B05EDECBCD1E...",
q: "962EDDCC369CBA8E1A3",
g: "678471B27A9CF44BD9F0A2E1..."
};
Генерация ключа с параметрами:
const kp = KEYUTIL.generateKeypair("DSA", 2048, param);
В этом режиме библиотека не генерирует доменные параметры, а использует предоставленные значения.
При создании DSA ключей Jsrsasign выполняет несколько шагов:
x (0, q)
y = g^x p
Качество случайного числа x критично для безопасности. Jsrsasign использует криптографически стойкий генератор случайных чисел (CSPRNG), встроенный в среду выполнения (Node.js или браузер).
Низкоуровневый доступ предоставляется через:
const dsa = new KJUR.crypto.DSAKey();
Далее можно задать параметры вручную:
dsa.setPublic(p, q, g, y);
dsa.setPrivate(x);
или использовать генерацию:
dsa.generateKeyPair();
Этот подход полезен при отладке или интеграции с нестандартными криптосистемами.
Jsrsasign поддерживает несколько стандартных размеров:
Размер q обычно:
Связь между параметрами влияет на криптостойкость и скорость операций подписи.
После генерации ключи можно экспортировать в стандартизированные форматы:
const pemPrv = KEYUTIL.getPEM(kp.prvKeyObj, "PKCS8PRV");
const pemPub = KEYUTIL.getPEM(kp.pubKeyObj);
Форматирование происходит с ASN.1 структурированием внутри библиотеки.
Jsrsasign поддерживает обратную операцию:
const keyObj = KEYUTIL.getKey(pemString);
Если PEM содержит DSA ключ, объект автоматически приводится к типу DSAKey.
DSA-подпись зависит не только от ключей, но и от выбранного хэш-алгоритма.
В Jsrsasign обычно используются:
Подпись формируется как пара значений (r, s), вычисляемых через модульные операции.
При необходимости можно создать параметры через генерацию простых чисел, но Jsrsasign делает это редко автоматически из-за высокой вычислительной стоимости.
Пример структуры:
const dsa = new KJUR.crypto.DSAKey();
dsa.generateParams(2048, 256);
После этого выполняется генерация ключевой пары.
При работе с DSA в Jsrsasign часто встречаются ограничения:
Также важно учитывать, что некоторые старые реализации требуют строго фиксированных параметров, иначе подпись не будет валидироваться.
В отличие от низкоуровневых библиотек, Jsrsasign:
Это делает DSA в Jsrsasign пригодным для прикладных задач, но менее гибким на уровне тонкой криптографической настройки по сравнению с OpenSSL.