Закрытый ключ Биткойн, расположение на кривой ECC

В алгоритме ECDSA закрытый ключ Биткойн предположительно представляет собой точку на графике (или нет?). Но закрытый ключ представляет собой одно целое число, а не координаты x,y. Является ли целое число само по себе значением x или значением y? Если это х, то что такое у? Если это у, то что такое х?

Открытый ключ — это точка, закрытый ключ — целое число.
Тогда что такое «P» (обратите внимание на заглавную букву «P», а не в нижний регистр, так что это не простое число для моддинга)? Почти каждый график, который я вижу, показывающий преобразование закрытого ключа в открытый, показывает «P» и «Q». Если P = 9 (просто целое число) и Q = 14,5, то как вы получите открытый ключ из этого или что это будет? Я не могу найти пример, который работает.
Я предложил вам посмотреть certicom.com/index.php/ecc-tutorial в другой ветке. P,Q обычно обозначают точки и должны иметь две координаты.

Ответы (2)

Основная операция с эллиптической кривой — добавление точек. Операция многократного применения этого сложения называется скалярным умножением точки на целое число.

Закрытый ключ — это «скаляр», точка умножения — это точка «Генератор», результат — это открытый ключ.

Скалярное умножение — это, по сути, многократное сложение. Умножение точки Генератора на 5 означает: вычисление G+G+G+G+G.

Вы вычисляете это, сначала вычисляя G2=G+G, затем G4=G2+G2, затем G5=G4+G.

Формула кривой

Формула кривой, используемой для расчетов биткойнов, выглядит следующим образом:

y^2 == x^3 + 7   ( mod p )

кудаp = 2^256 - 2^32 - 977

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

точка (x,y) находится на кривой, если она соответствует приведенному выше уравнению

Добавление кривой

Добавление кривой лучше всего визуализировать геометрически

добавление кривой

изображение с certicom

Криптография на эллиптических кривых не использует значения с плавающей запятой для своих координат, все вычисления выполняются в целых числах по модулю большого простого числа (упомянутого выше, с именем p). Но метод подсчета суммы 2 баллов остается прежним.

добавление очков

Добавьте точки P1=(x1,y1) и P2=(x2,y2), в результате чего Psum= (xsum, ysum)

slope = (y1-y2)/(x1-x2)
xsum = slope^2 - (x1+x2)
ysum = slope*(x1-xsum)-y1

удвоение очков

если P1 и P2 являются одной и той же точкой, приведенная выше формула сложения будет включать деление на ноль, поэтому для расчета P + P требуется другая формула.

slope = 3 * x^2 / (2*y)
xdbl = slope^2 - 2*x
ydbl = slope *(x-xdbl)-y

ecdsa-ключи

GДля ECDSA была выбрана образующая точка .

Закрытый ключ — это просто целое число, давайте назовем его k. Открытый ключ — это точка-генератор, добавленная сама к себе kопределенное количество раз. Другими словами, умножить на k.

Если вы неправильно выберете закрытый ключ, скажем, 1, ваш открытый ключ будет равен точке генератора, этому адресу: 1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm .

Как видите, он даже использовался недавно.

Что делает ECDSA полезной криптосистемой, так это то, что из закрытого ключа легко вычислить открытый ключ, но не наоборот. Другой способ выразить это так: умножение — это просто, но не существует (простого) алгоритма деления на эллиптической кривой.

Пример кода

См. этот пример для примера в python

