03 Cryptography
Table of Contents
Overview
Cryptography is the mathematical science of securing information through encoding and decoding techniques. Modern cryptography provides the foundational security services that protect data confidentiality, integrity, and authenticity in digital systems.
Security Services
Confidentiality: Preventing unauthorized disclosure (encryption)
Integrity: Detecting unauthorized modification (hash functions, MACs)
Authentication: Verifying identity (digital signatures, MACs)
Non-repudiation: Preventing denial of actions (digital signatures)
Kerckhoffs's Principle
"A cryptosystem should be secure even if everything about the system, except the key, is public knowledge."
This principle, established in 1883, remains fundamental to modern cryptography. Security should depend solely on the secrecy of the key, not on the secrecy of the algorithm.
Cryptographic Primitives
Cryptographic primitives are the basic building blocks used to construct security protocols.
Primitive Categories
Encryption: Symmetric (single key: AES, ChaCha20), Asymmetric (public/private keys: RSA, ECC)
Authentication: Hash functions (SHA-256, SHA-3), MACs (HMAC), Digital signatures (RSA, ECDSA)
Key Establishment: Key exchange (Diffie-Hellman), Key encapsulation (RSA-KEM)
Symmetric Cryptography
Symmetric cryptography uses a single shared secret key for both encryption and decryption.
Symmetric Encryption Model
Plaintext (M) + Key (K) → [Encryption] → Ciphertext (C)
Ciphertext (C) + Key (K) → [Decryption] → Plaintext (M)Block Ciphers
Block ciphers encrypt fixed-size blocks of data (typically 128 bits).
Advanced Encryption Standard (AES)
AES is the current standard for symmetric encryption, adopted by NIST in 2001.
Parameters: Block size 128 bits, Key sizes 128/192/256 bits, Rounds 10/12/14, Structure: SPN
Operations: SubBytes (S-box substitution), ShiftRows (row shifting), MixColumns (column mixing), AddRoundKey (XOR with key)
Security: No practical attacks on full AES, brute force infeasible (2^256), quantum-resistant (2^128 with Grover's), hardware-accelerated (AES-NI)
Data Encryption Standard (DES) - Legacy
Parameters: Block 64 bits, Key 56 bits, 16 rounds, Feistel network
[BROKEN] (1998 brute-force), do not use. Triple DES (3DES): 112-bit effective strength, deprecated (NIST 2023), use AES
Block Cipher Modes of Operation
Block ciphers operate on fixed-size blocks; modes of operation enable encryption of arbitrary-length messages.
Electronic Codebook (ECB)
Each block encrypted independently. Identical plaintext → identical ciphertext. [INSECURE]: reveals patterns
Cipher Block Chaining (CBC)
Each block XORed with previous ciphertext. Requires unpredictable IV. [SECURE] with proper IV. [WARNING] Padding oracle attacks possible. Used in TLS 1.0-1.2
Counter (CTR)
Converts block cipher to stream cipher. Parallelizable, no padding needed, random access. [SECURE] with unique IV/counter
Galois/Counter Mode (GCM)
CTR mode + GMAC authentication. AEAD (Authenticated Encryption with Associated Data): provides confidentiality + integrity. Parallelizable, hardware-accelerated. Industry standard (TLS 1.3, IPsec). Critical: unique nonce per encryption (reuse breaks security)
Stream Ciphers
Stream ciphers generate a keystream that is XORed with plaintext.
ChaCha20
Modern stream cipher (256-bit key, 96-bit nonce). ChaCha20-Poly1305: AEAD like GCM. Used in TLS 1.3, SSH, VPNs. Better than AES on devices without hardware acceleration (no timing attacks, faster in software)
Symmetric Key Management Challenge
Problem: How to securely share secret keys? Pre-shared keys (not scalable), key distribution center (single point of failure). Solution: Asymmetric cryptography for key exchange
Asymmetric Cryptography
Asymmetric cryptography uses a pair of mathematically related keys: public key (shared openly) and private key (kept secret).
Asymmetric Encryption Model
Encryption: Plaintext + Public Key (PK) → Ciphertext
Decryption: Ciphertext + Private Key (SK) → PlaintextRSA (Rivest-Shamir-Adleman)
RSA is the most widely deployed public-key cryptosystem, based on the difficulty of factoring large integers.
RSA Key Generation & Operations
Generation: Select primes p, q → compute n = p×q, φ(n) = (p-1)(q-1) → choose e (commonly 65537) → compute d = e^(-1) mod φ(n). Public key (e, n), Private key (d, n)
Encryption: C = M^e mod n (public key) Decryption: M = C^d mod n (private key)
RSA Security
Based on hard factoring problem. Key sizes: 1024-bit (insecure, do not use), 2048-bit (minimum), 3072-bit (long-term), 4096-bit (high security)
Vulnerabilities: Textbook RSA insecure (use OAEP padding), timing attacks, quantum computers (Shor's algorithm breaks RSA)
Padding: PKCS#1 v1.5 (vulnerable), OAEP (secure, recommended)
Diffie-Hellman Key Exchange
Protocol for two parties to establish a shared secret over an insecure channel.
Diffie-Hellman Protocol
Alice & Bob exchange public values (A = g^a mod p, B = g^b mod p) → both compute shared secret s = g^(ab) mod p
Security: Based on Discrete Logarithm Problem. [WARNING] Vulnerable to MitM (mitigate with authentication)
ECDH: Same concept using elliptic curves. Shorter keys, preferred in modern protocols (TLS 1.3)
Elliptic Curve Cryptography (ECC)
ECC provides equivalent security to RSA with much shorter keys.
Security Comparison:
256 bits
3072 bits
128 bits
384 bits
7680 bits
192 bits
521 bits
15360 bits
256 bits
Advantages:
Smaller keys → less storage, faster computation
Better performance on mobile and IoT devices
Lower bandwidth requirements
Commonly Used Curves:
NIST P-256 (secp256r1): Widely deployed, some concerns about NSA involvement
Curve25519: Modern, fast, designed to avoid implementation pitfalls
secp384r1: Higher security level
Applications:
TLS/SSL (ECDHE key exchange)
Bitcoin and cryptocurrencies (ECDSA signatures)
SSH
Signal Protocol (X25519)
Hash Functions
Cryptographic hash functions map arbitrary-length input to fixed-length output (digest).
Hash Function Properties
Required Properties:
Preimage Resistance (One-way):
Given hash h, computationally infeasible to find message m such that H(m) = h
Prevents password recovery from hashes
Second Preimage Resistance (Weak collision resistance):
Given message m1, computationally infeasible to find m2 ≠ m1 such that H(m1) = H(m2)
Prevents substitution attacks
Collision Resistance (Strong collision resistance):
Computationally infeasible to find any m1 ≠ m2 such that H(m1) = H(m2)
Required for digital signatures
Desirable Properties:
Deterministic: Same input always produces same output
Fast computation: Efficient to compute
Avalanche effect: Small change in input drastically changes output
Fixed output size: Regardless of input size
SHA Family (Secure Hash Algorithm)
SHA-1 (Legacy)
Output: 160 bits (20 bytes)
Status: Broken (practical collision attacks demonstrated in 2017)
History: Designed by NSA, published 1995
Attacks: SHAttered attack produced identical SHA-1 hashes for different PDFs
Do not use: Replaced by SHA-2
SHA-2 Family
SHA-224
224 bits
512 bits
112 bits
SHA-256
256 bits
512 bits
128 bits
SHA-384
384 bits
1024 bits
192 bits
SHA-512
512 bits
1024 bits
256 bits
Status: Secure, widely deployed
Design: Merkle-Damgård construction
Applications: Digital signatures, certificate authorities, blockchain
Performance: Hardware-accelerated on modern CPUs
SHA-3 (Keccak)
Output sizes: 224, 256, 384, 512 bits
Design: Sponge construction (different from SHA-2)
Status: Secure, but less widely adopted than SHA-2
Advantage: Different design provides diversity (hedging against SHA-2 vulnerabilities)
Performance: Slower than SHA-2 in software, faster in hardware
Hash Function Applications
Password Storage:
Insecure: Store password directly
Better: Store H(password)
Secure: Store H(password || salt) using Argon2/bcryptDigital Signatures:
Sign H(message) instead of message (efficiency)Data Integrity:
File download: Provide SHA-256 hash for verification
Git commits: Identified by SHA-1 hash of contentsBlockchain:
Bitcoin: Double SHA-256 for proof-of-work
Merkle trees: Efficient verification of transaction inclusionBirthday Paradox and Collision Resistance
Birthday Attack:
With n-bit hash, collision found in ~2^(n/2) attempts
Example: SHA-256 (256 bits) requires ~2^128 attempts for collision
Implication: Hash should be twice as long as desired security level
Message Authentication Codes
Message Authentication Codes (MACs) provide both integrity and authentication using a shared secret key.
MAC Construction
Tag = MAC(Key, Message)
Verification: Compare received tag with computed tagProperties:
Only parties with the key can create valid tags
Detects any modification of message
Does not provide non-repudiation (both parties have the key)
HMAC (Hash-based MAC)
HMAC Construction:
HMAC(K, M) = H((K ⊕ opad) || H((K ⊕ ipad) || M))
Where:
K = secret key (padded to block size)
M = message
H = hash function (e.g., SHA-256)
opad = outer padding (0x5c repeated)
ipad = inner padding (0x36 repeated)
|| = concatenationProperties:
Proven secure if underlying hash function is secure
No known attacks on HMAC-SHA256
Widely used in TLS, IPsec, SSH
Common Variants:
HMAC-SHA256: 256-bit output
HMAC-SHA512: 512-bit output
HMAC-SHA1: Legacy, still used in some protocols
Encrypt-then-MAC
Authenticated Encryption Approaches:
Encrypt-and-MAC (E&M): C = Enc(K1, M), T = MAC(K2, M)
Potential security issues
MAC-then-Encrypt (MtE): C = Enc(K1, M || MAC(K2, M))
Used in TLS 1.0-1.2, vulnerable to padding oracle attacks
Encrypt-then-MAC (EtM): C = Enc(K1, M), T = MAC(K2, C)
Provably secure, recommended approach
Used in IPsec
Modern Alternative:
Use AEAD modes (GCM, ChaCha20-Poly1305) instead of separate MAC
Digital Signatures
Digital signatures provide authentication, integrity, and non-repudiation using asymmetric cryptography.
Digital Signature Model
Signing: Signature = Sign(Private Key, Message)
Verification: Valid = Verify(Public Key, Message, Signature)Properties:
Only holder of private key can create signature
Anyone with public key can verify
Signature is specific to message (tamper-evident)
Non-repudiation: Signer cannot deny signing
RSA Signatures
Signing (using private key):
1. Compute hash: h = H(M)
2. Sign hash: s = h^d mod nVerification (using public key):
1. Compute h' = H(M)
2. Recover h = s^e mod n
3. Check if h' == hPadding Schemes:
PKCS#1 v1.5: Legacy, vulnerable
PSS (Probabilistic Signature Scheme): Secure, recommended
DSA (Digital Signature Algorithm)
Based on discrete logarithm problem, designed specifically for signatures.
Parameters:
Prime p (2048-3072 bits)
Prime q (divides p-1, 256 bits)
Generator g
Advantages:
Faster signature generation than RSA
Shorter signatures than RSA
Disadvantages:
Requires secure random number generation
Reusing random value k exposes private key (Sony PlayStation 3 hack)
ECDSA (Elliptic Curve DSA)
DSA adapted to elliptic curves
Shorter keys and signatures
Widely used: Bitcoin, TLS, SSH
Vulnerability:
Same k reuse vulnerability as DSA
Requires high-quality random number generation
EdDSA (Edwards-curve DSA)
Modern signature scheme based on Ed25519 curve.
Advantages over ECDSA:
Deterministic (no random number generation required)
Faster than ECDSA
Easier to implement securely
Recommended for new applications
Applications:
SSH (Ed25519 keys)
Signal Protocol
Tor
Cryptocurrencies (Monero, Cardano)
Key Management
Key management is often the weakest link in cryptographic systems.
Key Generation
Requirements:
Randomness: Cryptographically secure random number generator (CSRNG)
Entropy: Sufficient unpredictability
Sufficient length: Meet security requirements
Random Number Generation:
Insecure: rand(), Math.random(), time-based seeds
Secure: /dev/urandom, CryptGenRandom, crypto.getRandomValues()Key Derivation:
Never use passwords directly as keys
Use Key Derivation Functions (KDFs)
Key Derivation Functions (KDFs)
Password-Based KDFs:
PBKDF2 (Password-Based Key Derivation Function 2):
Key = PBKDF2(password, salt, iterations, key_length)Vulnerable to GPU/ASIC attacks
Still acceptable with high iteration count (>100,000)
bcrypt:
Designed for password hashing
Adaptive: Can increase computational cost over time
Good for password storage
scrypt:
Memory-hard function (resistant to hardware attacks)
Better than PBKDF2 against parallelization
Argon2:
Winner of Password Hashing Competition (2015)
Best current practice for password hashing
Three variants: Argon2d, Argon2i, Argon2id (hybrid, recommended)
General KDFs (for non-password keys):
HKDF (HMAC-based KDF):
PRK = HKDF-Extract(salt, IKM) # Extract pseudo-random key
OKM = HKDF-Expand(PRK, info, L) # Expand to desired lengthUsed in TLS 1.3, Signal Protocol
Efficient and provably secure
Key Storage
Software Storage:
Encrypt keys at rest
Use OS key storage (Keychain, Credential Manager)
Limit access permissions
Hardware Storage:
Hardware Security Modules (HSMs): Enterprise-grade
Trusted Platform Module (TPM): Device-integrated
Smart cards: Portable
Secure enclaves: Mobile devices (ARM TrustZone, Intel SGX)
Key Protection Hierarchy:
Master Key (hardware-protected)
↓ (encrypts)
Key Encryption Keys (KEK)
↓ (encrypts)
Data Encryption Keys (DEK)Key Distribution
Pre-Shared Keys (PSK):
Out-of-band distribution (physical meeting, secure courier)
Does not scale
Key Distribution Center (KDC):
Trusted third party distributes keys (Kerberos)
Single point of failure
Public Key Infrastructure (PKI):
Certificate Authorities issue digital certificates
Scalable but complex
Key Agreement Protocols:
Diffie-Hellman, ECDH
Parties derive shared secret without transmitting it
Key Rotation
Best Practices:
Regularly rotate keys (frequency depends on usage and sensitivity)
Automate rotation when possible
Maintain key versioning
Securely destroy old keys after rotation period
Cryptographic Protocols
TLS/SSL
TLS Handshake (simplified):
Client → Server: ClientHello (supported ciphers)
Server → Client: ServerHello (selected cipher), Certificate
Key Exchange: ECDH or RSA
Both derive session keys
Encrypted application data
TLS 1.3 Improvements:
Faster handshake (1-RTT)
Forward secrecy mandatory
Removed weak ciphers
Encrypted handshake
See Network Security for comprehensive TLS coverage.
Key Exchange Protocols
Station-to-Station (STS) Protocol:
Authenticated Diffie-Hellman
Prevents Man-in-the-Middle attacks
Perfect Forward Secrecy (PFS):
Compromise of long-term keys doesn't compromise past sessions
Achieved using ephemeral Diffie-Hellman keys
Practical Security Considerations
Common Cryptographic Mistakes
Using ECB mode: Reveals patterns
Reusing IVs/nonces: Breaks security
Using weak keys: Insufficient entropy
Rolling your own crypto: Extremely difficult to get right
Ignoring side-channels: Timing, power analysis
Side-Channel Attacks
Timing Attacks:
Measure execution time to infer secret information
Example: RSA timing attack, AES cache timing
Mitigation: Constant-time implementations
Power Analysis:
Measure power consumption during crypto operations
Simple Power Analysis (SPA): Direct observation
Differential Power Analysis (DPA): Statistical analysis
Mitigation: Power consumption randomization, masking
Cache Attacks:
Exploit CPU cache behavior (Spectre, Meltdown)
Mitigation: Cache-timing-resistant algorithms
Random Number Generation
Failure Cases:
Debian OpenSSL (2008): Poor entropy, predictable keys
Dual_EC_DRBG: NSA backdoor in NIST standard
Android Bitcoin wallets: Weak randomness led to key recovery
Best Practices:
Use OS-provided CSRNG (/dev/urandom, CryptGenRandom)
Avoid user-space RNG implementations
Continuously seed from hardware entropy
Cryptographic Agility
Design for algorithm replacement:
Algorithms have limited lifetimes
SHA-1 broken, MD5 broken, DES broken
Design systems to support multiple algorithms
Use protocol versioning
Post-Quantum Cryptography
Quantum Threat:
Shor's Algorithm: Breaks RSA, ECC, Diffie-Hellman in polynomial time
Large-scale quantum computers expected within 10-20 years
Harvest now, decrypt later: Adversaries storing encrypted data for future decryption
NIST Post-Quantum Standards (2022-2024)
Public-Key Encryption/Key Establishment:
CRYSTALS-Kyber: Lattice-based, selected for standardization
Digital Signatures:
CRYSTALS-Dilithium: Lattice-based
FALCON: Lattice-based (NTRU)
SPHINCS+: Hash-based
Transition Strategy:
Hybrid approach: Use both classical and post-quantum algorithms
Update critical systems first
Plan multi-year migration
Applications
Secure Communication
Email Encryption:
PGP/GPG: End-to-end encryption
S/MIME: Certificate-based
Messaging:
Signal Protocol: Double Ratchet, forward secrecy
WhatsApp, Signal, Wire
VPNs:
IPsec: Network-layer encryption
WireGuard: Modern, efficient VPN protocol
Data Protection
Disk Encryption:
Full disk encryption (BitLocker, FileVault, LUKS)
AES-XTS mode for disk encryption
Database Encryption:
Transparent Data Encryption (TDE)
Application-level encryption
Blockchain and Cryptocurrencies
Bitcoin: ECDSA signatures, SHA-256 proof-of-work
Ethereum: Keccak-256 hashing
Smart contracts: Cryptographic verification
Authentication
Password Hashing:
Argon2, bcrypt, scrypt
Salt + hash, never plain passwords
Multi-Factor Authentication:
TOTP (Time-based OTP): HMAC-SHA1
FIDO2/WebAuthn: Public-key authentication
Best Practices
Algorithm Selection
Recommended Algorithms (2024):
Symmetric Encryption
AES-GCM
256 bits
Use unique nonces
ChaCha20-Poly1305
256 bits
Alternative to AES
Asymmetric Encryption
RSA-OAEP
3072+ bits
Or use ECC
ECDH (X25519)
256 bits
For key exchange
Digital Signatures
RSA-PSS
3072+ bits
Or use EdDSA
EdDSA (Ed25519)
256 bits
Recommended
Hash Functions
SHA-256
-
Minimum
SHA-512
-
Higher security
Password Hashing
Argon2id
-
Best practice
bcrypt
-
Acceptable alternative
Implementation Guidelines
Use established libraries: OpenSSL, libsodium, Bouncy Castle
Never implement crypto yourself unless you're a cryptographer
Follow standards: Use NIST, IETF recommendations
Constant-time operations: Prevent timing attacks
Secure defaults: Force users to make security-positive choices
Fail securely: Errors should not leak information
Defense in depth: Multiple layers of cryptographic protection
Security Checklist
Encryption:
Use authenticated encryption (GCM, ChaCha20-Poly1305)
Never reuse IVs/nonces with the same key
Use sufficiently long keys (AES-256, RSA-3072+)
Avoid ECB mode
Don't use DES, 3DES, RC4
Hashing:
Use SHA-256 or SHA-3 for integrity
Use Argon2 for passwords
Don't use MD5 or SHA-1
Random Numbers:
Use CSRNG for all cryptographic purposes
Don't use time-based seeds or pseudo-RNGs
Keys:
Protect keys with hardware when possible
Rotate keys regularly
Use KDFs for deriving keys from passwords
Don't hardcode keys in source code
Last updated