Python
是否有用於解決小型秘密乘數的 ECDL 問題的 Python 或 SageMath 實現?
我正在尋找用於測試曲線上的
Baby Step - Giant Step
和Pollard 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 和其他算法。