Protecting Information: From Classical Error Correction to Quantum Cryptography