Cryptography is an indispensable tool for protecting information in computer systems. This course contains the inner workings of cryptographic systems and how to correctly use them in real-world applications. The course begins with a detailed discussion of how two parties who have a shared secret key can communicate securely when a powerful adversary eavesdrops and tampers with traffic. Examine many deployed protocols and analyze mistakes in existing systems. Discussion on public-key techniques that let two parties generate a shared secret key.