Практика показывает, что многие лучше понимают математические концепции криптографии на максимально конкретных примерах, приводимых в числах непосредственно. Цель данной статьи - выстроить таким способом некоторую «интуицию» для одной из базовых в современной криптографии операций - сложения точек эллиптической кривой. Мы посмотрим, что за арифметика стоит за алгоритмическими, компьютерными реализациями этой операции.

В статье используются только самые элементарные методы, а именно - арифметика остатков, не более того. Поэтому проверить всё можно буквально на калькуляторе. Для понимания достаточно минимального знакомства с математикой, на уровне средней школы. Но из этого не следует делать вывод, что исходный вопрос вообще элементарный - доказать используемыми методами, да в рамках небольшой статьи, что-то про то, почему всё работает, не выйдет. Впрочем, некоторые сведения об общетеоретических вещах даются в виде небольших лирических отступлений. Пожалуй, и к лучшему.

Обычно, рассказ о сложении точек эллиптической кривой иллюстрируют непрерывным случаем, когда координаты - действительные числа (\mathbb{R}\times\mathbb{R}). Но ни калькуляторы, ни компьютеры не могут работать с действительными числами, поэтому непрерывный случай, пусть и хорошо понятен тем, кто любит матанализ, иногда вызывает ещё больше вопросов. (Кроме того, в действительных координатах всё, что непрерывно и не параллельно, пересекается, вот только записать координаты точек пересечения точно почти всегда невозможно, что, к сожалению, вызывает странные трактовки, когда координаты обрабатываются как приблизительные значения.)

Посмотрим, как точки эллиптических кривых складываются в прикладной криптографии точно. Эллиптическая кривая здесь - это пары значений, удовлетворяющих некоторому уравнению. Определение достаточно общее, чтобы работать для всех эллиптических кривых. Ниже - пример уравнения, соответствующего эллиптической кривой (для разнообразия - в форме Монтгомери; но не пугайтесь - это всё дежурные оговорки, они не усложняют изложение).

y^2 = x^3 + 58 ⋅ x^2 + x

Это уравнение использует две операции: сложение и умножение (возведение в степень - это здесь повторное умножение, так как показатель всегда натуральное число). Можно считать, что для вычисления используется некоторый калькулятор, реализующий сложение, умножение, а кроме того - вычитание и деление, о которых ниже. Это, буквально, так и есть, поскольку на практике всё и работает на компьютере. Важное замечание: все вычисления здесь выполняются по модулю некоторого простого числа. Например, по модулю 503. "По модулю" (mod 503) - означает, что это (положительные) остатки от деления на 503 {0,1,...,502}.

Общий вид уравнения в форме Монтгомери такой: B⋅y^2 == x^3 + A⋅x^2 + x. У нас B == 1, A == 58 (см. выше). Оба значения - входят в множество остатков (mod 503). Не всякую эллиптическую кривую можно представить в форме Монтгомери, но, если B == 1, то эта форма оказывается очень удобной во многих задачах, когда нужно работать с пространствами кривых: так как получается, что все подходящие кривые индексируются одним параметром - A. Впрочем, в нашем примере кривая только одна, как и модуль - 503.

Всякое натуральное число можно отождествить с остатком от деления этого числа на 503. Например, 1023 == 2⋅503 + 17, то есть, остаток 17, а это означает, что 1023 == 17 (mod 503). Число 503 - простое. Поэтому остатки образуют структуру, называемую полем: например, здесь есть нейтральный элемент по сложению (0), нейтральный по умножению (1), у всякого элемента есть обратный по сложению, а у элементов кроме нуля - обратный по умножению. То есть, можно вычитать и делить привычным образом, оставаясь в пределах множества элементов поля. Так, 486 + 17 == 503 или 0 (mod 503), то есть, 17 == -486. То же с умножением: 274 == 1/123 (mod 503) - это обратные элементы по умножению (в алгебре не принято рассматривать деление как обособленную операцию, - к тому же, некоммутативную, - обычно говорят об «умножении на обратный элемент»). Почему 123 - обратный по умножению для 274, если рассматривать по модулю 503? Потому что 274⋅123 == 33702, а это число даёт остаток единица при делении на 503, так как 33702 = 67⋅503 + 1.
Дальше эта конструкция будет называться \mathbb F_{503}. (Строгое определение поля начинается с кольца - всякое поле является кольцом, - и, соответственно, требует двух коммутативных групп, дистрибутивности, их связывающей, и т.д. - в нашем случае это всё пропущено здесь, потому что автоматом приходит вместе со "школьной" арифметикой остатков, но будет вновь использовано ниже при обсуждении группы точек кривой.)

