This course teaches students the art and science of securing data in the presence of an adversary, namely cryptography. The course begins with the mathematical foundations of cryptography, including pseudo-random number generation, and hence proceeds with a coverage of secret key algorithms and public key algorithms. The students learn the principles of operation of such cryptographic techniques, along with representative algorithms from both fields. The students also learn attack techniques that apply to secret key algorithms and public key algorithms. The course teaches students the design and use of stream ciphers as well. The students learn various schemes to securely manage and exchange cryptographic keys. The students also learn applications of one-way functions to compute and verify hashes and digital signatures. The course also teaches students the principal identification schemes currently in use. Throughout the course, the students also learn the use of various cryptographic tools.