Ejemplo n.º 1
0
def _lambda(P, other=None):
    if other:
        Q = other
        a = (Q.y - P.y) % P.curve.field
        b = Q.x - P.x

        aux = abs(a)
        d = gcd(aux, b)

        a /= d; b /= d
        a = (a + P.curve.field) % P.curve.field
        if (a % b != 0):
            b = invmod(b, P.curve.field)
            return a * b % P.curve.field

        return a / b
    else:
        a = (3*P.x*P.x + P.curve.A) % P.curve.field
        b = 2*P.y

        aux = abs(a)
        d = gcd(aux, b)

        a /= d; b /= d
        a = (a + P.curve.field) % P.curve.field
        if (a % b != 0):
            b = invmod(b, P.curve.field)
            return a * b % P.curve.field

        return a / b
Ejemplo n.º 2
0
def _lambda(P, other=None):
    if other:
        Q = other
        a = (Q.y - P.y) % P.curve.field
        b = Q.x - P.x

        aux = abs(a)
        d = gcd(aux, b)

        a /= d
        b /= d
        a = (a + P.curve.field) % P.curve.field
        if (a % b != 0):
            b = invmod(b, P.curve.field)
            return a * b % P.curve.field

        return a / b
    else:
        a = (3 * P.x * P.x + P.curve.A) % P.curve.field
        b = 2 * P.y

        aux = abs(a)
        d = gcd(aux, b)

        a /= d
        b /= d
        a = (a + P.curve.field) % P.curve.field
        if (a % b != 0):
            b = invmod(b, P.curve.field)
            return a * b % P.curve.field

        return a / b
Ejemplo n.º 3
0
def server_func(n, return_dict):
    triples = {}
    triple_collided = []

    while (True):
        arg = server_pipe.recv()

        a = arg[0]
        b = arg[1]
        P = arg[2]
        P = str(P)

        if (triples.has_key(P)):
            triple_collided = arg
            break

        triples[P] = [a, b]

    am = triple_collided[0]
    bm = triple_collided[1]
    P = str(triple_collided[2])
    an = triples.get(P)[0]
    bn = triples.get(P)[1]

    if (bn == bm):
        raise ArithmeticError('Undefined value')

    f = an - am
    g = invmod(bm - bn, n)
    ret = (f * g) % n
    x = (ret + n) % n

    return_dict[0] = x
Ejemplo n.º 4
0
def client_func(E, P, Q):
    n = E.order
    gen = SystemRandom()
    an = gen.randrange(n)
    bn = gen.randrange(n)
    am = an
    bm = bn
    Xn = P * an + Q * bn
    Xm = Xn

    while (True):
        i = __H(Xn, L)
        Xn += R[i]
        an += c[i]
        bn += d[i]

        for j in range(2):
            h = __H(Xm, L)
            Xm += R[h]
            am += c[h]
            bm += d[h]

        if Xn == Xm:
            break

    if (bn == bm):
        raise ArithmeticError('Undefined value')

    f = an - am
    g = invmod(bm - bn, n)
    ret = (f * g) % n
    ret = (ret + n) % n
    sendToServer(ret)
Ejemplo n.º 5
0
def client_func(E, P, Q):
    n = E.order
    gen = SystemRandom()
    an = gen.randrange(n)
    bn = gen.randrange(n)
    am = an
    bm = bn
    Xn = P*an + Q*bn
    Xm = Xn

    while (True):
        i = __H(Xn, L)
        Xn += R[i]
        an += c[i]
        bn += d[i]

        for j in range(2):
            h = __H(Xm, L)
            Xm += R[h]
            am += c[h]
            bm += d[h]

        if Xn == Xm:
            break

    if (bn == bm):
        raise ArithmeticError('Undefined value')

    f = an-am
    g = invmod(bm-bn, n)
    ret = (f * g) % n
    ret = (ret + n) % n
    sendToServer(ret)
Ejemplo n.º 6
0
def original(E, P, Q):
    print 'Algorithm: original'

    a = []
    b = []
    v = []
    R = P

    n = E.order()
    v.append(R)
    a.append(1)
    b.append(0)

    i = 1
    while (True):
        # print str(i) + ' | a: ' + str(a[-1]) + ' | b: ' + str(b[-1]),
        # s = 0

        y = v[-1].y
        if (y >= 0 and y < 15):
            v.append(v[-1] + Q)
            a.append(a[-1])
            b.append(b[-1] + 1)
            # s = 1
        elif y >= 15 and y < 30:
            v.append(v[-1] * 2)
            a.append(2 * a[-1] % n)
            b.append(2 * b[-1] % n)
            # s = 2
        else:
            v.append(v[-1] + P)
            a.append(a[-1] + 1)
            b.append(b[-1])
            # s = 3

            # print ' | S:' + str(s),
            # print '\t| (' + str(v[i].x) + ', ' + str(v[i].y) + ')'

        if (v[i].x == v[i / 2].x and v[i].y == v[i / 2].y and i > 2
                and i % 2 == 0):
            # print 'FOUND!\n' + str(i) + ': (' + str(v[i].x) + ', ' + str(v[i].y) + ')',
            # print 'and ' + str(i/2) + ': (' + str(v[i/2].x) + ', ' + str(v[i/2].y) + ')'
            am = a[i / 2]
            an = a[i]
            bm = b[i / 2]
            bn = b[i]
            break

        i += 1

    if bm == bn:
        raise ArithmeticError('Undefined value')

    c = an - am
    d = invmod(bm - bn, n)
    ret = (c * d) % n
    return (ret + n) % n
