The goal of this course is to provide students with a foundational understanding of cryptography as used in the real world. Students will learn about private-key encryption, message authentication codes, key-exchange protocols, public-key encryption, and digital signatures, in addition to learning about underlying primitives such as pseudorandom number generators, block ciphers, and hash functions. The course will also try to convey the "cryptographic mindset," including formal threat modeling and proofs of security. We will emphasize real-world usage of cryptography by covering standards and best practices, discussing attacks on deployed systems, and giving programming assignments meant to reinforce the concepts covered in class.