椭圆曲线暴力强迫

时间:2015-05-14 12:07:34

标签: python brute-force elliptic-curve ecdsa

我有椭圆曲线的所有参数。点 Q P 的坐标。我想通过测试所有可能的 k 来解决 Q = k * P (其中 k 是未知的)。

所以我使用了这个class

然后:

a=-1
b=0
p=134747661567386867366256408824228742802669457
curve = EllipticCurve(a,b,p)
P=[18185174461194872234733581786593019886770620,74952280828346465277451545812645059041440154]
Q=[76468233972358960368422190121977870066985660, 33884872380845276447083435959215308764231090]
for i in range(2902021510595963727029):
    result = curve.multPoint(i,P)
    if result[0]==Q[0] and result[1]==Q[1]:
        print (i)
        break

这是解决此问题的正确方法吗?

2 个答案:

答案 0 :(得分:2)

这不是一个好方法,因为您正在尝试执行2902021510595963727029操作。即使你设法每秒进行十亿次操作,也需要92 thousand years才能完成。

你基本上是想破坏ECDSA的安全性。如果你想办法做到这一点,那么就可以在给定相应公钥的情况下找出一个ECDSA私钥。这将是密码学的一个突破,你会出名。有许多聪明的人在你面前考虑过这个问题而未能找到解决方案。

您尝试解决的问题称为discrete logarithm问题。

答案 1 :(得分:0)

曲线很容易受到MOV攻击和类似的旧FR攻击,所以我们可以分别使用Weil或Tate配对。

q = 134747661567386867366256408824228742802669457
Zq = Zmod(q)
E = EllipticCurve(Zq, [0,0,0,-1,0])
P = E(18185174461194872234733581786593019886770620, 74952280828346465277451545812645059041440154)
Q = E(76468233972358960368422190121977870066985660, 33884872380845276447083435959215308764231090)
n = P.order()
k = GF(n)(q).multiplicative_order()
R = E.random_element()
w1 = P.tate_pairing(R, n, k)
w2 = Q.tate_pairing(R, n, k)
print w1, w2

w2 = w1 ^ k 我们需要在整数mod p的环中求解离散对数问题。这可能需要一段时间,但鉴于模量较小,仍然可行。

PS:这是eltrai answer