Introduction
Quantum computers threaten to break the encryption that protects our digital world. RSA, ECC, and DSAโall based on mathematical problems that quantum computers can solve efficientlyโwill become obsolete. The time to prepare is now. This guide covers post-quantum cryptography and how to protect your organization.
The Quantum Threat
What Quantum Computers Break
flowchart TD
A[Quantum Computers] --> B[Shor's Algorithm]
B --> C[RSA Encryption]
B --> D[Elliptic Curve Cryptography]
B --> E[DSA Signatures]
C --> F[BREAK]
D --> F
E --> F
Timeline
| Year | Milestone |
|---|---|
| 2024 | NIST finalizes PQC standards |
| 2025 | Early adoption begins |
| 2027+ | “Q-Day” - Quantum computers may break current crypto |
| 2030+ | Widespread PQC deployment expected |
NIST Post-Quantum Cryptography Standards
Selected Algorithms
| Algorithm | Type | Use Case | Status |
|---|---|---|---|
| ML-KEM (Kyber) | KEM | Key encapsulation | Standard |
| ML-DSA (Dilithium) | Signature | Digital signatures | Standard |
| SLH-DSA (SPHINCS+) | Signature | Hash-based signatures | Standard |
| FN-DSA (Falcon) | Signature | Short signatures | Standard |
ML-KEM (Key Encapsulation)
# Using liboqs (Open Quantum Safe)
from liboqs import KEM
# Select ML-KEM (Kyber) algorithm
kem = KEM("Kyber512")
# Generate key pair
public_key = kem.generate_keypair()
secret_key = kem.export_secret_key()
# Encapsulate (like encryption)
ciphertext, shared_secret_enc = kem.encaps(public_key)
# Decapsulate (like decryption)
shared_secret_dec = kem.decaps(secret_key, ciphertext)
# Both sides now have the same shared secret
assert shared_secret_enc == shared_secret_dec
ML-DSA (Digital Signatures)
from liboqs import Signature
# Select ML-DSA (Dilithium) algorithm
sig = Signature("Dilithium2")
# Generate key pair
public_key = sig.generate_keypair()
secret_key = sig.export_secret_key()
# Sign a message
message = b"Important data that needs authentication"
signature = sig.sign(message, secret_key)
# Verify signature
is_valid = sig.verify(message, signature, public_key)
print(f"Signature valid: {is_valid}")
Migration Strategies
Hybrid Encryption
# Combine classical and post-quantum algorithms
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization
import liboqs
class HybridEncryptor:
def __init__(self):
self.kem = liboqs.KEM("Kyber512")
self.rsa = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
def hybrid_encrypt(self, plaintext: bytes) -> bytes:
# Generate QKD key
pk = self.kem.generate_keypair()
ct, qkd_secret = self.kem.encaps(pk)
# Generate classical key
classical_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
# Encrypt with both
# ... combine both ciphertexts
return combined_ciphertext
def hybrid_decrypt(self, ciphertext: bytes) -> bytes:
# Decrypt using both algorithms
# ... combine both plaintexts
return plaintext
TLS Configuration
# OpenSSL configuration for post-quantum TLS
openssl_conf: |
# Hybrid cipher suites
CipherString = ECDHE-ML-KEM-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
# Provider configuration
[provider_sect]
default = default_sect
oqs = oqs_sect
[oqs_sect]
activate = 1
algorithm_slh_dsa = SLH-DSA-SHA2-128s
algorithm_ml_kem = ML-KEM-512
Implementation Guide
1. Inventory Your Cryptography
# Scan for vulnerable cryptography
import subprocess
import re
class CryptoInventory:
def scan_files(self, path: str) -> dict:
findings = {
'rsa': [],
'ecc': [],
'sha1': [],
'tls_1.2': [],
'quantum_vulnerable': []
}
# Search for weak algorithms
patterns = {
'RSA': r'RSA\(|key_size.*2048',
'ECDSA': r'ECDSA|secp256',
'SHA1': r'SHA-?1',
'TLS': r'TLSv1\.2'
}
# Run grep on codebase
for algo, pattern in patterns.items():
result = subprocess.run(
['grep', '-r', pattern, path],
capture_output=True
)
if result.returncode == 0:
findings[f'{algo.lower()}_vulnerable'].extend(
result.stdout.decode().splitlines()
)
return findings
2. Priority Migration
# Migration priorities
priority:
critical:
- TLS certificates (most exposed)
- VPN connections
- API authentication tokens
high:
- Database encryption (at rest)
- File storage encryption
- Internal communications
medium:
- Backups
- Archives
- Logs
low:
- Non-sensitive data
- Public information
3. Testing
# Test PQC implementation
import unittest
class PQCTest(unittest.TestCase):
def test_ml_kem_roundtrip(self):
"""Test ML-KEM encapsulation/decapsulation"""
from liboqs import KEM
kem = KEM("Kyber512")
pk = kem.generate_keypair()
ct, ss1 = kem.encaps(pk)
ss2 = kem.decaps(kem.export_secret_key(), ct)
self.assertEqual(ss1, ss2)
def test_ml_dsa_signature(self):
"""Test ML-DSA signing/verification"""
from liboqs import Signature
sig = Signature("Dilithium2")
pk = sig.generate_keypair()
message = b"Test message"
signature = sig.sign(message, sig.export_secret_key())
self.assertTrue(sig.verify(message, signature, pk))
Best Practices
1. Start Now
# Immediate actions
actions:
- name: Inventory cryptography
status: in_progress
deadline: 2026-Q2
- name: Enable hybrid TLS
status: pending
deadline: 2026-Q3
- name: Test PQC in staging
status: pending
deadline: 2026-Q4
- name: Deploy PQC to production
status: pending
deadline: 2027-Q1
2. Use Standards
# NIST approved algorithms
algorithms:
key_encapsulation:
- ML-KEM-512 (Kyber512)
- ML-KEM-768 (Kyber768)
- ML-KEM-1024 (Kyber1024)
digital_signatures:
- ML-DSA-44 (Dilithium2)
- ML-DSA-65 (Dilithium3)
- ML-DSA-87 (Dilithium5)
- SLH-DSA-SHA2-128s
3. Plan for Transition
# Transition checklist
checklist = [
"Inventory all cryptographic usage",
"Identify Q-Day impact areas",
"Enable hybrid encryption in TLS 1.3",
"Update key management systems",
"Test PQC in non-production",
"Plan certificate rotation",
"Update vendor contracts",
"Train development teams",
"Implement monitoring",
"Plan rollback procedures"
]
Common Mistakes
1. Waiting Too Long
Wrong:
# Procrastinating
migration:
status: not_started
reason: "quantum computers aren't here yet"
Correct:
# Start now
migration:
status: in_progress
reason: "future-proof our systems"
2. Ignoring Hybrid Approach
Wrong:
# Pure PQC (too early)
cipher_suite: "ML-KEM-512-AES256-GCM"
Correct:
# Hybrid (recommended)
cipher_suite: "ECDHE-ML-KEM-AES256-GCM-SHA384"
3. Not Planning Rollback
Wrong:
# No fallback
algorithm: "only_pqc"
Correct:
# With fallback
algorithm:
primary: "hybrid"
fallback: "classical_only"
External Resources
Standards
Tools
Key Takeaways
- Quantum computers will break current encryption
- NIST has finalized post-quantum cryptography standards
- ML-KEM and ML-DSA are the primary algorithms
- Start now - migration takes years
- Use hybrid encryption during transition
- Inventory all cryptographic usage
- Plan rollback procedures
Comments