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