Public key cryptosystem