Source: "Practical Cryptography in Python: Learning Correct Cryptography" Seth James Nielson, Christopher K. Monson