
Серия: Zcash from First Principles . Статья 2 . Эллиптические кривые Для кого: новички. Мы предполагаем только знание Статьи 1 (конечные поля): арифметики, которая «заворачивается» по модулю простого числа. Никакой другой подготовки не требуется. Что вы поймёте после прочтения: интуитивное и корректное представление об эллиптических кривых, о «ловушке», которая делает их полезными, и о том, как именно Zcash превращает их в ключи и коммитменты.
Статья 1 дала нам идеальную площадку для арифметики: конечное поле. Но само по себе поле — это просто числа. Чтобы построить ключи и «запечатанные конверты» из Статьи 0, Zcash нужен объект с особым типом односторонней трудности: его легко вычислять в прямом направлении и практически невозможно обратить. Этот объект — эллиптическая кривая. В этой статье мы разберём её с самых основ, начиная с интуиции и только потом переходя к алгебре.
Любой системе приватности нужна улица с односторонним движением: операция, по которой тривиально идти вперёд и практически невозможно вернуться назад.
Вот почему. Ваш секретный ключ — это число, которое вы держите в тайне. Ваш публичный ключ (и ваш адрес) выводится из него и показывается миру. Вся безопасность системы держится на одном факте: имея публичный ключ, никто не может восстановить по нему ваш секретный ключ. Если бы это было возможно, любой мог бы потратить ваши деньги.
Значит, нам нужна математическая операция, для которой:
Обычного умножения в конечном поле недостаточно: деление мгновенно его отменяет (в этом и был весь смысл Статьи 1). Нам нужно нечто, у чего нет простой кнопки «отменить». Эллиптические кривые дают именно это и, как бонус, позволяют комбинировать свои точки способом, идеально подходящим для построения коммитментов. Давайте посмотрим, как именно.
На мгновение забудем о криптографии. Эллиптическая кривая — это просто множество точек (x, y), удовлетворяющих уравнению вида:
y^2 = x^3 + ax + b
Над обычными числами она выглядит как гладкая изгибающаяся кривая, часто с округлой петлёй и двумя «хвостами»:

По-настоящему удивительная часть в другом: вы можете «сложить» две точки на этой кривой и получить третью точку на той же самой кривой. Это не обычное сложение координат. Это геометрическое правило, и его проще увидеть, чем сформулировать словами.
Чтобы сложить P + Q:
P и Q.R*.R* относительно горизонтальной оси. Это отражение и есть ответ: P + Q.
Чтобы вычислить P + P (записывается как 2P), второй точки для проведения прямой нет, поэтому вместо этого используется касательная к кривой в точке P, а затем применяется тот же рецепт: «третье пересечение, затем отражение».
Это и есть вся операция. Два геометрических правила. Благодаря им точки эллиптической кривой образуют то, что математики называют группой: множество с хорошо устроенной операцией «сложения». У него даже есть свой «ноль».
Любой числовой системе нужен 0 — элемент, который ничего не меняет при сложении. На эллиптической кривой эту роль играет особая дополнительная точка, называемая точкой на бесконечности, обозначаемая O. Её можно представить как точку «бесконечно высоко вверху», место, где встречаются вертикальные прямые. Прибавление O к любой точке ничего не меняет — точно так же, как прибавление 0.
Гладкая кривая выше — это интуиция. Но Zcash не использует вещественные числа (они округляются и выдают масштаб, как было сказано в Статье 1). Он использует эллиптическую кривую над конечным полем: то же уравнение y^2 = x^3 + ax + b, но со всей арифметикой по модулю простого числа.
Если сделать это, красивая кривая распадается на россыпь несвязанных точек — по одной точке на каждую пару (x, y), которая удовлетворяет уравнению по модулю p. Она вообще перестаёт выглядеть как кривая. Но вот ключевой момент:
Алгебра правила хорды и касательной по-прежнему работает безупречно. Те же формулы, которые геометрически находили
P + Q, теперь вычисляют его с помощью арифметики конечного поля. Точки по-прежнему образуют группу с тем же0(точкой на бесконечности).
Сделаем это наглядным на маленьком, полностью проверенном примере.
Возьмём y^2 = x^3 + 2x + 2 над конечным полем F_17. Если вычислить все допустимые точки, получится ровно 18 точек плюс точка на бесконечности = 19 точек всего. Некоторые из них:
(0,6) (0,11) (3,1) (3,16) (5,1) (5,16) (6,3) (6,14) (7,6) (7,11) ...
Теперь выберем точку G = (5, 1) и начнём многократно складывать её саму с собой. Посмотрите, что получается (каждая строка ниже действительно вычислена, а не угадана):
| Шаг | Точка | Шаг | Точка |
|---|---|---|---|
1G | (5, 1) | 11G | (13, 10) |
2G | (6, 3) | 12G | (0, 11) |
3G | (10, 6) | 13G | (16, 4) |
4G | (3, 1) | 14G | (9, 1) |
5G | (9, 16) | 15G | (3, 16) |
6G | (16, 13) | 16G | (10, 11) |
7G | (0, 6) | 17G | (6, 14) |
Стоит заметить две вещи:
O на 19-м шаге, после чего цикл повторялся бы бесконечно. Начальная точка G «порождает» всю группу, поэтому мы называем её генератором.1G + 2G = (5,1) + (6,3) = (10,6), а это в точности 3G. Сложение внутренне согласовано, как и требуется для группы.Таблица 1G, 2G, 3G, ... — это сердце всей конструкции. Многократное сложение точки самой с собой называется умножением на скаляр: точка kG означает «G, сложенная сама с собой k раз».
А теперь магия. Рассмотрим два направления:
| Направление | Вопрос | Сложность |
|---|---|---|
| Вперёд | Даны k и G, вычислить kG | Легко. Даже для астрономически больших k трюк под названием double-and-add позволяет сделать это за несколько сотен шагов |
| Назад | Даны G и kG, восстановить k | Практически невозможно на настоящей криптографической кривой |
Эта асимметрия и есть та самая улица с односторонним движением, которая была нужна нам в разделе 1. Обратная задача («какое k породило эту точку?») называется задачей дискретного логарифмирования на эллиптической кривой (ECDLP), и для кривых, используемых Zcash, не существует известного метода, который решил бы её раньше тепловой смерти Вселенной.

