Рейтинг:3

Проблема с добавлением точек о [n-1]+[2]G и [n-1]+G на Secp256k1

флаг cn

Заранее извиняюсь за свой вопрос. Я пытаюсь сделать свой собственный простой калькулятор Secp256k1, просто сложение и вычитание, и одна вещь меня постоянно смущает. Когда я добавляю 2 балла и знаю, какой результат сложения должен быть больше числа, чем $n$, и насколько я понимаю, результат должен быть 0, потому что это точка в бесконечности.

Однако мой калькулятор показывает другой результат. Например, я добавляю:

115792089237316195423570985008687907852837564279074904382605163141518161494336 + 2

и получить 1 в результате. То же самое происходит и с другими точками, сумма которых больше $n$.

Но когда я добавляю

115792089237316195423570985008687907852837564279074904382605163141518161494336 + 1

калькулятор показывает мне 0.

Я не могу понять, правильно ли работает калькулятор, и это мое непонимание в ECC? Или это ошибка в моем коде? Какой результат должен быть, когда я добавляю две точки с суммой, большей, чем $n$?

kelalaka avatar
флаг in
Добро пожаловать в Cryptography.SE. Ваш вопрос не ясен. Используете ли вы [законы группы добавления точек] (https://crypto.stackexchange.com/a/66296/18298)?
Franko avatar
флаг cn
Да, я полагаю.
kelalaka avatar
флаг in
Еще раз прочитав ваш вопрос, кажется, что у вас проблема с арифметикой точек ECC. Вы можете отредактировать свой вопрос, чтобы показать, как вы добавляете баллы? Математически или программно, в последнем случае это должно быть минимально!
Franko avatar
флаг cn
Я использовал код из https://onyb.gitbook.io/secp256k1-python/point-addition-in-python. When i add coordinates for 15792089237316195423570985008687907852837564279074904382605163141518161494336 point 79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777 and add to this point 2 with coordinates c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a, i get coordinates of 1 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 as result.
kelalaka avatar
флаг in
Я действительно не понимаю. Что такое $P=(Px,Py)$ и $Q=(Qx,Qy)$
Franko avatar
флаг cn
Давайте сделаем это немного проще. Какой правильный ответ для сложения точек для двух точек: 115792089237316195423570985008687907852837564279074904382605163141518161494336 и 2?
kelalaka avatar
флаг in
Точка в ECC в аффинных координатах имеет две координаты. Вы уверены, что получили это? Существует точка $$(2, 69211104694897500952317515077652022726490027694212560352756646854116994689233)$$, где $x=2$ и вычисляется y...
Franko avatar
флаг cn
Мне жаль. Point 115792089237316195423570985008687907852837564279074904382605163141518161494336 G with coordinates x: 79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 y: b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777 and point 2G x: c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5 y :1ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a
kelalaka avatar
флаг in
Я думаю, что вам не хватает понятий. Точка, которую вы назвали, должна быть закрытым ключом, и вы хотите вычислить открытый ключ. Закрытый ключ представляет собой целое число, а открытый ключ представляет собой точку с помощью [скалярного умножения](https://crypto.stackexchange.com/q/68593/18298) $[k]G$
PrincePolka avatar
флаг cn
secp256k1 - это кривая простого порядка N = 1157920892373161954235709850086879078528375564279074904382605163141518161494337 , вы добавляете (N-1)G + 2G и получаете G, который является правильным 1''2 часа, вы получаете 1, тот же принцип, что и если вы добавляете 1'2 часа к 1 Часы
Franko avatar
флаг cn
Спасибо!!! Это означает, что все работает правильно. Но можно ли как-то избежать добавления этого второго тура? Для сложения результатов, превышающих n. Ведь результат сложения, равный n (115792089237316195423570985008687907852837564279074904382605163141518161494337), вычисляется как 0. Может быть, возможны и другие результаты, большие n?
kelalaka avatar
флаг in
Я понимаю. Вы совершенно неправильно используете терминологию. Вы выполняете скалярное умножение. В этом случае вы можете использовать это удостоверение. $[k]P = [ k \mod n]P$
Franko avatar
флаг cn
Спасибо, попробую.
kelalaka avatar
флаг in
И не забывайте, что путь StackExchange заключается в голосовании за ответ, если он полезен для вас, и принятии его, если он удовлетворяет вашему вопросу. Развлекайся.
Рейтинг:4
флаг in

В этом вопросе существует путаница в терминологии эллиптической кривой. Позвольте разобраться с некоторыми из них;

Эллиптическая кривая

Алгебраически эллиптическая кривая

$$E(\mathbb{K}):= \{ (x, y) \in \mathbb{K}^2 \mid y^2+a_1xy+a_3y = x^3+a_2x^2+a_4x+a_6\ } \cup \{\mathcal O\}$$

$\{\mathcal О\}$ является точка в бесконечности добавлен как дополнительный, который не имеет представления в геометрической форме кривой.

Точки - это $(х,у)$ кортеж, который удовлетворяет уравнение кривой, поэтому они не являются целыми числами!

Добавление точки

Сложение точек имеет очень хороший геометрический смысл. На картинке ниже $П,К,Р$ представляет точки на кривой и $\{\mathcal О\}$ представлен как $0$

Геометрическая интерпретация сложения на кривой Вейерштрасса

и мы извлекаем арифметические уравнения отсюда (правило касательной хорды). Подробнее об извлечении см. Глава 2 книги Вашингтона.

Точки кривой образуют абелева группа под оператором сложения точек с элементом идентичности $\{\mathcal О\}$.

Скалярное умножение

Когда мы добавляем точку $P$ про себя говорим удвоение какой-то человек пишем как $2P$, тем не менее, распространенный и лучший способ написать это $[2]П$. Так $[2]П = П + П$.

Точно так же мы можем говорить о сложении три раза, четыре раза или $t$ раз.

$$[t]P : = \underbrace{P + P + \cdots + P}_{t-times}$$

Это то, что мы называем скалярное умножение (фактически Z-модуль для абелевых групп)

Генератор

Образующая циклической группы — это элемент $G$ такой, что когда $G$ добавил себя снова и снова он будет генерировать все элементы группы (Извините за теоретика группы, здесь столкнулись заглавные буквы - элемент $г$ группы $G$ является генератором, если $\langle g \rangle = G$).

Заказ

Заказ имеет два использования в ECC

  1. Порядок эллиптической кривой $|\#E(\mathbb{K})|$ означает количество элементов кривой

  2. Порядок элемента.

    Когда кривая имеет простой порядок, как в Secp256k1, тогда каждый элемент имеет тот же порядок, что и порядок кривой, и это означает, что каждый элемент является генератором.

Вернуться к вашему вопросу

В Secp256k1 базовая точка

G = (55066263022277343669578718895168534326250603453777594175500187360389116729240,
83121579216557378445487899878180864668798711284981320763518679672151497189239 )

и порядок базовой точки $n$ является

n = 115792089237316195423570985008687907852837564279074904382605163141518161494337

Порядок означает, что $[n]G = \mathcal{O}$ и мы можем использовать это, чтобы вывести приведенное ниже уравнение

$$[k]P = [ k \bmod n]P$$

  • Итак, что вы делаете, это с $+2$ является

    $$[n-1]G + [2]G = [n-1+2]G = [n+1]G = [1]G = G$$

  • Итак, что вы делаете, это с $+1$ является

    $$[n-1]G + [1]G = [n-1]G = [n]G = \mathcal{O}$$


Закончим с проверкой SageMath;

#secp256k1
p = Integer("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2F")
a = Целое число("0x00000000000000000000000000000000000000000000000000000000000000000")
b = целое число("0x00000000000000000000000000000000000000000000000000000000000000007")

К = GF(p)
E = Эллиптическая кривая (K, [a, b])
печать (Е)

G = E(Целое число("0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"),
      Целое ("0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"))
печать("\nG =",G)

n = G.порядок()

print("\nЗаказ G =",n)

Г2 = 2*Г
Q = (n-1)*G + 2*G
печать("\n[n-1]G+[2]G=",Q)
утверждать (Q == G)

R = (n-1)*G +G
печать("\n[n-1]G+G=",Q)
печать (R)

и выход

Эллиптическая кривая, определяемая y^2 = x^3 + 7 над конечным полем размером 115792089237316195423570985008687907853269984665640564039457584007908834671663

G = (55066263022277343669578718895168534326250603453777594175500187360389116729240 : 32670510020758816978083085130507043184471273380659243275938904335757337482424 : 1)

Порядок G = 115792089237316195423570985008687907852837564279074904382605163141518161494337

[n-1]G+[2]G = (55066263022277343669578718895168534326250603453777594175500187360389116729240 : 32670510020758816978083085130507043184471273380659243275938904335757337482424 : 1)

[n-1]G+G = (55066263022277343669578718895168534326250603453777594175500187360389116729240 : 32670510020758816978083085130507043184471273380659243275938904335757337482424 : 1)
(0 : 1 : 0)
kelalaka avatar
флаг in
Да, вы можете говорить о точке как о целом числе, где целое число представляет собой скаляр, который необходимо умножить на $G$. Однако обратным является дискретный логарифм, т.е. при заданном $P$ найдите $t \in Z$ такое, что $P = [t]G$, и это ядро ​​безопасности многих ECC и трудная проблема. Обычно мы можем сохранять индексы ($t$ для каждого $P$) для ускорения, однако большую часть времени вам дают $P$ без индекса, как в ключе Диффи-Хеллмана на эллиптической кривой. Биржа (ECDH).
Franko avatar
флаг cn
Большое спасибо за такой подробный ответ. Извините за неправильное описание точки, я понимаю, что точка - это координаты x y, а не целое число, но для меня проще описать точку как целое число, потому что оно показывает число, которое находится за этой точкой. И спасибо за расчет, теперь я ясно вижу, что происходит, когда я добавляю эти точки. Но у меня новый вопрос. Есть ли способ отследить, какой результат добавления точки больше n и точка результата находится во «втором раунде»? Является ли это возможным?
kelalaka avatar
флаг in
Если вы дадите мне $P$ и $Q$ с их координатами, то мне никак, как я уже упоминал в предыдущем комментарии, нужно решать дискретный логарифм на Seckp256k1. Обратите внимание, что при рассмотрении $P+Q$ такого округления нет, поскольку в формуле сложения не нужно использовать индекс и базовую точку.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.