Public-key encryption schemes