This course is a second-semester security course, following the first-semester CSC 581 (Principles of Computer Security) and focusing on the theory and practice of cryptography, one of the most powerful sets of tools available for building secure computing and communication systems. This course emphasizes formal models, rigorous thinking, and reasoning about security. Cryptographic primitives covered include private and public-key encryption, message authentication codes, hash functions, digital signatures, secret sharing, and zero-knowledge proofs.