Реальная история.
Привет sss555,
Если вы можете, установив шалфей и используя, что вместо Python сделает вашу жизнь намного проще. Существует пример ноутбук на
bitcoin.ninja которая делает некоторые вещи ECDSA на кривой Bitcoin в.
Для того, чтобы прямо ответить на ваш вопрос, мы можем получить от й у в основном так же, как вы получили у от й. Чтобы убедиться в этом, давайте рассмотрим, почему ваш метод работает.
Мы имеем от нашей кривой уравнения, Y = у ^ 2 = х ^ 3 + 7. Вы можете вычислить Y легко от х, то вы решаете Y = у ^ 2 при у. По Маленькой теоремы Ферма можно записать 1 = у ^ (р - 1) = Y ^ (р - 1) / 2. Написать Q = (р - 1) / 2; то мы имеем Y ^ Q = 1, так что Y ^ (Q + 1) = Y = у ^ 2, так что Y ^ ((Q + 1) / 2) = у. Как оказалось, (Q + 1) / 2 = (р + 1) / 4, который почему вы смогли решить для у, используя показатель степени (р + 1) / 4. Обратите внимание на то, что это во многом зависит от р будучи 3 по модулю 4; в противном случае (р + 1) / 4 не быть целым числом, и мы не смогли бы вычислить это. К счастью, наш выбор р удовлетворяет этим.
ОК! Так давайте сделаем аналогичную вещь для х. Напишем X = х ^ 3 = у ^ 2 - 7. X можно вычислить у легко, поэтому мы должны решить Х = х ^ 3. Написать Q = (р - 1) / 3; то Х ^ Q = х ^ (р - 1) = 1, так что Х ^ (Q + 1) = Q = х ^ 3, так что Х ^ ((Q + 1) / 3) = х. Как оказалось, (Q + 1) / 3 = (р + 2) / 9. На этот раз мы в значительной степени зависеть от р будучи 7 мод 9, с тем, что это целое число. К счастью это! Так что вы идете.
TL; ДР использовать (р + 2) / 9 вместо (р + 1) / 4.
Редактировать: О, и получить два других кубические корни нужно умножить нетривиальной кубический корень из 1. (Аналогично вы умножения на -1 в исходном коде.) Одним из таких куб корень 0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee.
Edit2: Вот Python код аналогичен ваш. Он принимает одно из значений выходных у и возвращает введенное й значение как х2.
## Input
у = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
## Параметры полей
Модуль # поле
р = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
# Cube корень из 1
бета = 0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee
## Фактический код
xcubed = (у * у - 7)% р
Распечатать "xcubed = 0x% х" % xcubed
х = пау (xcubed, (р + 2) / 9, р)
Распечатать "x1 = 0x% х" % Икс
Распечатать "х2 = 0x% х" % (Х * р бета%)
Распечатать "x3 = 0x% х" % (Х * бета * р бета%)
Его выход
xcubed = 0x4866d6a5ab41ab2c6bcc57ccd3735da5f16f80a548e5e20a44e4e9b8118c26eb
x1 = 0xc994b69768832bcbff5e9ab39ae8d1d3763bbf1e531bed98fe51de5ee84f50fb
x2 = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
x3 = 0xbcace2e99da01887ab0102b696902325872844067f15e98da7bba04400b88fcb