На нашей игрушечной кривой над
F_17вы могли бы просто прочитатьkиз таблицы, потому что в ней всего 19 точек. У реальных кривых порядка2^(255)точек. В такой таблице было бы больше строк, чем атомов во Вселенной, так что «просто прочитать» не получится. Именно малость игрушечной кривой делает её удобной для обучения — и именно поэтому она не является безопасной.
Теперь у нас есть всё необходимое, чтобы объяснить настоящий криптографический ключ, и это поразительно просто:
Выберите секретное число
k. Опубликуйте точкуkG. Вот и всё.k— это ваш приватный ключ.kG— это ваш публичный ключ. Улица с односторонним движением (ECDLP) гарантирует, что никто не сможет восстановитьkпоkG.
Эта единственная идея — публичный ключ есть секретный скаляр, умноженный на фиксированный генератор — является основой spending keys, viewing keys и адресов Zcash. Полное дерево ключей добавляет сверху больше структуры, но каждая его ветвь вырастает из этого корня.
Вспомним «запечатанный конверт» (коммитмент) из Статьи 0, который должен был скрывать своё содержимое и при этом быть невозможным для подделки. Эллиптические кривые дают нам чистый способ его построить. Возьмём две фиксированные публичные точки-генераторы G и H, секретное значение v и случайное маскирующее число r, и сформируем:
Commitment = v.G + r.H
Это коммитмент Педерсена, и у него есть оба нужных нам свойства:
r «размазывает» результат по всей кривой, так что точка ничего не раскрывает о v.(v, r), дающую ту же точку, так что вы не можете позже изменить решение о том, к чему коммитились.Ещё одно бонусное свойство позже окажется бесценным: эти коммитменты складываются. Коммитмент к v_1 плюс коммитмент к v_2 — это корректный коммитмент к v_1 + v_2. Именно это «гомоморфное» поведение позволит Zcash позже доказывать, что деньги, входящие в транзакцию, равны деньгам, выходящим из неё, не раскрывая при этом никакие суммы. Этим мы воспользуемся примерно в Статье 6.
Следы этого вполне конкретны и проверяемы.
| Дизайн Zcash | Используемые кривые | Роль |
|---|---|---|
| Sapling (более старый) | BLS12-381 плюс встроенная кривая под названием Jubjub | BLS12-381 несёт на себе систему доказательств; Jubjub построена над скалярным полем BLS12-381, чтобы операции с ключами и коммитментами были дёшевы внутри доказательства с нулевым разглашением |
| Orchard (текущий) | Pallas и Vesta (цикл «Pasta») | Pallas несёт ключи и коммитменты Orchard; пара Pallas/Vesta специально устроена так, чтобы делать продвинутые доказательства эффективными |
Причины, по которым одну кривую «встраивают» в поле другой, и почему полезен цикл из двух кривых, реальны и важны, но они относятся уже к статьям о системах доказательств. Пока же вывод прост и надёжен: каждый ключ Zcash — это скаляр, умноженный на генератор, а каждый коммитмент Zcash — это сумма точек кривой, живущих на одной из этих именованных кривых.

