def test_pohlig(): a = 2 b = 3 p = 1125899839733759 order = 1125899867612160 k = randrange(2, order) curve = ec_curve(a, b, p) pt1 = curve(436757568245484, 726713018309225) pt2 = curve.multiply(k, pt1) res = pohlig(curve, pt1, pt2, order) assert res == k
def test_pollard_rho(): a = 2 b = 9 p = 1035418103 order = 1035356653 k = randrange(2, order) curve = ec_curve(a, b, p) pt1 = curve(769278016, 752868328) pt2 = curve.mult(k, pt1) res = pollard_rho(curve, pt1, pt2, order) assert res == k
def test_bsgs(): a = 2 b = 3 p = 4111 order = 4120 k = randrange(2, order) curve = ec_curve(a, b, p) pt1 = curve(2672, 2565) pt2 = curve.mult(k, pt1) res = bsgs(curve, pt1, pt2, order) assert res == k
def test_smart(): a = 425706413842211054102700238164133538302169176474 b = 203362936548826936673264444982866339953265530166 p = 730750818665451459112596905638433048232067471723 order = 730750818665451459112596905638433048232067471723 k = randrange(0, order) curve = ec_curve(a, b, p) pt1 = curve( 282839918090522288605124127127354425085389489933, 575310508344796277762061084697250650618482060609, ) pt2 = curve.multiply(k, pt1) res = smart(curve, pt1, pt2) assert res == k
def test_pollard_kangaroo(): a = 0 b = 7 p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F order = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 k = 1000 curve = ec_curve(a, b, p, verify=False) G = curve( 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8, ) F = curve.mult(k, G) res = pollard_kangaroo(G, curve, F, 0, 2000) assert res == k
def smart(curve, P, Q): A = curve.a x1, y1 = hensel_lift(curve, P) x2, y2 = hensel_lift(curve, Q) lifted_p = curve.p**2 lifted_a = (y2**2 - y1**2 - (x2**3 - x1**3)) lifted_a = (lifted_a * modinv(x2 - x1, lifted_p)) % lifted_p lifted_b = (y1**2 - x1**3 - A * x1) % lifted_p modulo = curve.p**2 # do not verify curve params lifted_curve = ec_curve(lifted_a, lifted_b, lifted_p, verify=False) lifted_pt1 = lifted_curve.mult(curve.p - 1, lifted_curve(x1, y1)) lifted_pt2 = lifted_curve.mult(curve.p - 1, lifted_curve(x2, y2)) dx1 = ((lifted_pt1.x - x1) // curve.p) % modulo dy1 = ((lifted_pt2.x - x2) // curve.p) % modulo dx2 = lifted_pt1.y - y1 dy2 = lifted_pt2.y - y2 m = (dy1 * dx2 * modinv(dx1 * dy2, modulo)) % modulo return m % curve.p