Не всякое уравнение такого вида соответствует эллиптической кривой. Кривая должна быть неособой, на коэффициенты накладываются дополнительные условия: нет кратных корней и т.д. Эти детали мы не рассматриваем, но уравнение, выбранное для примера, эллиптическую кривую задаёт.

Итак, если по осям отложить остатки (mod 503) и нарисовать график y^2 = x^3 + 58⋅x^2 + x, то получится следующая картинка:

Точки кривой
Точки кривой

Подстановка некоторых подходящих элементов нашего \mathbb F_{503} вместо х и y в уравнение - сохраняет равенство. То есть, под умножением и сложением имеются в виду операции поля, которое мы определили выше. Проверяем: пусть пара элементов (x,y) == (3,7) задают точку нашей кривой. Подставим их в уравнение. Правая часть: 3^3 + 58⋅3^2 + 3 == 552 или 49 (mod 503). 49 это квадрат в \mathbb F_{503}. Подставляем в левую часть: 7⋅7 == 49 - сходится, 7 - тоже элемент \mathbb F_{503}.

Если здесь возникает «вопрос абстракции», сводящийся к тому, что как же это так - элементы какого-то поля, структуры абстрактной, да ещё и для эллиптической кривой, вдруг стали числами, - то считайте, что элементы просто нумеруются натуральными числами, а к индексам применяется операция взятия остатка. Количество элементов поля - всегда степень простого числа, это можно понять из комбинаторных соображений (нужны однозначные обратные элементы, дистрибутивность и пр.). Но вообще, система вычетов по модулю 503 полностью эквивалентна конечному полю из 503 элементов (которое, в этом смысле, единственно). 503 - это простое число в первой степени. Поля, для которых степень будет больше единицы, в виде остатков от деления натуральных чисел представить нельзя, но можно представить в виде остатков от деления многочленов. Такие поля имеют свои особенности и тоже широко используются в криптографии, но здесь не рассматриваются. (А ловля объекта, который называют «полем из одного элемента», - вообще является самой большой целью современной теоретической математики; так сказать, ответом на главный вопрос. Другая история, впрочем.)

Ещё пример точки кривой: пара (444, 22). Опять же, нетрудно проверить на калькуляторе: 444^3 + 58⋅444^2 + 444 == 98962716 == 196744⋅503 + 484 - то есть, остаток 484 - это элемент, соответствующий правой части уравнения нашей кривой (mod 503). 22⋅22 == 484. Сходится.

Из графика на картинке видно, что не каждая пара элементов \mathbb F_{503} задаёт точку на нашей кривой. Более того, картинка с точками обладает некоторой симметрией: хорошо видна горизонтальная «ось», вокруг которой можно картинку перевернуть. Это объясняется тем, что в левую часть уравнения значение y входит в квадрате. В выбранной арифметике это означает, что у квадрата два квадратных корня: -y и +y. Например, если есть точка (444, 22), то есть и точка (444, -22). Нетрудно проверить: (-22)^2 == 484.

