Python

是否有用於解決小型秘密乘數的 ECDL 問題的 Python 或 SageMath 實現?

  • July 4, 2019

我正在尋找用於測試曲線上的Baby Step - Giant StepPollard Rho算法的 Python 腳本或 SageMath 程式碼實現。secp256k1

我讀過這些算法以解決小數的 ECDL 問題而聞名,但我還沒有找到任何程式碼來測試它。

編輯:

我正在尋找在標準 secp256k1 曲線參數上生成一個小的秘密乘數。

下面是一個E=EllipticCurve(GF(modi), [0,7])使用標準 NIST 參數的範例G

G=E(55066263022277343669578718895168534326250603453777594175500187360389116729240, 32670510020758816978083085130507043184471273380659243275938904335757337482424)

我們知道對於

P=E(69335761065767984070318781108127416310968753866933119760392423089576366173459, 113425617697416972613102767146321902225172329004525144463444008550345431352693)

在計算時,discrete_log我們得到小x=24734216105351567的結果是P = x * G

有沒有這樣的實現可以計算小x?

謝謝!

在聖人。

讓我們首先定義一個大小為 2^32 的有限域(在該域上進行詳盡的搜尋會很痛苦但可行,但 Pollard-Rho 應該很快)。

sage F = GF(2^32 - 5)

在它上面有一條素數階橢圓曲線(y^2 = x^3 + x + 13 恰好是素數)

sage: E = EllipticCurve(F, [1, 13])

讓我們呼叫曲線的順序n

sage: n = E.order()
sage: n
4295040499
sage: n.is_prime()
True

讓我們在該曲線上選擇一個任意生成器:

sage: G = E.gen(0)
sage: G
(4022957561 : 1193765470 : 1)
sage: G.order() == n
True

現在讓我們選擇該生成器的隨機倍數:

sage: import random
sage: x = random.randrange(n)
sage: x
1334636724
sage: P = x * G
sage: P
(2051230087 : 1391923842 : 1)

要找到離散對數,只需使用:

sage: discrete_log(P, G, n, operation='+')
1334636724

與我們的隨機秘密乘數 x 相同。

Sage 在內部使用 Pollard-Rho 和其他算法。

引用自:https://bitcoin.stackexchange.com/questions/88845