Path: blob/master/Discrete-Logarithm-Problem/Elliptic-Curve-DLP/Algo-Pollard-Rho/pollardrho.py
1402 views
from sage.all import *1from Crypto.Util.number import *23def func_f(X_i, P, Q, E):4"""5To calculate X_(i+1) = f(X_i)67:parameters:8X_i : sage.schemes.elliptic_curves.ell_point.EllipticCurvePoint_finite_field9X_i = (a_i * P) + (b_i * Q)10P : sage.schemes.elliptic_curves.ell_point.EllipticCurvePoint_finite_field11Base point on which ECDLP is defined12Q : sage.schemes.elliptic_curves.ell_point.EllipticCurvePoint_finite_field13Q = x*P, where `x` is the secret key14E : sage.schemes.elliptic_curves.ell_finite_field.EllipticCurve_finite_field_with_category15Elliptic Curve defined as y^2 = x^3 + a*x + b mod p16"""17try:18# Point P and Q should lie on the Elliptic Curve E19assert P == E((P[0], P[1]))20assert Q == E((Q[0], Q[1]))21except Exception as e:22# Do not return anything if the point is invalid23print "[-] Point does not lie on the curve!"24return None25if int(X_i[0]) % 3 == 2:26# Partition S_127return X_i + Q28if int(X_i[0]) % 3 == 0:29# Partition S_230return 2*X_i31if int(X_i[0]) % 3 == 1:32# Partition S_333return X_i + P34else:35print "[-] Something's Wrong!"36return -13738def func_g(a, P, X_i, E):39"""40Calculate a_(i+1) = g(a)4142:parameters:43a : int/long44Equivalent to a_i in X_i = a_i*P + b_i*Q45P : sage.schemes.elliptic_curves.ell_point.EllipticCurvePoint_finite_field46Base point on which ECDLP is defined47X_i : sage.schemes.elliptic_curves.ell_point.EllipticCurvePoint_finite_field48X_i = a_i*P + b_i*Q49E : sage.schemes.elliptic_curves.ell_finite_field.EllipticCurve_finite_field_with_category50Elliptic Curve defined as y^2 = x^3 + a*x + b mod p51"""52try:53assert P == E((P[0], P[1]))54except Exception as e:55print e56print "[-] Point does not lie on the curve"57return None58n = P.order()59if int(X_i[0]) % 3 == 2:60# Partition S_161return a62if int(X_i[0]) % 3 == 0:63# Partition S_264return 2*a % n65if int(X_i[0]) % 3 == 1:66# Partition S_367return (a + 1) % n68else:69print "[-] Something's Wrong!"70return None7172def func_h(b, P, X_i, E):73"""74Calculate a_(i+1) = g(a)7576:parameters:77a : int/long78Equivalent to a_i in X_i = a_i*P + b_i*Q79P : sage.schemes.elliptic_curves.ell_point.EllipticCurvePoint_finite_field80Base point on which ECDLP is defined81X_i : sage.schemes.elliptic_curves.ell_point.EllipticCurvePoint_finite_field82X_i = a_i*P + b_i*Q83E : sage.schemes.elliptic_curves.ell_finite_field.EllipticCurve_finite_field_with_category84Elliptic Curve defined as y^2 = x^3 + a*x + b mod p85"""86try:87assert P == E((P[0], P[1]))88except Exception as e:89print e90print "[-] Point does not lie on the curve"91return None92n = P.order()93if int(X_i[0]) % 3 == 2:94# Partition S_195return (b + 1) % n96if int(X_i[0]) % 3 == 0:97# Partition S_298return 2*b % n99if int(X_i[0]) % 3 == 1:100# Partition S_3101return b102else:103print "[-] Something's Wrong!"104return None105106def pollardrho(P, Q, E):107try:108assert P == E((P[0], P[1]))109assert Q == E((Q[0], Q[1]))110except Exception as e:111print e112print "[-] Point does not lie on the curve"113return None114n = P.order()115116for j in range(10):117a_i = random.randint(2, P.order()-2)118b_i = random.randint(2, P.order()-2)119a_2i = random.randint(2, P.order()-2)120b_2i = random.randint(2, P.order()-2)121122X_i = a_i*P + b_i*Q123X_2i = a_2i*P + b_2i*Q124125i = 1126while i <= n:127# Single Step Calculations128a_i = func_g(a_i, P, X_i, E)129b_i = func_h(b_i, P, X_i, E)130X_i = func_f(X_i, P, Q, E)131132# Double Step Calculations133a_2i = func_g(func_g(a_2i, P, X_2i, E), P, func_f(X_2i, P, Q, E), E)134b_2i = func_h(func_h(b_2i, P, X_2i, E), P, func_f(X_2i, P, Q, E), E)135X_2i = func_f(func_f(X_2i, P, Q, E), P, Q, E)136137if X_i == X_2i:138if b_i == b_2i:139break140assert GCD(b_2i - b_i, n) == 1141return ((a_i - a_2i) * inverse(b_2i - b_i, n)) % n142else:143i += 1144continue145146if __name__ == "__main__":147import random148for i in range(100):149E = EllipticCurve(GF(17), [2, 2])150P = E((5, 1))151x = random.randint(2, P.order()-2)152Q = x*P153assert pollardrho(P, Q, E)*P == Q154155156