Весь код и уравнения, которые я читал для сложения и умножения точек, требуют двух наборов координат x и y (они не показывают, как работать только с целым числом), которые приводят к третьей координате x, y. Поскольку закрытый ключ должен быть одним из них, как мне преобразовать его в координату x, y?
@Mine - Как было объяснено, закрытый ключ представляет собой целое число (по модулю простого p). Вы умножаете его на точку генератора G, чтобы получить открытый ключ. Умножение - это многократное сложение. Например, если закрытый ключ равен 9, открытый ключ будет G+G+G+G+G+G+G+G+G. Для этого вы используете формулу сложения баллов. Чтобы сделать его более эффективным, вы используете вариант "возведения в степень возведением в квадрат" - вы вычисляете 2G=G+G, 4G=2G+2G, 8G=4G+4G, 9G=8G+G.
... Я понимаю, что y1 и x1 - это Gx и Gy, но в вашем разделе «дополнение» показаны два x и два y без указания того, откуда они взялись. В этой точке вашего уравнения единственная координата x, y, которую я вижу, — это Gx и Gy.
@Mine Давайте попробуем еще раз. Допустим, ваш закрытый ключ — номер 3. Ваш открытый ключ — 3G. Как мы это вычисляем? Сначала нужно вычислить 2G. Таким образом, вы используете формулу, описанную Уильямом для удвоения точек, которая требует только одну пару (x_1, y_1) в качестве входных данных и создает новую пару (x_2, y_2) в качестве вывода. Первая пара представляет G, а вторая пара представляет 2G. Теперь вы используете формулу сложения Уильяма с этими двумя паями в качестве входных данных для получения 2G+G, который является 3G, вашим открытым ключом. Если ваш открытый ключ представляет собой большее целое число, вам придется делать это много раз, как описал Мени.
Я понимаю, что делаю это несколько раз, но я не могу понять уравнения правильно даже один раз. Кто-нибудь знает хороший онлайн-калькулятор (или, черт возьми, бесплатный калькулятор), который может делать эти вещи без экспоненциальной записи? Я запускал уравнение несколько раз, и я даже не могу сделать это правильно с закрытым ключом 2 или 3. Используя научный калькулятор Web 2.0, но, похоже, он делает странные вещи, включая не всегда выбор всего числа, когда я копирование и вставка
@Mine: Возможно, у вас возникли проблемы с тем, что добавление точки к самой себе является предельным случаем, в котором используется другая формула, чем для добавления двух разных точек. Найдите формулу добавления точки самой себе (удвоение точки) для эллиптической кривой, и все будет хорошо (эта формула появляется в ответе Виллема).
На самом деле, вы, ребята, возможно, решили мою самую большую проблему, которая заключалась в том, как применить уравнения умножения/сложения точек до того, как у меня было две координаты x, y, это полностью меня запутало. Эта неточность результирующих чисел является новой разработкой.
@Mine Если вы используете какой-либо калькулятор, который обрабатывает числа как рациональные числа с плавающей запятой, с ним невозможно выполнить арифметические операции по модулю p. Вам нужно что-то, что обрабатывает целые числа с высокой точностью и может выполнять модульную арифметику. Я предложил "Sage" выше.
@mine: тебе понравился скрипт Python, который я связал? он показывает, как именно производить расчеты.
@Виллем Да, я сделал. Теперь я еще больше запутался (но не обязательно из-за этого). en.wikipedia.org/wiki/Elliptic_curve_point_multiplication не показывает «обратное» в уравнении, но ваш скрипт python показывает. Моя цель состоит в том, чтобы иметь возможность вручную выполнять эти уравнения, и я сделал удвоение точек для закрытого ключа биткойн, который является просто номером 2. Это работает! Но когда я пытаюсь получить открытые ключи для закрытых ключей 3 и 4, я не получаю результатов. Возможно, я неправильно понял применение нескольких уравнений? Я использую веб-сайт Sagemath для расчетов.
функция inverse() предназначена для вычисления модулярной инверсии числа (модуля p), это похоже на деление путем умножения на обратную величину: a/b = a*(1/b)
@Willem Но страница вики не показывает, что она используется, и мое умножение работало без нее. Или это было для закрытого ключа 2. Как мне применить эти уравнения, чтобы получить закрытый ключ 3/4?
на вики-странице показано, как это делается для кривых над действительными числами, но конкретно не показано, как расчет работает с модульной арифметикой.
Я обновил суть с дополнительными комментариями и результатами расчета для 2, 3 и 4.
@Willem tyvm, мне, вероятно, понадобится несколько дней, чтобы тщательно изучить это, чтобы убедиться, что я это понимаю.
Небольшое уточнение к комментарию @MeniRosenfeld: закрытый ключ представляет собой целое число в диапазоне от 1 включительно до порядка кривой (для кривой биткойна secp256k1, упоминаемой nв документе SEC 2), исключая.

Открытый ключ — это точка, закрытый ключ — это 256-битное целое число. На самом деле мы не храним точку как x, y как часть открытого ключа, мы сохраняем x и знак y для экономии места.

Вы имеете в виду, что мы храним x и знак y в отношении открытого ключа, а не закрытого ключа, верно?
Правильно, я отредактировал свой ответ на этот счет. Закрытый ключ — это всего лишь 256-битное целое число, хотя часть верхнего диапазона не подходит для нашей кривой.
Все уравнения для определения открытого ключа показывают, что значение G x, y умножается на значение x, y, а не просто на целое число, есть идеи, как преобразовать закрытый ключ в значение x, y?
Вы имеете в виду «х и знак у», верно?
при умножении и добавлении точек есть ДВА значения x и ДВА значения y, которые необходимы для получения открытого ключа. как именно вы получите второй набор значений x, y, когда все, что у вас есть, это одна координата x, y (Gx, Gy) и целое число (закрытый ключ)?