Как проверить алгоритм решения ECDL в SageMath для небольшого целого числа? - PullRequest
0 голосов
/ 05 июля 2019

Проблема, которую я имею, состоит в том, чтобы реализовать гигантский шаг детского шага или Полларда Ро в SageMath или Python, чтобы сгенерировать небольшой множитель x G для заданного P так, чтобы P = x * G.

Это для части задания более крупного проекта.

modi =  115792089237316195423570985008687907853269984665640564039457584007908834671663

E=EllipticCurve(GF(modi), [0,7])

G=E(55066263022277343669578718895168534326250603453777594175500187360389116729240, 32670510020758816978083085130507043184471273380659243275938904335757337482424)

P=E(69335761065767984070318781108127416310968753866933119760392423089576366173459, 113425617697416972613102767146321902225172329004525144463444008550345431352693)

х = 24734216105351567

Поиск должен быть ограничен 2 ^ 54 точками для x и решить P = x * G, сохраняя все остальные параметры сверху.

Я пытался https://github.com/qubd/mini_ecdsa, и я получаю сообщение об ошибке ниже.

>>>C = CurveOverFp(0, 0, 7, 2**256-2**32-2**9-2**8-2**7-2**6-2**4-1)
y^2 = x^3 + 7 over F_115792089237316195423570985008687907853269984665640564039457584007908834671663

>>> P = Point(55066263022277343669578718895168534326250603453777594175500187360389116729240,
... 32670510020758816978083085130507043184471273380659243275938904335757337482424)

>>> n = 2^54

>>> Q = (69335761065767984070318781108127416310968753866933119760392423089576366173459, 113425617697416972613102767146321902225172329004525144463444008550345431352693)

>>>crack_baby_giant(C, P, n, Q)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "mini_ecdsa.py", line 470, in crack_baby_giant
    R = curve.add(Q, curve.invert(curve.mult(P, g*m)))
  File "mini_ecdsa.py", line 321, in add
    y_diff = (P_2.y - P_1.y) % self.char
AttributeError: 'tuple' object has no attribute 'y'

1 Ответ

0 голосов
/ 06 июля 2019

Вы пытаетесь просто использовать кортеж для Q. Но это не сработает, если ожидается Point, как указано в документации по ссылке на Github. Попробуйте сделать Q = Point(... , ...) и, надеюсь, это сработает.


Кстати, возможно, вы должны были реализовать это самостоятельно, а не с другим кодом - или это было приведено в качестве примера? Удачи.

...