In our last post, we covered AES and RSA — the two pillars of modern encryption. Here's the uncomfortable follow-up: one of those pillars has an expiration date, and it's earlier than most developers think.
NIST has finalized new encryption standards, governments have published binding migration deadlines, and major browsers already encrypt most of your traffic with algorithms you've probably never heard of. This isn't a future problem. It's a 2026 engineering problem, and it's already showing up in TLS handshakes you use every day.
A sufficiently powerful quantum computer will be able to break RSA and ECC — the asymmetric encryption behind HTTPS, SSH, and most digital signatures — by solving the math problems they rely on almost instantly.
Nobody has built that computer yet. Estimates for when a "cryptographically relevant quantum computer" (CRQC) might exist range widely, with most serious projections landing sometime in the 2030s. So why is 2026 the year everyone suddenly cares?
Because of one specific attack pattern: Harvest Now, Decrypt Later.
This is the idea that makes "quantum computers don't exist yet" a useless excuse:
2026: Attacker intercepts and stores your encrypted traffic (they can't decrypt it — yet) ↓ 2026-2035: Attacker just... waits ↓ 203X: A cryptographically relevant quantum computer arrives ↓ 203X: Attacker decrypts everything they harvested years ago
You don't need to be a target of a future attack — you're a target of a present-day one, quietly happening now, with the payoff deferred. If the data you're encrypting today needs to stay confidential for more than a few years — medical records, IP, source code, government or legal data — the question isn't "will quantum computers ever exist." It's "does my data's confidentiality lifetime outlast the time it takes a quantum computer to arrive." For a lot of organizations, the honest answer is no — which is exactly why intelligence agencies and financial institutions are the earliest movers here.
After a multi-year public competition — the same format that gave us AES in the early 2000s — NIST finalized its first three post-quantum cryptography standards:
| Standard | Algorithm | Purpose | Replaces |
|---|---|---|---|
| FIPS 203 | ML-KEM (formerly CRYSTALS-Kyber) | Key exchange / encapsulation | RSA & ECDH key exchange |
| FIPS 204 | ML-DSA (formerly CRYSTALS-Dilithium) | Digital signatures | RSA & ECDSA signatures |
| FIPS 205 | SLH-DSA (based on SPHINCS+) | Digital signatures (conservative backup) | Same, hash-based fallback |
A fourth, FIPS 206 (FN-DSA, based on FALCON), was expected to follow later in 2026 for use cases needing smaller signatures.
Both ML-KEM and ML-DSA are lattice-based — their security rests on math problems (like finding short vectors in high-dimensional lattices) that remain hard even for quantum computers, unlike the factoring and discrete-log problems RSA and ECC depend on. SLH-DSA takes a different, more conservative approach based purely on hash functions, trading larger signature sizes for an extra layer of confidence.
If you've read our AES/RSA piece, you know the drill: generate a key pair, call encrypt, call decrypt, done. Post-quantum migration is a different beast entirely.
| Algorithm | Key/Signature Size | Comparable Classical Algorithm |
|---|---|---|
| RSA-2048 public key | ~256 bytes | — |
| ML-KEM-768 public key | ~1,184 bytes | ~4-5x larger |
| ECDSA P-256 signature | ~64-72 bytes | — |
| ML-DSA-65 signature | ~3,300 bytes | ~45x larger |
| SLH-DSA signature | ~8,000-17,000 bytes | ~100x+ larger |
That size difference isn't cosmetic. Protocols, packet size assumptions, embedded systems with tight memory budgets, and hardware security modules built around RSA-sized keys all need to be re-evaluated.
Nobody serious is ripping out classical crypto and replacing it with pure PQC overnight. The recommended approach is hybrid: combine a classical algorithm with a post-quantum one, so you're protected even if either one turns out to have a flaw nobody's found yet.
Traditional key exchange: X25519 (classical, well-tested) + Post-quantum key exchange: ML-KEM-768 (new, quantum-resistant) ↓ Combined shared secret
If ML-KEM has an undiscovered weakness, X25519 still protects you. If a quantum computer breaks X25519, ML-KEM still protects you. This is exactly what Cloudflare, Google, and Apple have already rolled out at scale — a large share of browser traffic to major CDNs is now protected by hybrid post-quantum key exchange, even though most users have no idea.
The single biggest lesson from the PQC transition: hardcoded cryptography is a liability. Systems built so that swapping an algorithm means touching one config value — not rewriting application logic — are the ones migrating smoothly. Systems with RSA calls scattered across the codebase are the ones facing years of remediation work.
# ❌ Hardcoded, not crypto-agile def encrypt_session_key(data, rsa_public_key): return rsa_public_key.encrypt(data, padding.OAEP(...)) # ✅ Crypto-agile: algorithm resolved via policy, not hardcoded def encrypt_session_key(data, key_provider: KeyExchangeProvider): return key_provider.encapsulate(data) # key_provider might resolve to RSA, ML-KEM, or a hybrid combiner # depending on a central policy — no application code changes needed
Post-quantum primitives are landing in mainstream libraries now (liboqs, OpenSSL 3.x with the OQS provider, and Python bindings like oqs-python). Here's what a hybrid handshake looks like conceptually:
# Illustrative — real usage depends on your library of choice from oqs import KeyEncapsulation from cryptography.hazmat.primitives.asymmetric import x25519 def hybrid_key_exchange_client(): # Classical half classical_private = x25519.X25519PrivateKey.generate() classical_public = classical_private.public_key() # Post-quantum half pq_kem = KeyEncapsulation("ML-KEM-768") pq_public_key = pq_kem.generate_keypair() # Both public values get sent to the server return { "classical_public": classical_public, "pq_public_key": pq_public_key, "classical_private": classical_private, # kept secret "pq_kem": pq_kem, # kept secret } def combine_secrets(classical_shared_secret, pq_shared_secret): """Combine both secrets into one session key (simplified)""" import hashlib return hashlib.sha384(classical_shared_secret + pq_shared_secret).digest()
The combined secret is only as weak as its strongest component being broken — which, by design, requires breaking both algorithms simultaneously.
Deadlines vary by country and industry, but the direction is consistent everywhere: classical public-key crypto is being formally phased out on a fixed schedule, not left to organizations' discretion indefinitely.
2024 ── NIST finalizes FIPS 203, 204, 205 2026 ── Federal agencies (US) begin binding PQC migration deadlines for high-value assets; national PQC strategies due in the EU 2027 ── NSA's CNSA 2.0 mandates PQC for new national security systems 2029-30 ── Major vendors (Cloudflare, etc.) targeting full PQC readiness; RSA-2048 / ECC P-256 deprecated in NIST guidance 2031 ── US federal deadline for post-quantum digital signatures/certs 2035 ── Quantum-vulnerable algorithms fully removed from NIST standards; EU medium-risk use cases expected to complete migration
The realistic timeline to migrate a large enterprise is measured in years, not a quarter. That's the actual reason 2026 matters — not because quantum computers arrived, but because the runway to migrate safely is long enough that starting now is the only way to beat the deadline.
Every migration guide agrees on the starting point, and it's not buying a new library — it's figuring out where you're already exposed.
# Simplified example: scanning a codebase for classical crypto usage # that will need review before a PQC migration import re from pathlib import Path CLASSICAL_CRYPTO_PATTERNS = { "RSA": r"\brsa\.(generate_private_key|encrypt)\b", "ECDSA": r"\bec\.(generate_private_key|ECDSA)\b", "ECDH": r"\bec\.(ECDH|exchange)\b", } def scan_for_classical_crypto(directory: str) -> dict: findings = {algo: [] for algo in CLASSICAL_CRYPTO_PATTERNS} for path in Path(directory).rglob("*.py"): content = path.read_text(errors="ignore") for algo, pattern in CLASSICAL_CRYPTO_PATTERNS.items(): if re.search(pattern, content): findings[algo].append(str(path)) return findings # Usage results = scan_for_classical_crypto("./src") for algo, files in results.items(): if files: print(f"{algo} found in {len(files)} file(s):") for f in files: print(f" - {f}")
Run something like this (or a proper SCA/crypto-discovery tool) across your codebase, your TLS configs, your certificate authorities, your embedded firmware, and your HSMs. You cannot migrate what you haven't inventoried.
Not everything needs equal urgency. Focus first on the protocols where public-key cryptography is doing the heavy lifting:
| Protocol | Why It's High Priority | PQC Path |
|---|---|---|
| TLS | Every HTTPS connection; long confidentiality needs | Hybrid ML-KEM + X25519 key exchange |
| SSH | Long-lived remote access, admin credentials | OpenSSH already supports hybrid PQC key exchange |
| S/MIME & email | Long-term document confidentiality | ML-KEM for encryption, ML-DSA for signing |
| Code signing | Signatures must remain trustworthy for years | ML-DSA / SLH-DSA |
| VPN (IKE/IPsec) | Long-lived tunnels, sensitive traffic | Hybrid key exchange support emerging |
Reality: Harvest Now, Decrypt Later means your risk window started the moment your data was encrypted, not the moment a quantum computer exists. If your data's confidentiality lifetime is longer than the migration timeline, you're already exposed.
Reality: No — this is a common mix-up. Quantum computers threaten asymmetric cryptography (RSA, ECC) far more severely than symmetric cryptography (AES). Grover's algorithm gives quantum computers a quadratic speedup against AES, which is why the practical response is simply doubling key size (AES-256 instead of AES-128) — not replacing the algorithm.
Reality: Regulatory pressure is real, but the underlying math doesn't care about your industry. Healthcare records, source code, M&A communications, and any data with a multi-year confidentiality requirement are exposed regardless of sector.
Reality: QKD requires specialized hardware and dedicated physical links between two points, which doesn't scale to internet-wide use. The standardized, deployable path is NIST's mathematical PQC algorithms (ML-KEM, ML-DSA), not QKD.
Based on the joint guidance coming out of NIST, CISA, and NSA, a credible enterprise PQC migration looks roughly like this:
Key takeaways:
The migration to post-quantum cryptography is already underway at the bottom of the internet stack — most people using HTTPS today are benefiting from hybrid PQC without knowing it. The question for engineering teams isn't whether this happens. It's whether your systems are ready before the deadlines that are already on the calendar arrive.
Remember: the safest assumption about quantum-vulnerable cryptography isn't "it'll be fine for now" — it's "anything encrypted today with RSA or ECC has a shelf life, and that clock is already running."