asymmetric cryptography, and hash functions. Most, if not all, cryptographic protocols require
one or more of these primitives. For each of these primitives, we give a typical use case
example, which demonstrates the importance of two components that are often overlooked
or (falsely) assumed present: secure keys and a strong random number generator.