def generate_keys(self): """ Generates key values for our cipher. """ prime_gen = PrimeNumberGenerator(self.start, self.stop, self.precision) try: p = prime_gen.generate_prime_number() while True: q = prime_gen.generate_prime_number() if q != p: break except: raise ValueError n = p * q euler_fcn = (p - 1) * (q - 1) while True: e = random.randint(1, euler_fcn) if self.co_prime(e, euler_fcn): break d = self.mod_inv(e, euler_fcn) return n, e, d
def encrypt(self, message, mod_n, e): """ Takes message and encrypts it. :param message: secret message :param mod_n: n value of public key :param e: e value of public key :return: list of encrypted signs """ numList = self.uni2num(message) return [PrimeNumberGenerator.modular_exp(letter, e, mod_n) for letter in numList]
def decrypt(self, cipher, mod_n, d): """ Takes encrypted list of longs and decrypt it :param cipher: secret encrypted message :param mod_n: n value of private key :param d: d value of private key :return: unicode message """ message = [PrimeNumberGenerator.modular_exp(letter, d, mod_n) for letter in cipher] return self.num2uni(message)