Скажете, что у нас же нет -22? Но это лишь обратный по сложению к 22, то есть, 481 в нашей системе положительных вычетов. Проверяем: 481 + 22 == 503 == 0 (mod 503); 481⋅481 == 231361 == 459⋅503 + 484. Сходится. Так что сверху и снизу - те самые обратные точки, которые нам потребуются для понимания структуры алгебраической группы, позволяющей воспользоваться сложением точек для криптографических целей. (Лирическое отступление: если вы вдруг подумали, что алгебраическая группа здесь это «абстрактная» группа, то вы ошиблись: группа здесь будет «алгебраическая» потому, что она часть эллиптической кривой, то есть, выражаясь несколько более техническим языком, введена на алгебраическом многообразии, а проще говоря - как бы «нарисована».)

Таким образом, непрерывности здесь нет. Кривая над конечным полем не может быть непрерывной, в фундаментальном для матанализа смысле. Всё максимально дискретно и работает в натуральных числах. Именно так эллиптические кривые и представлены при типовых криптографических вычислениях, например, в ECDSA. Только числа - существенно больше. Понятно, что для числа 503 можно очень быстро перебрать все варианты, чтобы отыскать ту или иную точку при произвольных начальных условиях - будь то дискретный логарифм (см. ниже) или ещё что-то. В реальных криптосистемах арифметика такая же, но числа больше. Так, комплект параметров для самой массовой кривой P-256, в качестве модуля, задающего подлежащее поле, использует не 503, а следующее простое число:

115792089210356248762697446949407573530086143415290314195533631308867097853951

- это 256 бит разрядности, но в остальном - всё то же, как и в случае нашей игрушечной кривой. Естественно, нашу кривую нельзя использовать для реализации практической ECDSA, и не только по причине малой разрядности, но и из-за того, что 460 == 2⋅2⋅5⋅23, а вот P-256 - использовать можно. Но P-256 не получилось бы нарисовать - слишком много точек: примерно, 2^256, так что для хранения картинки не хватило бы места (вообще, часто говорят, что не хватило бы времени для вычисления точек, но это не так на практике - место для хранения закончится гораздо раньше). На нашей игрушечной кривой - 460 точек, включая «точку на бесконечности», которая тоже потребуется ниже.

Мы разобрались с представлением кривой, но всё ещё не добрались до сложения точек. Во-первых, складывать точки так, чтобы получались другие точки, можно на всякой эллиптической кривой. Это определяющее свойство таких кривых, глубоко связанное с максимально абстрактной современной теорией. Именно потому, что это свойство - определяющее, оно и работает над конечными полями тоже. Работает, несмотря и на то, что иллюстрировать его предпочитают в непрерывном «сеттинге», и на то, что в теоретической математике эллиптические кривые принято изучать над комплексными числами (впрочем, это обычный приём, а самые содержательные результаты при этом касаются чисел рациональных и даже только целых). Во-вторых, когда говорят о сложении точек, то подразумевают, что точки образуют коммутативную группу, которая, в структурном смысле, представляет собой часть из структур поля, рассмотренного выше.

Так что «непрерывная» геометрическая интуиция на конечное поле не переносится. Здесь используются алгебраические построения, а проще говоря - координаты вычисляются по формулам. Конечно, те же методы, с уравнениями, могут быть применены и для непрерывного случая, но в дискретном - интуитивной замены им нет.

Мы уже неявно ввели все свойства группы при вычислениях с остатками выше, но, всё же, их придётся описать чуть более строго. Группа здесь - это множество (то есть, набор точек кривой) с бинарной операцией, которая ставит в соответствие двум точкам - третью. То есть, по координатам одной пары точек нужно вычислить координаты результирующей точки, сохранив некоторые правила. В этом весь смысл.

