def generate_random(bit_size, include_negative_range, seeded, full_range): global global_random_state if not seeded or global_random_state is None: global_random_state = gmpy2.random_state() x = zero if full_range: x = gmpy2.mul_2exp(one, bit_size - 1) tmp = 0 if bit_size < 33: tmp = gmpy2.mpz_random(global_random_state, RAND_MAX) temp = (1 << bit_size) x = gmpy2.f_mod(tmp, temp) if include_negative_range: tmp = gmpy2.mul_2exp(one, bit_size - 1) x = gmpy2.sub(x, tmp) return x for i in range(bit_size - 32, 0 - 1, -32): tmp = gmpy2.mpz_random(global_random_state, RAND_MAX) tmp = gmpy2.mul_2exp(tmp, i) x = gmpy2.add(x, tmp) x = gmpy2.add(x, gmpy2.mpz_random(global_random_state, RAND_MAX)) if include_negative_range: tmp = gmpy2.mul_2exp(one, bit_size - 1) x = gmpy2.sub(x, tmp) return mpz(x)
def generate_secret_key(self): tmp = mpz() self.sk = gmpy2.mul_2exp(1, eta - 1) random_state = gmpy2.random_state(mpz(time.time())) i = eta - 32 while i >= 0: tmp = gmpy2.mpz_random(random_state, RAND_MAX) tmp = gmpy2.mul_2exp(tmp, i) self.sk += tmp i -= 32 self.sk += gmpy2.mpz_random(random_state, RAND_MAX) self.sk = mpz(self.sk * 2 + 1)
def generate_x_i(sk, length): tmp, q, r = 0, 0, 0 q = gmpy2.mul_2exp(one, length - 1) gmpy2.random_state() for i in range(length - 32, 0 - 1, -32): tmp = gmpy2.get_random() tmp = gmpy2.mul_2exp(tmp, i) q = gmpy2.add(tmp, q) q = gmpy2.add(q, gmpy2.get_random()) r = generate_random(rho, True, False, False) x_i = gmpy2.mul(q, sk) x_i = gmpy2.add(r, x_i) return x_i
def generate_sparse_matrix(u_1, modified_secret_key, x_p): global global_random_state seed = mpz(time.time()) global_random_state = gmpy2.random_state(seed) Theta_vector = [0 for _ in range(Theta)] for i in range(1, Theta): Theta_vector[i] = generate_random(kappa + 1, False, True, False) modified_secret_key[0] = True for i in range(1, Theta): modified_secret_key[i] = False count = theta - 1 gmpy2.random_state() while count > 0: index = gmpy2.mpz_random(global_random_state, RAND_MAX) % Theta if not modified_secret_key[index]: modified_secret_key[index] = True count -= 1 sum_ = zero temp = gmpy2.mul_2exp(one, kappa + 1) for i in range(1, Theta): if modified_secret_key[i]: sum_ = gmpy2.add(sum_, Theta_vector[i]) sum_ %= temp u_1 = gmpy2.sub(x_p, sum_) if u_1 < zero: u_1 = gmpy2.add(temp, u_1) return mpz(seed), mpz(u_1)
def recrypt_util(self, encrypted_z, ct, PKC): global global_random_state u_i = [mpz() for i in range(Theta)] u_i[0] = mpz(self.u_1) global_random_state = gmpy2.random_state(self.seed) for i in range(1, Theta): u_i[i] = generate_random(kappa + 1, False, True, False) z_i = [] den = mpz(gmpy2.mul_2exp(1, kappa)) Sum = binary_real(zero, one, n + e) for i in range(Theta): num = u_i[i] * ct z_i.append(binary_real(num, den, n + e)) for i in range(Theta): for j in range(n + 1 + e): if j == 0: if z_i[i].decimal == 1: encrypted_z[i][j] = mpz(1) else: encrypted_z[i][j] = mpz(0) else: if z_i[i].value[j - 1] is True: encrypted_z[i][j] = mpz(1) else: encrypted_z[i][j] = mpz(0)
def __init__(self): self.sk = mpz(0) self.pk = [mpz(0) for i in range(2 * beta + 1)] self.seed = 0 self.u_1 = mpz(0) self.modified_secret_key = [mpz(0) for i in range(Theta)] self.encrypted_sk = [mpz(0) for i in range(Theta)] sk_file_check = Path('secret_key.txt') if not sk_file_check.is_file(): print('generating secret key') sk_file = open('secret_key.txt', 'w') self.generate_secret_key() sk_file.write(self.sk.digits()) sk_file.close() else: print('loading secret key') sk_file = open('secret_key.txt', 'r') self.sk = mpz(sk_file.read()) sk_file.close() print('secret key:', self.sk) pk_file_check = Path('short_public_key.txt') if not pk_file_check.is_file(): pk_file = open('short_public_key.txt', 'w') self.generate_public_key() pk_file.writelines("%s\n" % str(pk_i.digits()) for pk_i in self.pk) print('public key generated,', len(self.pk), 'elements') #print([str(pk_i) for pk_i in self.pk]) pk_file.close() else: pk_file = open('short_public_key.txt', 'r') self.pk = [mpz(element.rstrip()) for element in pk_file.readlines()] print('public key loaded,', len(self.pk), 'elements') pk_file.close() enc_sk_file_check = Path('encrypted_sk_and_seed.txt') if not enc_sk_file_check.is_file(): x_p = mpz(gmpy2.mul_2exp(1, kappa)) x_p = mpz(gmpy2.f_div(x_p, self.sk)) self.seed, self.u_1 = generate_sparse_matrix(self.u_1, self.modified_secret_key, x_p) for i in range(Theta): if self.modified_secret_key[i] is True: self.encrypted_sk[i] = self.symmetric_encryption(self.encrypted_sk[i], 1) else: self.encrypted_sk[i] = self.symmetric_encryption(self.encrypted_sk[i], 0) enc_sk_file = open('encrypted_sk_and_seed.txt', 'w') enc_sk_file.write('%s\n' % str(self.seed)) enc_sk_file.write('%s\n' % str(self.u_1)) for i in range(Theta): enc_sk_file.write('%s\n' % str(self.encrypted_sk[i])) enc_sk_file.close() else: enc_sk_file = open('encrypted_sk_and_seed.txt', 'r') file_contents = [element.rstrip() for element in enc_sk_file.readlines()] self.seed = int(file_contents[0]) self.u_1 = mpz(file_contents[1]) temp = mpz() for i in range(Theta): self.encrypted_sk[i] = mpz(file_contents[i+2]) temp = self.decrypt_bit(self.encrypted_sk[i]) if temp == 1: self.modified_secret_key[i] = True else: self.modified_secret_key[i] = False enc_sk_file.close()