Криптографическая библиотека SJCL (Stanford Javascript Crypto Library) опирается на набор стандартизированных эллиптических кривых, применяемых в алгоритмах ECDH и ECDSA. В реализации библиотеки выделяются три основные кривые: c256, c384 и c521. Эти обозначения соответствуют различным уровням криптографической стойкости и параметрам NIST P-curve семейства.
Эллиптическая кривая в контексте SJCL определяет математическое пространство, в котором выполняются операции над точками при генерации ключей, вычислении общего секрета и создании цифровых подписей. Каждая кривая задаёт:
Внутри SJCL кривые реализованы как параметры, используемые модулем
sjcl.ecc.curves, где каждая конфигурация инкапсулирует
полный набор характеристик для криптографических операций.
Кривая c256 соответствует стандартизированной NIST P-256 (secp256r1 / prime256v1). Она является наиболее часто используемой в прикладной криптографии благодаря оптимальному балансу между производительностью и стойкостью.
В SJCL данная кривая применяется по умолчанию во многих сценариях, включая ECDH-обмен ключами и ECDSA-подпись.
В JavaScript-реализации SJCL c256 оптимизирована под:
Кривая подходит для веб-приложений, где критична скорость выполнения криптографических операций.
Кривая c384 соответствует NIST P-384 (secp384r1). Она относится к классу более устойчивых криптографических систем и используется в сценариях с повышенными требованиями к безопасности.
В SJCL c384 применяется в системах, где требуется долговременная криптографическая стойкость. Это включает:
Цена повышения безопасности выражается в снижении производительности по сравнению с c256, поскольку операции над 384-битными числами требуют больше вычислительных ресурсов в JavaScript-среде.
Кривая c521 соответствует NIST P-521 и представляет собой один из наиболее криптографически стойких вариантов, реализованных в SJCL.
Кривая P-521 использует поле простых чисел вида 2⁵²¹ - 1 с дополнительными корректировками, что делает арифметику более сложной в программной реализации. В JavaScript это особенно заметно из-за отсутствия аппаратной поддержки больших целых чисел на уровне процессора.
c521 применяется в сценариях, где безопасность доминирует над производительностью:
Различия между кривыми в SJCL можно рассматривать через три ключевых аспекта: безопасность, производительность и область применения.
Рост безопасности нелинеен и связан с экспоненциальным увеличением сложности дискретного логарифмирования в группе точек эллиптической кривой.
В JavaScript-среде производительность резко зависит от размера чисел:
Основные операции, влияющие на скорость:
В библиотеке SJCL каждая кривая инкапсулируется объектом с параметрами, доступным через:
sjcl.ecc.curves.c256sjcl.ecc.curves.c384sjcl.ecc.curves.c521Каждый объект содержит:
Процесс генерации ключевой пары зависит от выбранной кривой. Внутри SJCL используется криптографически стойкий генератор случайных чисел для выбора приватного ключа d, после чего вычисляется публичный ключ Q = d × G.
Различие кривых напрямую влияет на:
Все три кривые поддерживаются для обмена ключами. Совместный секрет вычисляется как:
где выбор кривой определяет размер и стойкость результата.
Подписи в SJCL зависят от выбранной кривой через параметры группы. Более крупные кривые увеличивают устойчивость к атакам на дискретный логарифм, но замедляют процесс подписи и проверки.
Выбор между c256, c384 и c521 определяется балансом между вычислительными ресурсами и требуемым уровнем защиты.
Каждая кривая представляет собой компромисс между скоростью вычислений и криптографической стойкостью, реализованный в рамках единой архитектуры SJCL.