Чтобы получить группу, нужен нейтральный элемент - то есть, нуль, ведь речь о сложении точек. У каждого элемента должен быть обратный, относительно операции, и операция должна быть ассоциативна. А кроме того, в данном случае, операция ещё и коммутативна. Что это всё означает? Будем обозначать операцию знаком «плюс» (+). Нейтральный элемент, O, это элемент, который «не меняет результат»: P + O == P == O + P, для всякой точки кривой P. Если не потребовать существования нейтрального элемента, то нужной нам арифметики не построить. Ближайший и понятный аналог - обычный ноль по сложению в целых числах (см. про арифметику остатков выше). Однако в случае эллиптических кривых над конечным полем нейтральный элемент, технически, не так просто определяется: ведь точка тут - это пара координат. Примем, как это обычно происходит, в качестве нейтрального элемента точку «на бесконечности», будем записывать её координаты как пустую пару (). Почему выбирают «точку на бесконечности»? Потому что в математике, если чего-то нет, но оно очень нужно, это «чего-то» можно ввести. А вообще - это связано с универсальностью проективной геометрии: с проективной кривой проще работать, в чём мы ниже убедимся даже на этом простом примере. Да, в качестве нейтрального элемента можно выбрать другую точку, но тогда и группа, в общем случае, может получиться «ещё более другой» (этот аспект как раз имеет большое теоретическое значение).

Теперь обратный элемент. Если M есть обратная точка к N, то их сумма равна O (нейтральному элементу, ()): M + N == O. То есть, в наших обозначениях, M - это -N. Самый простой момент, но он важный: обратная точка получается из заданной простым переключением координаты y, то есть: -(x, y) == (x, -y). Это используется ниже несколько раз.

Ассоциативность необходима не только для структуры группы, но и для содержательной реализации алгоритмов. Ассоциативность - это про произвольную расстановку скобок. В случае трёх точек записывается так: (P + Q) + R == P + (Q + R). С одной стороны, это аналог привычных свойств того же сложения в целых числах и операций с остатками выше. С другой стороны, чтобы лучше понять принцип именно с точки зрения алгоритмов и программирования - имеет смысл посмотреть на «функциональную» запись для трёх точек: f(f(P,Q), R) == f(P, f(Q,R)) - это неявно используется ниже в основной формуле сложения точек.

Коммутативность: P + Q == Q + P, то есть, сумма точек «в одну сторону» равна сумме «в другую». Это означает, что действие формул для координат должно сохраняться при перестановке точек местами.

Доказательств здесь не приводится, но, естественно, если подходить строго, то всё выше перечисленное требуется доказывать. Например, со строгим доказательством ассоциативности «элементарными методами» придётся повозиться.

Ниже нам потребуется основная формула для сложения точек, которая основана на свойствах операции сложения: если P + Q == R, то, в терминах группы, это означает, что P + Q - R == O (нейтральному элементу, с «пустыми» координатами).

На эллиптической кривой всегда есть группа. В этом и преимущество. Строго говоря, структура группы точек для конкретной кривой определяется выбором нейтрального элемента, но это совсем теоретическая математика, так что будем просто считать, что группа одна, но с точностью до перенумерации точек (от этого уже так просто увернуться не получится). Вообще, группу можно ввести и при помощи таблицы, записав точки в соответствии с тем, какая из каких получается. Практическая проблема на этом пути возникнет с тем, что для больших групп таблица не влезет в память компьютера, точно так же, как и картинка упомянутой выше кривой P-256.

Так что нужны компактные (замкнутые и ограниченные, да) формулы, переводящие координаты слагаемых точек в координаты суммы. Формулы над конечным полем выводятся из тех же соображений, которые лежат в основе метода секущих и касательных, применяемого в непрерывном случае. А конкретный вид формул зависит от используемых координат, от выбранной формы уравнения кривой, от самой кривой и т.д.

Именно вокруг конкретных формул вычисления координат вертятся чисто алгебраические методы оптимизации реализаций криптосистем. Мы не станем прямо сейчас выводить формулы, а воспользуемся уже готовым вариантом для кривой в форме Монтгомери, однако после нахождения координат суммы - найдём формулу «прямой» над \matbb F_{503}, которому удовлетворяют точки P, Q и -R, и из этого станет понятно, откуда взялись исходные формулы, почему они так выглядят.

