basic principles of public key cryptography