Path: blob/master/Discrete-Logarithm-Problem/Elliptic-Curve-DLP/brute_ecdlp.py
1402 views
from sage.all import *1import random23def brute_ecdlp(P, Q, E):4"""5Brute Force algorithm to solve ECDLP and retrieve value of secret key `x`.6Use only if group is very small.7Includes memoization for faster computation8[Warning]: Tested for Weierstrass Curves only910:parameters:11E : sage.schemes.elliptic_curves.ell_finite_field.EllipticCurve_finite_field_with_category12Elliptic Curve defined as y^2 = x^3 + a*x + b mod p13P : sage.schemes.elliptic_curves.ell_point.EllipticCurvePoint_finite_field14Base point of the Elliptic Curve E15Q : sage.schemes.elliptic_curves.ell_point.EllipticCurvePoint_finite_field16Q = x*P, where `x` is the secret key17"""18_order = P.order()19try:20assert P == E((P[0], P[1]))21except TypeError:22print "[-] Point does not lie on the curve"23return -12425res = 2*P26if res == Q:27return 228if Q == E((0, 1, 0)):29return _order30if Q == P:31return 132i = 333while i <= P.order() - 1:34res = res + P35if res == Q:36return i37i += 138return -1394041if __name__ == "__main__":42E = EllipticCurve(GF(17), [2, 2])43P = E((5, 1))44try:45for _ in range(100):46x = random.randint(2, 18)47assert brute_ecdlp(E((5, 1)), x*P, E) == x48except Exception as e:49print e50print "[-] Function inconsistent and incorrect"51print "[-] Check your implementation"525354