Public-key cryptosystem