Итак, при сложении точек P и Q, необходимо различать два случая:

  1. точки не совпадают - то есть, сложение различных точек, P != Q;

  2. удвоение точки - точки совпадают, P == Q: сложение точки с самой собой.

Наше уравнение кривой имеет вид y^2 == B⋅x^3 + A⋅x^2 + x (Монтгомери). Формулы в общем виде для первого случая, P != Q, точка R - результат.

X_r == B⋅k^2 - (X_p + X_q) - A;
Y_r == k⋅(X_p - X_r) - Y_p;

где k == (Y_q - Y_p)/(X_q - X_p).

Обратите внимание на небольшую оптимизацию: в формуле для координаты Y суммы используется значение координаты X суммы (X_r), оно вычислено раньше.

Если у нас обратные точки, то их сумма должна быть равна O (координаты ()). «Обратные», как мы выяснили выше, означает, что у точек равны координаты X. То есть, знаменатель в формуле для k обращается в нуль, при ненулевом числителе. По определению из этого следует, что суммой является нейтральный элемент. Кстати, почему нейтральный элемент мы не можем обозначить, как точку (0,0)? Потому что (0,0) - лежит на кривой y^2 = x^3 + 58*x^2 + x, ведь 0^2 == 0 (тоже по определению).

Для второго случая, удвоение точки, P == Q, формулы координат те же, но другое выражение для параметра k:

k == (3⋅X_p^2 + 2⋅A⋅X_p + 1)/(2⋅B⋅Y_p)

- здесь X_p == X_q; Y_p == Y_q.

Удвоение точки постоянно используется на практике. Например, на нём основано быстрое умножение на секретные значения в реализациях протокола Диффи-Хеллмана.

Итак, все операции - это операции сложения и умножения в подлежащем поле. Да, в записи есть вычитание и деление, но в нашем случае это сложение с обратным по сложению и умножение на обратный по умножению. Опять получается базовый «калькулятор». Это гарантирует, что результат любого сочетания операций тоже будет элементом нашего поля. За пределы поля могло бы вывести, например, извлечение квадратного корня (так, 17 является элементом поля, но не является квадратом какого-то элемента, поэтому sqrt(17) - вывело бы за пределы базового поля; заметьте, впрочем, что sqrt(22) == 81 (mod 503)).

На практике, чтобы вычислить результат сложения точек компьютер выполняет алгоритм, соответствующий формуле для каждой из координат. Вычисления требуют несколько элементарных операций в арифметике поля, с коэффициентами поля. Из этих элементарных операций складываются вычислительные затраты на проведение базовых криптографических преобразований. Компьютеры считают в двоичной системе, а современные центральные процессоры предоставляют машинные команды, которые позволяют придумать алгоритмы, работающие быстрее на конкретных данных. Соответственно, всё это позволяет для кривых с конкретными параметрами и с подходящим модулем придумывать различные, весьма специальные, оптимизации вычислений. Поэтому хорошо подобранная кривая и оказывается сильно быстрее других, произвольных, кривых.

Проверим, наконец, что наши формулы вообще работают. Для этого возьмём две различные точки на исходной кривой, найдём координаты их суммы при помощи «калькулятора» и убедимся, что полученная точка тоже лежит на кривой.

Точки:

P == (205, 484)
Q == (367, 377)

P != Q

Пусть R == P + Q

Вычисляем параметр k (всё mod 503):

k == (377 - 484)/(367 - 205)
k == -107/162

Но -107 это 396 в нашем поле:

k == 396/162

Но 1/162 это 59 в нашем поле, потому что 59*162 == 1 (mod 503):

k == 396⋅59 == 23364 == 226 (mod 503);

Находим координату X точки R (суммы):

B == 1, A == 58 (см. уравнение кривой);

X == 1⋅(226)^2 - (205 + 367) - 58 == 50446 == 146 (mod 503)

Координата Y точки R:

k⋅(X_p - X_r) - Y_p;