Чтобы сохранить читаемость, мы упростили несколько моментов. Мы использовали форму короткого Вейерштрасса (y^2 = x^3 + ax + b); кривые Zcash часто записывают в других эквивалентных формах (Jubjub — это twisted Edwards кривая), выбранных ради эффективности и безопасности, но идея группы остаётся той же самой. Мы не определяли точные формулы сложения точек (это алгебраическая версия правила «третье пересечение, затем отражение») и оставили в стороне тонкости вроде порядка кривой, кофакторов и «pairings», которые становятся важными в статьях о системах доказательств. Всё это не меняет интуицию — только делает её точнее.
y^2 = x^3 + ax + b, а её точки можно складывать по геометрическому правилу хорды и касательной, где специальная точка на бесконечности играет роль нуля.y^2 = x^3 + 2x + 2 над F_17 имеет 19 точек, и G = (5,1) порождает их все.)kG легко вычисляется, но практически невозможно обратить: это ECDLP. В этом и состоит ловушка.k, публичный ключ kG. Коммитменты: форма Педерсена v.G + r.H, которая скрывает, связывает и удобно складывается.| Термин | Простое объяснение |
|---|---|
| Elliptic curve | Точки, удовлетворяющие y^2 = x^3 + ax + b, с особой операцией «сложения» точек |
| Point addition | Правило хорды и касательной: прямая через две точки, третье пересечение, отражение |
Point at infinity (O) | «Ноль» кривой; прибавление этой точки ничего не меняет |
Generator (G) | Базовая точка, кратные которой в итоге покрывают всю группу |
Scalar multiplication (kG) | Сложение G самой с собой k раз; вперёд легко, обратить трудно |
| ECDLP | Трудная задача восстановления k из kG; основа безопасности |
| Pedersen commitment | v.G + r.H; запечатанный конверт, который скрывает, связывает и складывается |
Почему кривые, а не просто большие числа по модулю простого? Оба подхода могут дать улицу с односторонним движением, но эллиптические кривые обеспечивают ту же безопасность при гораздо меньших ключах и более быстрых операциях, а их арифметика точек идеально подходит для коммитментов.
Доказано ли, что ECDLP трудна? Её не доказали как невозможную, но за десятилетия интенсивных усилий не было найдено ни одной эффективной атаки на хорошо подобранные кривые. Безопасность основана на этом хорошо проверенном предположении.
Может ли квантовый компьютер это взломать? Достаточно большой квантовый компьютер мог бы взломать ECDLP. Это известная долгосрочная проблема для всей индустрии и активная область исследований; сегодняшние кривые остаются безопасными против классических компьютеров.
Почему Zcash использует больше одной кривой? Потому что задачи разные. Одна кривая несёт систему доказательств с нулевым разглашением; другая (встроенная в поле первой) делает операции с ключами и коммитментами внутри доказательства эффективными. Следующие статьи объяснят, почему это сочетание важно.
Используя проверенную таблицу из раздела 3, чему равно 9G + 10G на нашей игрушечной кривой? И что ответ говорит вам о G? (Ответ ниже.)
9 + 10 = 19, и мы увидели, что 19G = O, точка на бесконечности. Значит, 9G + 10G = O. Это означает, что 10G является отрицанием (аддитивной обратной) для 9G: две точки, которые в сумме дают точку-«ноль». На кривой отрицание точки — это просто её зеркальное отражение относительно оси x, и действительно, 9G = (7,6) и 10G = (7,11) имеют одинаковый x, а их значения y в сумме дают 17 = 0 (mod 17). Структура полностью согласована, и именно это гарантирует утверждение «это группа».
Статья 3 . Хеширование и коммитменты: теперь мы как следует откроем этот «магический запечатанный конверт». Вы уже увидели один способ построить коммитмент из точек кривой; дальше мы спросим, что на самом деле означают сокрытие и связывание, познакомимся с хеш-функциями и свяжем всё это с коммитментами note, на которых держится каждый платёж Zcash.
Часть серии Zcash from First Principles для ZecHub. Лицензия CC BY-SA 4.0.
8G |
| (13, 7) |
18G |
| (5, 16) |
9G | (7, 6) | 19G | O (бесконечность) |
10G | (7, 11) |