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
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
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
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)
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)
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
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
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")
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
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
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")
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]