Сложение и умножение точек через публичный API

Сложение точек на эллиптических кривых в 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 скрывает эти детали, предоставляя методы высокого уровня, но поведение остаётся строго соответствующим математической модели группы.

Операция сложения через публичный API

Сложение точек выполняется напрямую через метод 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). Вместо этого применяется бинарное разложение:

  • если бит числа равен 1 — добавляется текущая точка
  • на каждом шаге точка удваивается

Пример логики:

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 использует разные формы координат:

  • аффинные координаты — понятное математическое представление (x, y)
  • якобианские координаты — оптимизация для уменьшения числа операций инверсии

При выполнении add и mult библиотека автоматически переводит точки во внутреннее представление:

var P = curve.G.mult(7);
var Q = curve.G.mult(11);

var R = P.add(Q);

Фактически внутри:

  • точки преобразуются в Jacobian form
  • операции выполняются без дорогостоящих делений в поле
  • результат приводится обратно к аффинной форме при необходимости

Проверка равенства точек

Для сравнения используется метод:

if (P.equals(Q)) {
    // точки совпадают
}

Сравнение учитывает не только координаты, но и нормализацию представления, что важно при работе с якобианскими координатами.

Типичные сценарии использования операций

Сложение и умножение точек в SJCL применяется в:

  • генерации публичных ключей
  • протоколах ECDH
  • схемах цифровой подписи (ECDSA)
  • построении производных ключей

Пример получения публичного ключа:

var curve = sjcl.ecc.curves.c256;
var priv = new sjcl.bn.random(curve.r);

var pub = curve.G.mult(priv);

Здесь операция mult связывает приватный и публичный ключ через групповую структуру.

Особенности реализации в SJCL

Внутренние особенности, влияющие на поведение операций:

  • все вычисления происходят в фиксированном конечном поле
  • используется постоянное время выполнения (constant-time) для защиты от timing-атак
  • операции перегружены в объектной модели JavaScript
  • отсутствуют побочные эффекты при операциях с точками

Каждая операция возвращает новый объект, не изменяя исходные точки:

var R = P.add(Q); // P и Q остаются неизменными

Такой подход исключает ошибки, связанные с мутацией состояния, и упрощает построение криптографических протоколов на основе библиотеки.