Сложение точек на эллиптических кривых в SJCL реализовано как часть абстракции группы точек, где каждая точка является объектом с методами групповых операций. В основе лежит стандартная модель эллиптической кривой над конечным полем, используемая в криптографии с открытым ключом.
В библиотеке SJCL точка на эллиптической кривой представляется объектом, создаваемым через параметры конкретной кривой:
var curve = sjcl.ecc.curves.c256;
var G = curve.G;
G — базовая точка (генератор группы), из которой
строятся все остальные элементы группы. Любая точка, полученная в
результате операций, сохраняет принадлежность к той же кривой и обладает
теми же параметрами поля.
Точка в SJCL — это не просто пара координат, а полноценный объект с методами:
add(P) — сложение точекmult(k) — скалярное умножениеnegate() — получение противоположной точкиisValid() — проверка корректности точкиtoJac() / fromJac() — переход в
якобианские координаты (внутренняя оптимизация)Сложение точек на эллиптической кривой определяется геометрически:
В алгебраической форме операции выполняются в конечном поле modulo p, где p — характеристика поля кривой.
SJCL скрывает эти детали, предоставляя методы высокого уровня, но поведение остаётся строго соответствующим математической модели группы.
Сложение точек выполняется напрямую через метод add:
var curve = sjcl.ecc.curves.c256;
var P = curve.G.mult(3);
var Q = curve.G.mult(5);
var R = P.add(Q);
Здесь происходит сложение двух точек, каждая из которых получена скалярным умножением генератора.
Важно, что операция:
P.add(Q) === Q.add(P)(P.add(Q)).add(R) === P.add(Q.add(R))Точка на бесконечности в SJCL представляется специальным объектом и играет роль нуля группы.
Скалярное умножение является базовой операцией для криптографии на эллиптических кривых:
var curve = sjcl.ecc.curves.c256;
var P = curve.G;
var k = 12345;
var Q = P.mult(k);
Операция mult реализует повторное сложение точки самой с
собой по двоичному алгоритму (double-and-add), оптимизированному для
больших чисел.
Внутри SJCL:
k переводится в big integer представлениеСкалярное умножение фактически строится на операции сложения:
kP = P + P + ... + P (k раз)
Однако прямое выполнение такого выражения не используется из-за сложности O(k). Вместо этого применяется бинарное разложение:
Пример логики:
function naiveMult(P, k) {
var R = null;
for (var i = 0; i < k; i++) {
R = R ? R.add(P) : P;
}
return R;
}
SJCL заменяет это на эффективную реализацию внутри
mult.
Точка на бесконечности участвует во всех операциях как нулевой элемент:
var curve = sjcl.ecc.curves.c256;
var P = curve.G;
var O = curve.point(null, null); // условное представление бесконечности
var R = P.add(O); // R === P
При сложении с нейтральным элементом результат всегда равен исходной точке.
Вместо отдельной операции вычитания используется отрицание:
var P = curve.G.mult(10);
var Q = curve.G.mult(4);
var R = P.add(Q.negate());
Метод negate() инвертирует координату y точки
относительно оси x, что соответствует групповому обратному элементу.
Свойства:
P.add(P.negate()) даёт точку на бесконечностиnegate().negate() возвращает исходную точкуДля ускорения вычислений SJCL использует разные формы координат:
При выполнении add и mult библиотека
автоматически переводит точки во внутреннее представление:
var P = curve.G.mult(7);
var Q = curve.G.mult(11);
var R = P.add(Q);
Фактически внутри:
Для сравнения используется метод:
if (P.equals(Q)) {
// точки совпадают
}
Сравнение учитывает не только координаты, но и нормализацию представления, что важно при работе с якобианскими координатами.
Сложение и умножение точек в SJCL применяется в:
Пример получения публичного ключа:
var curve = sjcl.ecc.curves.c256;
var priv = new sjcl.bn.random(curve.r);
var pub = curve.G.mult(priv);
Здесь операция mult связывает приватный и публичный ключ
через групповую структуру.
Внутренние особенности, влияющие на поведение операций:
Каждая операция возвращает новый объект, не изменяя исходные точки:
var R = P.add(Q); // P и Q остаются неизменными
Такой подход исключает ошибки, связанные с мутацией состояния, и упрощает построение криптографических протоколов на основе библиотеки.