Why Classical Ciphers Are Insecure
Perfect Encryption: The One-Time Pad
Encrypting with the One-Time Pad
Why Is the One-Time Pad Secure?
When Ciphers Do More Than Encryption
Randomness as a Probability Distribution
Entropy: A Measure of Uncertainty
Random Number Generators (RNGs) and Pseudorandom Number Generators (PRNGs)
Cryptographic vs. Non-Cryptographic PRNGs
The Uselessness of Statistical Tests
Generating Random Bits in Unix-Based Systems
The CryptGenRandom() Function in Windows
A Hardware-Based PRNG: RDRAND in Intel Microprocessors
Insufficient Entropy at Boot Time
Sampling Bug with Strong Randomness
Security in Theory: Informational Security
Security in Practice: Computational Security
Choosing and Evaluating Security Levels
How to Construct Block Ciphers
The Slide Attack and Round Keys
Substitution–Permutation Networks
The Advanced Encryption Standard (AES)
The Electronic Codebook (ECB) Mode
The Cipher Block Chaining (CBC) Mode
How to Encrypt Any Message in CBC Mode
Stateful and Counter-Based Stream Ciphers
Hardware-Oriented Stream Ciphers
Software-Oriented Stream Ciphers
Weak Ciphers Baked Into Hardware
Compression-Based Hash Functions: The Merkle–Damgård Construction
Permutation-Based Hash Functions: Sponge Functions
The SHA Family of Hash Functions
Fooling Proof-of-Storage Protocols
Message Authentication Codes (MACs)
Forgery and Chosen-Message Attacks
Why PRFs Are Stronger Than MACs
Creating Keyed Hashes from Unkeyed Hashes
The Secret-Prefix Construction
The Secret-Suffix Construction
A Generic Attack Against Hash-Based MACs
Creating Keyed Hashes from Block Ciphers: CMAC
Timing Attacks on MAC Verification
Authenticated Encryption Using MACs
Authenticated Encryption with Associated Data
Avoiding Predictability with Nonces
What Makes a Good Authenticated Cipher?
AES-GCM: The Authenticated Cipher Standard
OCB: An Authenticated Cipher Faster than GCM
SIV: The Safest Authenticated Cipher?
Polynomial vs. Superpolynomial Time
Nondeterministic Polynomial Time
Factoring Large Numbers in Practice
The Discrete Logarithm Problem
Small Hard Problems Aren’t Hard
RSA Key Generation and Security
Breaking Textbook RSA Encryption’s Malleability
Breaking Textbook RSA Signatures
Fast Exponentiation Algorithm: Square-and-Multiply
Small Exponents for Faster Public-Key Operations
The Bellcore Attack on RSA-CRT
Sharing Private Exponents or Moduli
The Computational Diffie–Hellman Problem
The Decisional Diffie–Hellman Problem
An Example of Non-DH Key Agreement
Attack Models for Key Agreement Protocols
Diffie–Hellman Key Agreement over Elliptic Curves
Encrypting with Elliptic Curves
Breaking ECDH Using Another Curve
Target Applications and Requirements
The TLS and SSL Family of Protocols: A Brief History
Certificates and Certificate Authorities
TLS 1.3 Cryptographic Algorithms
TLS 1.3 Improvements over TLS 1.2
Compromised Certificate Authority
Exponential Speed-Up and Simon’s Problem
The Threat of Shor’s Algorithm
Shor’s Algorithm Solves the Factoring Problem
Shor’s Algorithm and the Discrete Logarithm Problem
Why Is It So Hard to Build a Quantum Computer?
Post-Quantum Cryptographic Algorithms