Ejemplo n.º 1
0
def generate_paillier_keypair(private_keyring=None, n_length=DEFAULT_KEYSIZE):
    """Return a new :class:`PaillierPublicKey` and :class:`PaillierPrivateKey`.

    Add the private key to *private_keyring* if given.

    Args:
      private_keyring (PaillierPrivateKeyring): a
        :class:`PaillierPrivateKeyring` on which to store the private
        key.
      n_length: key size in bits.

    Returns:
      tuple: The generated :class:`PaillierPublicKey` and
      :class:`PaillierPrivateKey`
    """
    p = q = n = None
    n_len = 0
    while n_len != n_length:
        p = getprimeover(n_length // 2)
        q = p
        while q == p:
            q = getprimeover(n_length // 2)
        n = p * q
        n_len = n.bit_length()

    public_key = PaillierPublicKey(n)
    private_key = PaillierPrivateKey(public_key, p, q)

    if private_keyring is not None:
        private_keyring.add(private_key)

    return public_key, private_key
Ejemplo n.º 2
0
def generate_paillier_keypair(private_keyring=None, n_length=DEFAULT_KEYSIZE):
    """Return a new :class:`PaillierPublicKey` and :class:`PaillierPrivateKey`.

    Add the private key to *private_keyring* if given.

    Args:
      private_keyring (PaillierPrivateKeyring): a
        :class:`PaillierPrivateKeyring` on which to store the private
        key.
      n_length: key size in bits.

    Returns:
      tuple: The generated :class:`PaillierPublicKey` and
      :class:`PaillierPrivateKey`
    """
    p = q = n = None
    n_len = 0
    while n_len != n_length:
        p = getprimeover(n_length // 2)
        q = p
        while q == p:
            q = getprimeover(n_length // 2)
        n = p * q
        nsquare = n * n
        n_len = n.bit_length()

    random_alpha = random.randrange(34359738368) % nsquare
    public_key = PaillierPublicKey(n,p,q, random_alpha)
    private_key = PaillierPrivateKey(public_key, p, q, random_alpha)

    if private_keyring is not None:
        private_keyring.add(private_key)

    return public_key, private_key
Ejemplo n.º 3
0
def generate_paillier_keypair(private_keyring=None, n_length=DEFAULT_KEYSIZE):
    """Return a new :class:`PaillierPublicKey` and :class:`PaillierPrivateKey`.

    Add the private key to *private_keyring* if given.

    Args:
      private_keyring (PaillierPrivateKeyring): a
        :class:`PaillierPrivateKeyring` on which to store the private
        key.
      n_length: key size in bits.

    Returns:
      tuple: The generated :class:`PaillierPublicKey` and
      :class:`PaillierPrivateKey`
    """
    p = q = n = None
    n_len = 0
    while n_len != n_length:
        p = getprimeover(n_length // 2) #根据偶数返回一个随机的N位素数。
        q = p
        while q == p:
            q = getprimeover(n_length // 2) #根据偶数返回一个随机的N位素数。
        n = p * q
        n_len = n.bit_length()  #二进制长度

    public_key = PaillierPublicKey(n)   #生成N位公钥
    private_key = PaillierPrivateKey(public_key, p, q)  #根据公钥和P,Q生成私钥

    if private_keyring is not None:
        private_keyring.add(private_key)

    return public_key, private_key
Ejemplo n.º 4
0
    def testcPDSRandomNumberGenerator(self, n_length=DEFAULT_KEYSIZE):
        p = q = n = None
        n_len = 0
        while n_len != n_length:
            p = getprimeover(n_length // 2)
            q = p
            while q == p:
                q = getprimeover(n_length // 2)
            n = p * q
            n_len = n.bit_length()

        r = paillier.generate_random_value(n, 4)
        self.assertEqual(sum(r), 0)
Ejemplo n.º 5
0
def generate_random_value(old_n, m):
    n_length = 512
    p = q = n = None
    n_len = 0
    while n_len != n_length:
        p = getprimeover(n_length // 2)
        q = p
        while q == p:
            q = getprimeover(n_length // 2)
        n = p * q
        n_len = n.bit_length()

    r = [0] * m
    for i in range(m - 1):
        r[i] = random.SystemRandom().randrange(1, n)

    r[-1] = sum(r) * -1
    return r
def generate_paillier_keypair(private_keyring=None, n_length=DEFAULT_KEYSIZE):
    p = q = n = None
    n_len = 0
    while n_len != n_length:
        p = getprimeover(n_length // 2)
        q = p
        while q == p:
            q = getprimeover(n_length // 2)
        n = p * q
        n_len = n.bit_length()

    public_key = PaillierPublicKey(n)
    private_key = PaillierPrivateKey(public_key, p, q)

    if private_keyring is not None:
        private_keyring.add(private_key)

    return n, public_key, private_key
Ejemplo n.º 7
0
def generate_cPDS_keypair(m=4, n_length=DEFAULT_KEYSIZE):
    """Return a new :class:`PaillierPublicKey` and :class:`PaillierPrivateKey`.

    Add the private key to *private_keyring* if given.

    Args:
      private_keyring (PaillierPrivateKeyring): a
        :class:`PaillierPrivateKeyring` on which to store the private
        key.
      n_length: key size in bits.

    Returns:
      tuple: The generated :class:`PaillierPublicKey` and
      :class:`PaillierPrivateKey`
    """
    p = q = n = None
    n_len = 0
    while n_len != n_length:
        p = getprimeover(n_length // 2)
        q = p
        while q == p:
            q = getprimeover(n_length // 2)
        n = p * q
        n_len = n.bit_length()

    # g in Z*n^2
    #g = random.SystemRandom().randrange(1, n**2)
    g = n + 1

    mpk = PaillierPublicKey(n, g)
    msk = PaillierPrivateKey(mpk, p, q)

    r = generate_random_value(n, m)

    public_key = [0] * m
    private_key = [0] * m
    for i in range(m):
        public_key[i], private_key[i] = generate_key_pairs(n, g, p, q, r[i])

    return mpk, msk, public_key, private_key
Ejemplo n.º 8
0
def keysDGK(n_length=DEFAULT_KEYSIZE,
            l=DEFAULT_MSGSIZE,
            t=DEFAULT_SECURITYSIZE):
    u = 2**l
    len_vp = t + 1
    while len_vp > t:
        vp = getprimeover(t)
        len_vp = vp.bit_length()
    len_vq = t + 1
    while len_vq > t:
        vq = getprimeover(t)
        len_vq = vq.bit_length()
    n_len = 0
    prime = 0
    # print(u,vp,vq)
    while n_len != n_length:
        fp = getprimeover((n_length // 2) - l - t)
        p = u * vp * fp + 1
        # print(p.bit_length())
        while (not (gmpy2.is_prime(p))):
            fp = getprimeover((n_length // 2) - l - t)
            p = u * vp * fp + 1
        fq = getprimeover((n_length // 2) - l - t + 1)
        q = u * vq * fq + 1
        # print(q.bit_length())
        while (not (gmpy2.is_prime(q))):
            fq = getprimeover((n_length // 2) - l - t + 1)
            q = u * vq * fq + 1
        n = p * q
        n_len = n.bit_length()
        # print(n_len)

    n = p * q
    g, h = find_gens(p, q, u, vp, vq, fp, fq, n, n_length, l, t)
    return p, q, u, vp, vq, fp, fq, g, h
Ejemplo n.º 9
0
def generate_paillier_keypair(private_keyring=None, n_length=DEFAULT_KEYSIZE):
    """Return a new :class:`PaillierPublicKey` and :class:`PaillierPrivateKey`.

    Add the private key to *private_keyring* if given.

    Args:
      private_keyring (PaillierPrivateKeyring): a
        :class:`PaillierPrivateKeyring` on which to store the private
        key.
      n_length: key size in bits.

    Returns:
      tuple: The generated :class:`PaillierPublicKey` and
      :class:`PaillierPrivateKey`
    """
    p = q = n = None
    n_len = 0
    while n_len != n_length:
        p = getprimeover(n_length // 2)
        q = getprimeover(n_length // 2)
        n = p * q
        n_len = n.bit_length()
    # Simpler Paillier variant with g=n+1 results in lambda equal to phi
    # and mu is phi inverse mod n.
    g = n + 1

    public_key = PaillierPublicKey(g, n)

    phi_n = (p - 1) * (q - 1)
    Lambda = phi_n
    mu = invert(phi_n, n)

    private_key = PaillierPrivateKey(public_key, Lambda, mu)

    if private_keyring is not None:
        private_keyring.add(private_key)

    return public_key, private_key
Ejemplo n.º 10
0
def generate_paillier_keypair(private_keyring=None, n_length=DEFAULT_KEYSIZE):
    """Return a new :class:`PaillierPublicKey` and :class:`PaillierPrivateKey`.

    Add the private key to *private_keyring* if given.

    Args:
      private_keyring (PaillierPrivateKeyring): a
        :class:`PaillierPrivateKeyring` on which to store the private
        key.
      n_length: key size in bits.

    Returns:
      tuple: The generated :class:`PaillierPublicKey` and
      :class:`PaillierPrivateKey`
    """
    p = q = n = None
    n_len = 0
    while n_len != n_length:
        p = getprimeover(n_length // 2)
        q = getprimeover(n_length // 2)
        n = p * q
        n_len = n.bit_length()
    # Simpler Paillier variant with g=n+1 results in lambda equal to phi
    # and mu is phi inverse mod n.
    g = n + 1

    public_key = PaillierPublicKey(g, n)

    phi_n = (p - 1) * (q - 1)
    Lambda = phi_n
    mu = invert(phi_n, n)

    private_key = PaillierPrivateKey(public_key, Lambda, mu)

    if private_keyring is not None:
        private_keyring.add(private_key)

    return public_key, private_key
Ejemplo n.º 11
0
 def testPrimeOverN(self):
     self.assertIn(util.getprimeover(3), {5, 7, 11, 13})
     # Test we get at least a N-bit prime
     for n in range(2, 50):
         p = util.getprimeover(n)
         self.assertGreaterEqual(p, 1 << (n-1))
Ejemplo n.º 12
0
 def testPrimeOverN(self):
     self.assertIn(util.getprimeover(3), {5, 7, 11, 13})
     # Test we get at least a N-bit prime
     for n in range(2, 50):
         p = util.getprimeover(n)
         self.assertGreaterEqual(p, 1 << (n - 1))
Ejemplo n.º 13
0
def find_gens(p,
              q,
              u,
              vp,
              vq,
              fp,
              fq,
              n,
              n_length=DEFAULT_KEYSIZE,
              l=DEFAULT_MSGSIZE,
              t=DEFAULT_SECURITYSIZE):
    found = False
    # compute g from CRT with g mod p = xp, g mod q = xq, g = g^(fp*fq) mod n
    # xp is a prime element from Z^*_p, that does not have order a divisor of fp*u*vp
    exp1 = mpz(fp * vp * u / 2)
    exp2 = mpz(vp * u)
    exp3 = mpz(fp * vp)
    p_len = p.bit_length()
    while not (found):
        xp = getprimeover(p_len)
        if (xp < p):
            found = True
        if (found):
            order = gmpy2.powmod(xp, exp1, p)
            if (order == 1):
                found = False
            else:
                order = gmpy2.powmod(xp, exp2, p)
                if (order == 1):
                    found = False
                else:
                    order = gmpy2.powmod(xp, exp3, p)
                    if (order == 1):
                        found = False
    # xq is a prime element from Z^*_q, that does not have order a divisor of fq*u*vq
    found = False
    exp1 = mpz(fq * vq * u / 2)
    exp2 = mpz(vq * u)
    exp3 = mpz(fq * vq)
    q_len = q.bit_length()
    while not (found):
        xq = getprimeover(q_len)
        if (xq < q):
            found = True
        if (found):
            order = gmpy2.powmod(xq, exp1, q)
            if (order == 1):
                found = False
            else:
                order = gmpy2.powmod(xq, exp2, q)
                if (order == 1):
                    found = False
                else:
                    order = gmpy2.powmod(xq, exp3, q)
                    if (order == 1):
                        found = False
    # CRT: g = xp*q*(q^{-1}mod p) + xq*p*(p^{-1}mod q) mod n, g = g^(fp*fq) mod n
    inv_q = gmpy2.invert(q, p)
    inv_p = gmpy2.invert(p, q)
    tmp = xp * q * inv_q % n
    tmp2 = xq * p * inv_p % n
    g = (tmp + tmp2) % n
    g = gmpy2.powmod(g, fp * fq, n)
    # print(g)

    # compute h as xh^(fp*fq*u) mod n
    # xh is a prime element from Z^*_n
    found = False
    while not (found):
        xh = getprimeover(n_length)
        if (xh < n):
            found = True
    h = gmpy2.powmod(xh, fp * fq * u, n)
    # print(h)
    return g, h