3

私は楕円曲線のすべてのパラメータを持っています。そして点QPの座標。可能なすべてのkをテストして、 Q=k*P ( kは不明)を解決したいと考えています。

だから私はこのクラスを使いました

それから:

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

これは、この問題を解決するための正しいアプローチですか?

4

2 に答える 2

4

2902021510595963727029 操作を実行しようとしているため、これは適切なアプローチではありません。1 秒間に 10 億回の操作を実行できたとしても、完了するまでに 92,000かかります。

あなたは基本的に ECDSA のセキュリティを破ろうとしています。これを行う方法が分かれば、対応する公開鍵から ECDSA 秘密鍵を割り出すことができます。それは暗号化の突破口となり、あなたは有名になるでしょう。あなたの前にこの問題について考え、解決策を見つけられなかった賢い人がたくさんいます。

あなたが解こうとしている問題は、離散対数問題と呼ばれます。

于 2015-05-15T00:26:49.503 に答える
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 の回答です。

于 2015-05-18T20:16:10.350 に答える