Cryptography: The Science of Making and Breaking Codes