Y == 226⋅(205 - 146) - 484 == 12850 == 275 (mod 503)

Получилась точка (146, 275). Проверяем, что она лежит на кривой:

y^2 = x^3 + 58⋅x^2 + x

146^3 + 58⋅146^2 + 146 == 4348610 == 175 (mod 503)

275^2 == 175 (mod 503)

Сходится.

Основная используемая формула: P + Q - R == O. То есть, P,Q и обратная к R точки должны лежать на одной прямой. В терминах над конечным полем это означает, что координаты трёх точек соответствуют одному уравнению вида Y == m⋅X + c. Попробуем найти это уравнение.

Из координат точек ясно:

484 == m⋅205 + c
377 == m⋅367 + c

Находим m и c, например, и так:

c == 484 - m⋅205
377 == m⋅367 + 484 - m⋅205
377 == m⋅162 + 484

Обратите внимание, что всё в \mathbb F_{503}, то есть по модулю 503:

m == (377 - 484)/162 == 226 (mod 503), то есть, это элемент 226 поля;
c == 484 - 226⋅205 == 430 (mod 503)

Искомое уравнение:

Y == 226*X + 430

Мы только что нашли значение «углового коэффициента» m == 226 для нашей прямой (секущей), которая должна проходить через три точки кривой. Это значение - в точности параметр k, формулу для которого использовали выше. Именно так и выводятся формулы для алгебраического сложения в группе точек кривой. При этом для построения «касательной», то есть, когда точка складывается сама с собой, используется тот факт, что подставив уравнение прямой в уравнение кривой, нам нужно получить кратный корень - поэтому формулы удвоения, для уравнения в форме Монтгомери, отличаются.

Согласно основной формуле - P + Q - R == O, - на только что найденной линии должна лежать и точка -R. Координаты точки -R == (146, -275). Подставляем: 226⋅146 + 430 == 228 (mod 503); а обратный к 275 это и есть 228 нашем поле. Опять сходится.

Ниже - пример записи этих же идей на Rust (так как используемые числа влезают в ι64, то не требуется BigInt или что-то похожее; но вот для реальных приложений - потребуется).

/*
 * Пример реализации игрушечного сложения точек эллиптической кривой.
 * Обратите внимание, что здесь нет никаких проверок, даже 
 * не проверяется, что кривая неособая.
 * 
 */

// Нейтральный элемент будет обозначаться "координатами" (-1, -1).
// Способ записи нейтрального элемента - вопрос соглашения.
struct ECPoint {
	pub x: i64,
	pub y: i64,
}
impl PartialEq for ECPoint {
	fn eq(&self, other: &Self) -> bool {
		(other.x == self.x) && (other.y == self.y)
	}
}
// Используем малую теорему Ферма для вычисления обратного по умножению:
// a^(p-1) ≡ 1 (mod p).
// Этот "арифметический хак" не имеет прямого отношения к теме статьи,
// но тут он нужен.
fn invert(m: i64, p: i64) -> i64 {
	if p < 2 {
		return 0;
	}
	let mut r = 1;
	let mut n = m % p;
	let mut exp = p - 2;
	while exp > 0 {
		if exp % 2 == 1 {
			r = (r * n) % p;
		}
		exp = exp >> 1;
		n = (n * n) % p;
	}
	r
}

fn add_points(m: i64, a: i64, p: &ECPoint, q: &ECPoint) -> ECPoint {
	let mut k;
	let div;
	if p == q {
		div = invert(2*p.y, m);
		k = (3 * p.x.pow(2) + 2 * a * p.x + 1) % m;
		k = (k * div) % m;
	} else {
		if q.x == p.x {
			return ECPoint{x: -1, y: -1};
		}
		div = invert(q.x - p.x, m);
		k = (q.y - p.y) % m;
		k = (k * div) % m;
	}
	let mut xr = ((k * k) - (p.x + q.x) - a) % m;
	let mut yr = (k * (p.x - xr) - p.y) % m;
	if xr < 0 { // Опять хак.
		xr = xr + m;
	}
	if yr < 0 { // Ещё один.
		yr = yr + m;
	}
	ECPoint {
		x: xr,
		y: yr 
	}
}

