Ejemplo n.º 1
0
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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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()