В библиотеке Stanford JavaScript Crypto Library криптографические ключи на эллиптических кривых строятся вокруг математической структуры, в которой безопасность основана на задаче дискретного логарифмирования в группе точек эллиптической кривой. Каждая ключевая пара состоит из закрытого скалярного значения и открытой точки на кривой.
В SJCL поддерживаются стандартные кривые, определённые через предустановленные параметры:
sjcl.ecc.curves.c256sjcl.ecc.curves.c384sjcl.ecc.curves.c521Каждая из них соответствует определённому уровню криптографической
стойкости и длине ключа. На практике чаще всего используется
c256, соответствующая 256-битной кривой.
Ключевая пара в SJCL включает два компонента:
Закрытый ключ
xОткрытый ключ
P = x * G(x, y)В терминах SJCL открытый ключ представлен объектом точки
(sjcl.ecc.point), а закрытый — объектом секрета
(sjcl.bn или внутренний тип библиотеки).
Генерация ключей полностью зависит от качества источника энтропии. SJCL использует встроенный генератор:
sjcl.random
Он должен быть предварительно инициализирован внешней энтропией (движения мыши, события клавиатуры или системные источники). Без достаточной энтропии генерация ключей считается криптографически небезопасной.
Ключевой момент: если sjcl.random находится в состоянии
READY, генерация ключей может выполняться корректно.
Основной механизм генерации ключевой пары в SJCL реализован через
модуль elGamal или ecdsa, в зависимости от
сценария использования.
// выбор кривой
const curve = sjcl.ecc.curves.c256;
// генерация ключевой пары
const keypair = sjcl.ecc.elGamal.generateKeys(curve);
// извлечение закрытого ключа
const privateKey = keypair.sec;
// извлечение открытого ключа
const publicKey = keypair.pub;
При вызове generateKeys происходит следующая
последовательность действий:
Запрашивается криптографически стойкое случайное число
x
Проверяется, что x находится в диапазоне
[1, n-1], где n — порядок группы
Выполняется умножение точки генератора кривой:
P = x * GФормируется объект публичного ключа как точка
(Px, Py)
Закрытый ключ сохраняется как скаляр x
console.log(privateKey.get());
Результатом будет большое число, представленное в формате внутреннего big number.
console.log(publicKey.x.toString());
console.log(publicKey.y.toString());
Открытый ключ всегда состоит из двух координат точки на кривой. SJCL хранит их как элементы конечного поля.
При использовании схемы Диффи-Хеллмана на эллиптических кривых ключи генерируются тем же способом, но затем применяются для вычисления общего секрета.
const alice = sjcl.ecc.elGamal.generateKeys(sjcl.ecc.curves.c256);
const bob = sjcl.ecc.elGamal.generateKeys(sjcl.ecc.curves.c256);
const secretAlice = alice.sec.dh(bob.pub);
const secretBob = bob.sec.dh(alice.pub);
Оба значения secretAlice и secretBob
совпадают, так как вычисляются как:
S = xA * xB * G
Закрытый ключ не сериализуется автоматически. Для хранения требуется явное преобразование в строку:
const sk = privateKey.get().toString();
SJCL использует объектно-ориентированную модель:
sjcl.ecc.elGamal.publicKeysjcl.ecc.elGamal.secretKeyОни инкапсулируют математические операции над кривой.
Ключ строго связан с параметрами кривой. Нельзя использовать
публичный ключ, сгенерированный на c256, в контексте
c384.
Ключевой фактор устойчивости системы — корректная инициализация генератора случайных чисел.
Типичная ошибка:
sjcl.randomКорректная схема инициализации:
sjcl.random.startCollectors();
// ожидание состояния READY
sjcl.random.addEventListener("ready", function () {
const keys = sjcl.ecc.elGamal.generateKeys(sjcl.ecc.curves.c256);
});
Открытый ключ может быть преобразован в сериализованный формат:
SJCL по умолчанию оперирует внутренним представлением, поэтому внешнее кодирование требует ручной реализации.
Упрощённая структура ключевой пары:
{
pub: {
x: BigInt,
y: BigInt,
curve: Object
},
sec: {
x: BigInt (private scalar)
}
}
Фактически структура более сложная, но логически соответствует этой модели.
В основе генерации лежит операция:
P = xG
где:
G — базовая точка кривойx — закрытый ключP — публичный ключОперация выполняется через последовательные удвоения и сложения точек в конечном поле.
Криптографическая стойкость зависит от:
xSJCL реализует базовые алгоритмы без аппаратного ускорения, что делает её подходящей для учебных и прикладных сценариев, но не для высоконагруженных HSM-систем.