Symmetric key encryption uses a secret key that is shared between two computers to encrypt and decrypt messages sent between them. Public key encryption addresses the weakness of needing to securely share a key beforehand by using a hashing algorithm to generate keys from input values, making it nearly impossible to derive the original input without knowing the data used to create the hash. A popular implementation of public key encryption is Secure Sockets Layer (SSL) and its successor Transport Layer Security (TLS), which are Internet security protocols used by browsers and servers to transmit sensitive information securely.