Кривые семейства NIST (National Institute of Standards and Technology) представляют собой набор параметризованных эллиптических кривых, предназначенных для криптографического применения. Они широко используются в протоколах электронной подписи, шифрования и аутентификации, включая ECDSA, ECDH и другие алгоритмы на основе эллиптических кривых.
В библиотеке Jsrsasign поддержка этих кривых реализована на уровне работы с ключами, генерации подписей и проверки. Для корректного использования важно понимать структуру параметров и различия между конкретными кривыми.
Кривые NIST определены над конечным полем и имеют уравнение вида:
Для простых полей (prime field, GF(p)):
y² = x³ + ax + b (mod p)
Параметры кривой включают:
Параметры:
Особенности:
Параметры:
Особенности:
Особенности:
Параметры:
Особенности:
В Jsrsasign кривые задаются через строковые идентификаторы:
"secp256r1" (или "P-256")"secp384r1" (или "P-384")"secp521r1" (или "P-521")Пример генерации ключевой пары:
var ec = new KJUR.crypto.ECDSA({curve: "secp256r1"});
var keypair = ec.generateKeyPairHex();
Результат включает:
ecprvhex — приватный ключecpubhex — публичный ключКаждая кривая содержит фиксированную базовую точку G, используемую для генерации ключей:
Это умножение точки на скаляр — основа безопасности эллиптической криптографии.
Параметр n определяет количество точек в подгруппе, порождённой G.
Ключевые свойства:
Кофактор определяется как:
Где #E(Fp) — общее число точек на кривой.
Для кривых NIST:
Это означает отсутствие дополнительных подгрупп, что упрощает реализацию и повышает безопасность.
Кривые P-192 и P-224 считаются устаревшими и не рекомендуются для новых систем.
Jsrsasign реализует ECDSA с использованием выбранной кривой:
var sig = new KJUR.crypto.Signature({"alg": "SHA256withECDSA"});
sig.init({d: prvKeyHex, curve: "secp256r1"});
sig.updateString("message");
var signature = sig.sign();
Проверка подписи:
var sig = new KJUR.crypto.Signature({"alg": "SHA256withECDSA"});
sig.init({xy: pubKeyHex, curve: "secp256r1"});
sig.updateString("message");
var isValid = sig.verify(signature);
Кривые NIST прошли криптографическую экспертизу, однако в последние годы обсуждаются альтернативы (например, Curve25519), обладающие более прозрачными параметрами.
Библиотека использует:
Это позволяет эффективно выполнять операции даже в браузере.
Публичные ключи могут быть представлены в двух форматах:
04 || X || Y02/03 || XJsrsasign поддерживает оба формата, но по умолчанию использует uncompressed.
Кривые NIST используются в:
Jsrsasign обеспечивает совместимость с этими стандартами, что делает её удобной для веб-криптографии.
Jsrsasign позволяет добавлять пользовательские кривые через определение параметров, однако это требует глубокого понимания криптографии и не рекомендуется без необходимости.
Стандартные кривые NIST покрывают большинство практических задач и обеспечивают высокий уровень безопасности при корректной реализации.