Рейтинг:1

Несколько вопросов о функциях эллиптических кривых

флаг tv

Я узнал об эллиптических кривых и о том, как они работают, и об их использовании в криптографии, и я пытаюсь понять, как их использовать с помощью Go.

  1. Где параметр «a» из моего уравнения ECC y^2 = x^3 + a*x + b в этой структуре CurveParams? https://golang.org/pkg/crypto/elliptic/#CurveParams Чтобы убедиться, что я правильно понимаю, поправьте меня, если я ошибаюсь:
  • Параметр «P» представляет порядок конечного поля
  • «N» — это минимальное простое число, при котором результатом N*G является точка бесконечности.
  • «B» - это константа «b» в моем уравнении ECC.
  • «Gx», «Gy» представляет собой базовую точку (которая, например, используется для вычисления открытых ключей с использованием выбранного вами закрытого ключа и умножения его на G, или в приведенном выше примере, где N * G используется для вычисления точки бесконечности)
  • «BitSize» здесь я не уверен, что это на самом деле представляет.Я понимаю, что в кривой P256 (secp256k1 BTC) это равно 256 и представляет собой длину закрытого ключа. Чего я не понимаю, так это того, откуда в математике на самом деле появляется это число? Или на самом деле это просто двоичная длина «P»?
  • Самый большой вопрос здесь заключается в том, где находится параметр «а» из уравнения эллиптической кривой? Как могут быть определены эллиптические кривые, если я не определяю этот параметр?
  1. Что произойдет, если вы используете функцию Double(), используя точку, которая не находится на кривой, или используя точку бесконечности? Я попытался найти какую-то точку, которая не найдена на кривой, чтобы вызвать функцию с ней, но не нашел ни одной (кривая P256, я искал в Google) https://golang.org/pkg/crypto/elliptic/#CurveParams.Double

  2. Что произойдет, если вы используете функцию Add(), используя точки, которые не находятся на кривой, или используя точку бесконечности + на точке кривой или точку бесконечности + не на точке кривой? https://golang.org/pkg/crypto/elliptic/#CurveParams.Добавить

  3. Почему закрытые ключи возвращаются в байтовых типах? Что случилось с типом байта? Я вижу, что он используется во многих местах. Почему мы не используем большой тип int? Я вижу, что они используются в GenerateKey(), Marshal(), MarshalCompressed(), UnmarshalCompressed(), ScalarBaseMult(), ScalarMult().

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

РЕДАКТИРОВАТЬ:

  • Частично ответил на вопрос 1. BitSize все еще нуждается в объяснении
Ievgeni avatar
флаг cn
Насколько я понял, [] байты могут представлять собой целое число произвольной длины. Выбор здесь, по-видимому, не накладывает ограничений на размер целого числа в ScalarMult, потому что он хорошо определен для любого положительного целого числа. И теоретически для некоторых конкретных кривых; порядок группы может быть больше, чем порядок базового поля, тогда возможно, что big_int будет недостаточно большим для представления закрытого ключа.
thebalkandude avatar
флаг tv
@levegni хорошо, это имеет смысл.
President James K. Polk avatar
флаг sh
нет, тип big.Int также может представлять целое число произвольного размера. Причина использования байтов для представления значений разъясняется в документации по Marshall и т. д. Существуют стандартные форматы обмена, которые определяются в терминах байтов, поскольку байты (на самом деле точнее «октеты») являются стандартной единицей измерения. хранения и передачи по сети. Что касается того, почему ScalarMult и подобные используют форму []byte, вы должны спросить программиста, но они, вероятно, посчитали, что это будет более удобно. Тип big.Int имеет методы для преобразования в []byte и из него, поэтому на практике это не проблема.
kelalaka avatar
флаг in
Кажется, вы опасаетесь [атаки с недействительной точкой] (https://crypto.stackexchange.com/q/87709/18298). Валидация необходима. Закрытый ключ — это большое целое число, которое хранится в виде байтового объекта.Не беспокойтесь, библиотека сделает это за вас и [преобразование простое] (https://stackoverflow.com/questions/24757814/golang-convert-byte-array-to-big-int).
Рейтинг:1
флаг cn

Потому что вам известна одна точка кривой (базовая точка). ты можешь вычислить $а$ :

$$a = \frac{(Gy)^2 -(Gx)^3 -b}{Gx} \mod p$$

Обратите внимание, что это вычисление требует $Gx \neq 0 \mod p$.

О точке бесконечности: предполагается, что точка бесконечности является нейтральным элементом, тогда по определению нейтрального элемента: $(x,y)+\mathcal{O}=\mathcal{O}+(x,y) = (x,y)$, отсюда следует, что $2\mathcal{O}=\mathcal{O}$

Таким образом, Двойной($\mathcal{O}$) вернет вам ту же точку $\mathcal{O}$. И по той же причине добавить$(\mathcal{O}, \cdot)$, Добавлять$(\cdot,\mathcal{O})$ обе функции идентичности для множества точек кривой.

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

thebalkandude avatar
флаг tv
хорошо, так что это частично отвечает на мои первые 3 вопроса
poncho avatar
флаг my
«Вы не должны использовать функции в точках, которые не находятся на кривой, поэтому я предполагаю, что это должно возвращать ошибку» - подпрограммы ECC обычно этого не делают. Да, они *могут* проверить; однако время, которое потребуется, будет составлять значительную часть времени добавления очков, поэтому они обычно не беспокоятся о промежуточных результатах. Они действительно должны проверять, когда вы первоначально импортируете значения (и когда они узнают, что начальные значения находятся на кривой, все промежуточные значения также будут); по моему опыту, даже это не универсально

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

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