Ejemplo n.º 7
0
def original(E, P, Q):
    print 'Algorithm: original'

    a = []; b = []; v = []
    R = P

    n = E.order()
    v.append(R)
    a.append(1)
    b.append(0)

    i = 1
    while (True):
        # print str(i) + ' | a: ' + str(a[-1]) + ' | b: ' + str(b[-1]),
        # s = 0

        y = v[-1].y
        if (y >= 0 and y < 15):
            v.append(v[-1] + Q)
            a.append(a[-1])
            b.append(b[-1] + 1)
            # s = 1
        elif y >= 15 and y < 30:
            v.append(v[-1] * 2)
            a.append(2*a[-1] % n)
            b.append(2*b[-1] % n)
            # s = 2
        else:
            v.append(v[-1] + P)
            a.append(a[-1] + 1)
            b.append(b[-1])
            # s = 3

            # print ' | S:' + str(s),
            # print '\t| (' + str(v[i].x) + ', ' + str(v[i].y) + ')'

        if (v[i].x == v[i/2].x and
            v[i].y == v[i/2].y and
            i > 2 and i % 2 == 0):
            # print 'FOUND!\n' + str(i) + ': (' + str(v[i].x) + ', ' + str(v[i].y) + ')',
            # print 'and ' + str(i/2) + ': (' + str(v[i/2].x) + ', ' + str(v[i/2].y) + ')'
            am = a[i/2]
            an = a[i]
            bm = b[i/2]
            bn = b[i]
            break

        i += 1

    if bm == bn:
        raise ArithmeticError('Undefined value')

    c = an - am
    d = invmod(bm - bn, n)
    ret = (c * d) % n
    return (ret + n) % n
Ejemplo n.º 8
0
def test_has_invmod():
    for modulus in range(2, 1000, 31):
        for a in range(2, modulus, 5):
            if has_invmod(a, modulus):
                x = invmod(a, modulus)
                assert (a * x) % modulus == 1
            else:
                assert gcd(a, modulus) != 1
    with pytest.raises(ValueError):
        has_invmod(1, 1)
    with pytest.raises(ValueError):
        has_invmod(1, 0)
    with pytest.raises(ValueError):
        has_invmod(1, -100)
    with pytest.raises(TypeError):
        has_invmod("qwe", 10)
    with pytest.raises(TypeError):
        has_invmod(10, "qwe")
Ejemplo n.º 9
0
def serial(E, P, Q):
    print 'Algorithm: serial'

    c = []
    d = []
    R = []
    n = E.order
    L = 4
    gen = SystemRandom()

    for i in range(L):
        c.append(gen.randrange(n - 1) + 1)
        d.append(gen.randrange(n - 1) + 1)
        R.append(P * c[-1] + Q * d[-1])

    an = gen.randrange(n)
    bn = gen.randrange(n)
    am = an
    bm = bn
    Xn = P * an + Q * bn
    Xm = Xn

    while (True):
        i = __H(Xn, L)
        Xn += R[i]
        an += c[i]
        bn += d[i]

        for j in range(2):
            h = __H(Xm, L)
            Xm += R[h]
            am += c[h]
            bm += d[h]

        if Xn == Xm:
            break

    if (bn == bm):
        raise ArithmeticError("Undefined value")

    f = an - am
    g = invmod(bm - bn, n)
    ret = (f * g) % n
    return (ret + n) % n
Ejemplo n.º 10
0
def serial(E, P, Q):
    print 'Algorithm: serial'

    c = []; d = []; R = []
    n = E.order
    L = 4
    gen = SystemRandom()

    for i in range(L):
        c.append(gen.randrange(n-1)+1)
        d.append(gen.randrange(n-1)+1)
        R.append(P*c[-1] + Q*d[-1])

    an = gen.randrange(n)
    bn = gen.randrange(n)
    am = an
    bm = bn
    Xn = P*an + Q*bn
    Xm = Xn

    while (True):
        i = __H(Xn, L)
        Xn += R[i]
        an += c[i]
        bn += d[i]

        for j in range(2):
            h = __H(Xm, L)
            Xm += R[h]
            am += c[h]
            bm += d[h]

        if Xn == Xm:
            break

    if (bn == bm):
        raise ArithmeticError("Undefined value")

    f = an-am
    g = invmod(bm-bn, n)
    ret = (f * g) % n
    return (ret + n) % n
Ejemplo n.º 11
0
def test_invmod():
    for modulus in range(3, 1001, 37):
        for a in range(2, modulus, 5):
            if has_invmod(a, modulus):
                x = invmod(a, modulus)
                assert (a * x) % modulus == 1
            else:
                with pytest.raises(ValueError):
                    invmod(a, modulus)
    with pytest.raises(ValueError):
        invmod(1, 1)
    with pytest.raises(ValueError):
        invmod(1, 0)
    with pytest.raises(ValueError):
        invmod(1, -100)
    with pytest.raises(TypeError):
        invmod("qwe", 10)
    with pytest.raises(TypeError):
        invmod(10, "qwe")
Ejemplo n.º 12
0
from fractions import gcd
from libnum import modular

N1 = 9055404640500300109405801152935663267176218320785348541566663982172162265778445107320065187449062375525002632043722734566593185461999286625234528036605141
N2 = 3367646059138877442579820972831876412006279917097809082279412851693123955964282545145500497393579598954859534731890460229194372339215098506788375050698427369

c = 0xf5ed9da29d8d260f22657e091f34eb930bc42f26f1e023f863ba13bee39071d1ea988ca62b9ad59d4f234fa7d682e22ce3194bbe5b801df3bd976db06b944da
e = 65537

q = gcd(N1, N2)

d = modular.invmod(e, (q-1)*(N1/q-1))

print hex(pow(c, d, N1))[2:-1]