Public cryptosystem