def reenc_with_r(self, r): """ We would do this homomorphically, except that's no good when we do plaintext encoding of 1. """ new_c = Ciphertext() new_c.alpha = (self.alpha * pow(self.pk.g, r, self.pk.p)) % self.pk.p new_c.beta = (self.beta * pow(self.pk.y, r, self.pk.p)) % self.pk.p new_c.pk = self.pk return new_c
def __mul__(self, other): """ Homomorphic Multiplication of ciphertexts. """ if type(other) == int and (other == 0 or other == 1): return self if self.pk != other.pk: logging.info(self.pk) logging.info(other.pk) raise Exception('different PKs!') new = Ciphertext() new.pk = self.pk new.alpha = (self.alpha * other.alpha) % self.pk.p new.beta = (self.beta * other.beta) % self.pk.p return new
def __mul__(self,other): """ Homomorphic Multiplication of ciphertexts. """ if type(other) == int and (other == 0 or other == 1): return self if self.pk != other.pk: logging.info(self.pk) logging.info(other.pk) raise Exception('different PKs!') new = Ciphertext() new.pk = self.pk new.alpha = (self.alpha * other.alpha) % self.pk.p new.beta = (self.beta * other.beta) % self.pk.p return new
def encrypt_with_r(self, plaintext, r, encode_message=False): """ expecting plaintext.m to be a big integer """ ciphertext = Ciphertext() ciphertext.pk = self # make sure m is in the right subgroup if encode_message: y = plaintext.m + 1 if pow(y, self.q, self.p) == 1: m = y else: m = -y % self.p else: m = plaintext.m ciphertext.alpha = pow(self.g, r, self.p) ciphertext.beta = (m * pow(self.y, r, self.p)) % self.p return ciphertext
def encrypt_with_r(self, plaintext, r, encode_message= False): """ expecting plaintext.m to be a big integer """ ciphertext = Ciphertext() ciphertext.pk = self # make sure m is in the right subgroup if encode_message: y = plaintext.m + 1 if pow(y, self.q, self.p) == 1: m = y else: m = -y % self.p else: m = plaintext.m ciphertext.alpha = pow(self.g, r, self.p) ciphertext.beta = (m * pow(self.y, r, self.p)) % self.p return ciphertext