Public key algorithm