Рейтинг:0

Можно ли напрямую вычислить идентификатор восстановления из сообщения, подписи и открытого ключа в ECDSA/secp256k1?

флаг ca

Проблема

Допустим, я получаю подпись $(р,с)$, соответствующий открытый ключ и сообщение, которое было подписано. У меня нет доступа к секретному ключу. Мне нужно знать, что recid (ID восстановления) соответствует открытому ключу. Единственное, что я могу сделать, это восстановить открытый ключ из подписи, используя множество библиотек и перепробовав все возможные способы. recid значения (0 или 1, очень редко 2 или 3). Но мне было интересно, зачем мне пробовать несколько вариантов, а не просто вычислять их напрямую?

Теперь по этой статье... http://coders-errand.com/ecrecover-signature-verification-ethereum/

... Я могу просто перевернуть формулу и заполнить все константы secpk256k1 изгиб: https://en.bitcoin.it/wiki/Secp256k1

Поэтому я попытался подумать о том, как это будет реализовано. Отличие статьи от моей ситуации в том, что у меня уже есть публичный ключ $Q$. меня интересует $у$-паритет точки $[k]G$ ($Х$ в статье). я могу рассчитать $Х$ потому что у меня есть $Q$, $R$, $S$ и все постоянные значения, указанные в вики. Но тогда мне пришлось бы снова вычислять две точки:

\начать{выравнивать} X &= \frac{(eG + rQ)}{s} \bmod n\ -X &= \frac{(eG + rQ)}{-s} \bmod n\ \end{выравнивание}

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

Вопрос

Мой вопрос: это единственный способ просто восстановить открытый ключ для нескольких recid значения и сузить его до recid для собственного открытого ключа? Или можно придумать формулу, где recidнаходится на одной стороне, а другие термины на другой стороне, что-то вроде $recid$ $=$ $Q$... $G$... $г$ $s$... $e$

kelalaka avatar
флаг in
У вас нет открытого ключа, в котором уже упоминается $y$?
CoderApprentice avatar
флаг ca
@kelalaka Насколько я понимаю, recid относится к четности по y точки kG = (x, y) = X (где k выбирается случайным образом во время подписания, а G является генератором secp256k1), а не к четности по y открытого ключа.
Рейтинг:1
флаг gb

К сожалению, я не думаю, что это возможно без простого тестирования того, какой из них работает. Это потому, что $[s]R$ и $[-s](-R)$ являются одной и той же точкой кривой, и обе $R$ и $-R$ имеют одинаковую x-координату $г$, так $(г, с)$ и $(г, -с)$ обе действительные подписи под одним и тем же открытым ключом $Q$. По такой подписи невозможно определить, $R$ или же $-R$ нужно использовать в рекавери, потому что вы не знаете секретный одноразовый номер $к$. Так что вам просто нужно проверить оба варианта и найти тот, который работает.

(Если кто-то еще знает умный способ сделать это, чего мне не хватает, я буду рад, если меня поправят!)

CoderApprentice avatar
флаг ca
Что ж, это имеет смысл. Я предполагаю, что здесь я вычисляю 2 координаты, которые действительны для одного и того же открытого ключа, но на самом деле мне нужно найти, какой открытый ключ соответствует закрытому ключу, которым было подписано сообщение. Я пытался найти такую ​​формулу, что recid = , но recid на самом деле не является частью формул. Таким образом, (x,y), которые мы на самом деле хотим, зависит от того, какой `k` был выбран во время подписания? И это число, которое мы никогда не сможем узнать, если у нас нет закрытого ключа.
meshcollider avatar
флаг gb
Правильный. Я даже не уверен, что recid стандартизирован где-либо или просто зависит от реализации. Я знаю, что [libsecp256k1](https://github.com/bitcoin-core/secp256k1) использует первый бит для указания нечетной координаты y (если установлено значение 1), а второй бит (когда recid = 2 или 3) указывает, что координата x превысила групповой порядок.

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

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