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)
예제 #2
0
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))