While the mathematical study of cryptography has yielded a rich theory, and while the use of cryptography has become quite widespread, there is unfortunately still a significant gap between the theory and practice of cryptography. The goal of this project is to bridge this gap. The emphasis will be on the design and analysis of fundamental cryptographic primitives, such as hash functions and block ciphers, as well as other primitives derived from them, that are practical and yet theoretically sound. Indeed, hash functions and block ciphers are used in almost any cryptographic application.