fn main() {
// Примеры точек ниже работают для кривой с A == 58 над полем GF(503),
// как используется в статье. При этом глобальные параметры - передаются
// в функцию add_point(). Так что для других кривых или/и над другим
// полем - нужно будет выбирать точки отдельно.

	let a = ECPoint{x: 313, y: 378};	// Просто точка.
	let b = ECPoint{x: 262, y: 66};		// Ещё точка.
	let c = ECPoint{x: 313, y: 125};	// Точка, обратная к a.
	let d = add_points(503, 58, &a, &b);
	let f = add_points(503, 58, &a, &c);
	
	println!("a + b: X == {} Y == {}", d.x, d.y);
	println!("a + c: X == {} Y == {}", f.x, f.y);
}

Результат работы программы:

$ cargo -q run
a + b: X == 31 Y == 282
a + c: X == -1 Y == -1

Алгоритмическая польза от алгебраической геометрии эллиптических кривых в том, что можно ввести компактные формулы, реализация которых доступна компьютеру, и гарантировать корректность этих формул для очень больших множеств. То есть, криптография тут не работала бы без общих теоретико-числовых конструкций: если у вас 2^256 элементов, то практический компьютер не сможет ничего проверить непосредственно для каждого из этих элементов; однако общая структура, данная всего в нескольких операциях, позволяет гарантировать, что криптосистема на 2^256 элементах будет работать правильно. Более того, возможность строго, - в машинном смысле, - определить порождающие законы позволяет ввести доказательные конструкции и генерировать надёжный и эффективный программный код автоматом.

В криптосистемах, - например, в ECDH, - используют алгоритм, который называтся «умножение точки на скаляр». Это всего лишь сложение точки самой с собой заданное количество раз. Обратную операцию нахождения скаляра по известным точкам - называют «дискретным логарифмированием», она вычислительно трудна во многих группах. Так, умножение точки P на скаляр 3 означает, что точка P складывается вот так: P + P + P == [3]P. В алгебре соответствующая конструкция называется модулем над кольцом, а в данном случае, \mathbb{Z}-модулем - то есть, над целыми числами. (Все конечные коммутативные группы, на самом деле, это и не группы, а небольшие \mathbb{Z}-модули.) При этом важно различать операции в целых числах и операции в группе кривой. Можно, например, написать [3+2]P == (P + P + P) + (P + P) == [5]P. Здесь операция сложения внутри квадратных скобок - это обычное сложение целых чисел, а не сложение точек на кривой.

Обычно, реализация криптосистемы использует некоторый генератор - заранее заданную точку, из которой строится используемая группа. То есть, точка-генератор последовательно складывается сама с собой. Из свойств группы следует, что в какой-то момент таким образом всегда можно получить нейтральную точку. При этом точка-генератор не обязана проходить все элементы исходной группы, она может задавать лишь некоторое подмножество, замкнутое относительно групповой операции, которое будет подгруппой (в частности, оно обязательно содержит нейтральный элемент). Соответственно, для конкретных параметров операции могут работать не на всех точках кривой, а только на подмножестве. Например, так работает всем известная Ed25519.

Использование эллиптических кривых в качестве источника групп для криптосистем обусловлено ещё и тем, что можно подобрать группы простого порядка - то есть, количество элементов в которых, - количество точек, - является простым числом. Наша игрушечная кривая над \mathbb F_{503} содержит 460 элементов, составное число. А, например, количество элементов P-256:

115792089210356248762697446949407573529996955224135760342422259061068512044369

- простое.

Комментарии (1)


  1. kovserg
    25.05.2025 17:39

    Пусть Z = a + c
    что у вас получиться если сложить Z+c ? или Z+Z ?