def elliptic_hash(msg: bytes, CURVE: Curve): p = CURVE.p i = 0 while True: i += 1 prefixed_msg = str(i).encode() + msg h = sha256(prefixed_msg).hexdigest() x = int(h, 16) if x >= p: continue y_sq = (x ** 3 + CURVE.a * x + CURVE.b) % p y = mod_sqrt(y_sq, p)[0] if CURVE.is_point_on_curve((x, y)): b = int(md5(prefixed_msg).hexdigest(), 16) % 2 return Point(x, y, CURVE) if b else Point(x, p - y, CURVE)
p = 0xc57d3e540e595f1304bf81dcdc471a1e4b8614472c5820f951f483c04d0c3d79 a = -3 b = 88217653075733538010802362020423294317799277142495418239747303142947508953346 curv = Curve('curva', p, a, b, None, xx, yy) curve = curv.G # 3179547229186215041788349730328093574817817367684014147655936757452044075920 distance = pow(7, 64, p) ys = [] xs = [] for i in range(0x10000): s = msb_of_r1 + str(hex(i))[2:] y_squared = curv.evaluate(int(s, 16)) y = labmath.sqrtmod_prime(y_squared, p) point = (int(s, 16), y) if curv.is_point_on_curve(point): point = Point(int(s, 16), y, curve=curv) hx = point * distance q = Point(qx, qy, curve=curv) l = hx.x m = hex((l * q).x) #print(m[:6]) if m[:6] == lsb_of_r2: print(l) print(m) print(len(xs))