Stack Quântico & PQC — 5 Módulos Go

Criptografia Resistente a Computadores Quânticos

Tutorial técnico completo de um stack de criptografia pós-quântica em Go: do simulador de Grover e Shor aos padrões NIST FIPS 203/204, Schnorr em reticulados, STARKs hash-only e uma bridge ML-KEM + FHE para votação eletrônica.

5

Módulos Go

SHA-256

Único hash no STARK

Module-LWE

Base pós-quântica

FIPS 203/204

Padrão NIST 2024

CRQC 2029

Filippo Valsorda (Jan/2025): prazo revisado de 2035 → 2029. Google + Oratomic: P-256 quebrado em minutos com CRQC. Migre para ML-KEM + ML-DSA agora.

1000 dias restantes
→ Detalhes

Fundamentos

Por Que Criptografia Pós-Quântica?

A criptografia moderna baseia-se em problemas computacionalmente difíceis para computadores clássicos. O algoritmo de Shor (1994), quando rodando em um computador quântico com qubits lógicos suficientes, resolve em tempo polinomial os dois pilares da criptografia assimétrica atual.

Vulnerável a Shor

RSA-2048

Base: fatoração de inteiros (NP-difícil classicamente)

Shor: O(n³) — destrói RSA em qualquer tamanho de chave

Vulnerável a Shor

ECDH P-256 / X25519

Base: logaritmo discreto em curvas elípticas

Shor quebra grupos abelianos finitos — inclui todas as curvas

Quantum-Safe

ML-KEM-768 (FIPS 203)

Base: Module-LWE — sem estrutura de grupo abeliano

Shor não se aplica. ~178 bits de segurança pós-quântica

Quantum-Safe

BGV / FHE (RLWE)

Base: Ring-LWE — problemas de reticulados

Mesmo problema subjacente ao ML-KEM. Grover: ~128-bit efetivo

Vulnerabilidade por Algoritmo

Algoritmo Vulnerável a Shor? Afetado por Grover? Status
RSA-2048/4096SIMNão diret.QUEBRADO por QC
ECDH P-256SIMNão diret.QUEBRADO por QC
ECDSA / EdDSASIMNão diret.QUEBRADO por QC
AES-128NãoGrover: 64-bitMarginal — migrar AES-256
AES-256Não128-bit efetivoSeguro
SHA-256Não128-bit preimagemSeguro
ML-KEM-768NÃO~168-bitFIPS 203 — Nível 3
ML-DSA-65NÃO~165-bitFIPS 204 — Nível 3
BGV/RLWENÃO~128-bitQuantum-safe

O Algoritmo de Grover e Seu Impacto em Simétricos

Grover oferece aceleração quadrática para busca não-estruturada — não polinomial como Shor. Para AES com espaço de chaves $N = 2^{256}$:

$\text{Clássico: } O(N) \quad\xrightarrow{\text{Grover}}\quad O(\sqrt{N})$

AES-256: $2^{256} \xrightarrow{\text{Grover}} 2^{128}$ — ainda seguro, mas com margem reduzida. Conclusão prática: dobrar chaves simétricas é suficiente. Chave pública clássica precisa ser substituída completamente.

Problemas Difíceis em Reticulados

LWE — Learning With Errors

$b = A \cdot s + e \pmod{q}$

Dado $(A, b)$, encontrar $s$ — infeasível. Versão Module-LWE usa polinômios em $R_q = \mathbb{Z}_q[x]/(x^n+1)$, aumentando eficiência.

SIS — Short Integer Solution

$Az = 0 \pmod{q},\; \|z\|_\infty \text{ pequena}$

Dado $A \in \mathbb{Z}_q^{m\times n}$, encontrar $z \neq 0$ com norma pequena — base das assinaturas ML-DSA e das provas de conhecimento zero em reticulados.

Módulo 1 — 07_quantum_sim

Simulador Quântico

Simula Grover e Shor classicamente para demonstrar a ameaça aos sistemas criptográficos atuais.

terminal

$ cd fhe/07_quantum_sim && GOWORK=off go run .

Estado Quântico: Formalismo

Um sistema de $n$ qubits possui $2^n$ estados base. O estado geral é uma superposição de amplitudes complexas:

$|\psi\rangle = \sum_i \alpha_i |i\rangle \qquad \sum_i |\alpha_i|^2 = 1 \qquad P(i) = |\alpha_i|^2$

Após $n=4$ qubits em superposição uniforme (porta Hadamard em todos): cada $\alpha_i = 1/4$, $P(i) = 6.25\%$ para todo $i \in \{0,\ldots,15\}$.

Algoritmo de Grover — Walkthrough: n=4, target=10

Grover busca um item em $N=2^n$ candidatos em $O(\sqrt{N})$ vs $O(N)$ classicamente. Número ótimo de iterações: $k = \lfloor \frac{\pi}{4}\sqrt{N} \rfloor = \lfloor \pi \rfloor = 3$.

Init
6.25%
Iter 1
46.9%
Iter 2
83.1%
Iter 3
96.1%

Iteração 1 — Detalhado

Amps[10] → -0.25 (Oracle)

⟨α⟩ = 3.5/16 = 0.21875

Amps[10] = 2×0.219 + 0.25 = 0.6875

P(10) = 0.6875² ≈ 47.3%

Complexidade

$O(N) \xrightarrow{\text{Grover}} O(\sqrt{N})$

Para AES-128: $2^{128} \to 2^{64}$ — por isso AES-256 é recomendado.

// grover.go — algoritmo completo
func Grover(n int, target int) int {
    qs := NewQState(n)
    qs.HAll()  // superposição uniforme

    N := 1 << n
    iters := int(math.Round(math.Pi * math.Sqrt(float64(N)) / 4.0))

    for iter := 0; iter < iters; iter++ {
        oracle(qs, target)   // inverte fase do alvo
        diffuser(qs)         // reflexão pela média
    }
    return qs.Measure()
}

// Difusor: H^n → flip fase de i>0 → H^n
func diffuser(qs *QState) {
    qs.HAll()
    for i := 1; i < len(qs.Amps); i++ {
        qs.Amps[i] = -qs.Amps[i]
    }
    qs.HAll()
}

Algoritmo de Shor — Fatorar N=15 com a=7

Shor fatoriza $N$ em $O((\log N)^3)$ — polinomial. RSA-2048 tem 2048 bits: GNFS clássico $\approx e^{64}$ operações vs Shor $\approx 2048^3 \approx 8.6 \times 10^9$.

Insight central: fatorar $N$ se reduz a encontrar o período de $f(x) = a^x \bmod N$.

x 0123 4 567 8
7^x mod 15 17413 1 7413 1

Período $r = 4$ (marcado em roxo). A parte quântica (QFT) encontra $r$ eficientemente via picos de probabilidade em $j = k \cdot Q/r$.

// Redução clássica para fatores

r = 4 (par ✓), a^(r/2) = 7² = 49 ≡ 4 (mod 15)

4 ≢ -1 ≡ 14 (mod 15) ✓

p = gcd(4-1, 15) = gcd(3, 15) = 3

q = gcd(4+1, 15) = gcd(5, 15) = 5

15 = 3 × 5 ← RSA destruído em tempo polinomial

// shor.go — estrutura do algoritmo
func Shor(N int) (int, int) {
    for attempt := 0; attempt < maxAttempts; attempt++ {
        a := rand.Intn(N-2) + 2
        if g := gcd(a, N); g > 1 { return g, N/g }

        r := findPeriod(a, N)  // usa DFT para simular QFT
        if r%2 != 0 { continue }

        halfPow := modPow(a, r/2, N)
        if halfPow == N-1 { continue }

        p, q := gcd(halfPow-1, N), gcd(halfPow+1, N)
        if p > 1 && p < N { return p, q }
    }
    return 0, 0
}

Módulo 2 — 08_pqc_stack

Stack PQC Completo

ML-KEM-768, ML-DSA-65 e Híbrido X25519 — padrões NIST FIPS 203/204 em Go com a biblioteca Cloudflare CIRCL.

ML-KEM-768 NIST FIPS 203 KEM

Tamanhos e Comparativo

Parâmetro RSA-2048 ECDH P-256 ML-KEM-768
Chave pública256 B65 B1184 B
Chave privada1232 B32 B2400 B
Ciphertext256 B65 B1088 B
Shared secret32 B32 B32 B
Segurança quântica0 bits0 bits~178 bits
// mlkem.go — API circl v1.6.3
scheme := kyber768.Scheme()
pk, sk, _ := scheme.GenerateKeyPair()

// Encapsulação (terminal) — ct JÁ É []byte
ct, ss1, _ := scheme.Encapsulate(pk)

// Decapsulação (autoridade)
ss2, _ := scheme.Decapsulate(sk, ct)

fmt.Println("Match:", bytes.Equal(ss1, ss2))  // true
ML-DSA-65 NIST FIPS 204 Assinatura

1952 B

Chave pública

4032 B

Chave privada

3309 B

Assinatura

Nota da API circl v1.6.3: Sign retorna []byte, NÃO ([]byte, error). Use sig := scheme.Sign(sk, msg, nil)

// mldsa.go
scheme := mldsa65.Scheme()
pk, sk, _ := scheme.GenerateKeyPair()

// ATENÇÃO: Sign retorna []byte, não ([]byte, error)!
sig := scheme.Sign(sk, msg, nil)

ok := scheme.Verify(pk, msg, sig, nil)
fmt.Println("Verificação:", ok)  // true

// Serialização: usar pk.MarshalBinary(), não scheme.MarshalBinaryPublicKey()
pkBytes, _ := pk.MarshalBinary()  // 1952 bytes

Híbrido X25519 + ML-KEM-768

Estratégia de transição: "se qualquer dos dois for seguro, o sistema é seguro." Signal, Chrome e AWS já usam esta abordagem.

$\text{sharedSecret} = \text{SHA-256}(ss_{\text{X25519}} \mathbin{\|} ss_{\text{MLKEM}})$

Hoje (sem QC)

X25519 128-bit + ML-KEM 178-bit

QC 2030+ (Shor)

X25519 quebrado + ML-KEM 178-bit = OK

ML-KEM quebrado

X25519 128-bit = OK

Módulo 3 — 09_zkp_pqc

ZKP em Reticulados — Schnorr Lattice

Prova de conhecimento zero baseada em SIS: sem curvas elípticas, resistente a Shor.

Schnorr Clássico P-256 — VULNERÁVEL

Prova conhecimento de $x$ tal que $Y = x \cdot G$ em curva elíptica.

W = k·G (commit)

c = H(W || Y || msg) (desafio)

s = k + c·x (resposta)

Verifica: s·G = W + c·Y

Shor resolve log discreto em P-256 → protocolo destruído

Schnorr Lattice — SEGURO

Prova conhecimento de $s$ tal que $A \cdot s = t \pmod{q}$ em reticulado.

w = A·y mod q (commit)

c = H(w || t || msg) (desafio)

z = y + c·s (resposta)

Verifica: A·z = w + c·t mod q

SIS: encontrar z pequeno com Az=0 é infeasível quantum-classicamente

Parâmetros Toy (educacionais)

// lattice.go — parâmetros toy (ML-DSA real: q=8380417, n=256)
const (
    q    = 251   // módulo primo
    n    = 8     // dimensão do polinômio
    m    = 4     // número de linhas em A
    eta  = 2     // limite coef. chave secreta |sᵢ| ≤ η
    gam  = 30    // limite coef. randomness |yᵢ| ≤ γ
    beta = 40    // β = γ + maxC·η = 30 + 5·2 = 40
)

Walkthrough Numérico (m=1, n=4)

// KEYGEN

A = [142, 87, 203, 11]

s = [1, -2, 0, 1]    // |sᵢ| ≤ 2

t = 142·1 + 87·(-2) + 203·0 + 11·1 mod 251 = -21 mod 251 = 230

// PROVA

y = [28, -15, 7, -3]  // |yᵢ| ≤ 30

w = 142·28 + 87·(-15) + 203·7 + 11·(-3) mod 251 = 4059 mod 251 = 43

c = H(43, 230, msg) = 3

z = [28+3·1, -15+3·(-2), 7+3·0, -3+3·1] = [31, -21, 7, 0]

‖z‖∞ = 31 ≤ 40 = β ✓ (rejection sampling OK)

// VERIFICAÇÃO

A·z mod 251 = 142·31 + 87·(-21) + 203·7 + 11·0 mod 251 = 3996 mod 251 = 231

w + c·t mod 251 = 43 + 3·230 mod 251 = 733 mod 251 = 231

✓ A·z = w + c·t — ACEITAR

ZKP de Voto One-Hot

O eleitor prova que seu voto é one-hot (exatamente um candidato) sem revelar qual. Usa commitments baseados em reticulados: $t_i = A \cdot r_i + v_i \cdot g \pmod{q}$.

// Voto no candidato 2 de 4:

t₁ = A·r₁ + 0·g = A·r₁

t₂ = A·r₂ + 1·g = A·r₂ + g ← candidato escolhido

t₃ = A·r₃ + 0·g = A·r₃

t₄ = A·r₄ + 0·g = A·r₄

// Σtᵢ = A·(Σrᵢ) + 1·g = commit(1, R)

// Schnorr proof de conhecimento de R: A·R = Σtᵢ - g

Propriedade homomórfica: $\sum t_i = A(\sum r_i) + 1 \cdot g$. Verificador confirma integridade sem saber qual $t_i$ corresponde ao voto.

Módulo 4 — 10_starkproof

STARK — Provas Escaláveis Quantum-Safe

STARKs usam apenas SHA-256 — sem curvas elípticas, sem trusted setup, naturalmente resistentes a computadores quânticos.

Apenas SHA-256

Sem grupos de curvas elípticas. Grover reduz SHA-256 para 128-bit — ainda seguro.

Sem Trusted Setup

SNARKs precisam de pairings (vulneráveis a Shor). STARKs não — transparência total.

~2.5 KB de prova

Verificação em $O(\log^2 n)$ vs $O(n)$ do prover. Auditável por qualquer um.

Campo Finito $\mathbb{Z}_{65537}$

$P = 65537 = 2^{16}+1$ é o quinto primo de Fermat. $P-1 = 2^{16}$ é potência pura de 2 — essencial para FFT sobre campos finitos e para o protocolo FRI.

// field.go
const (
    P = 65537  // 2^16 + 1 (Fermat prime)
    G = 3      // raiz primitiva: ord(3) = 65536
)

func fadd(a, b int) int { return (a + b) % P }
func fmul(a, b int) int { return (a * b) % P }
func finv(a int) int    { return fpow(a, P-2, P) }

// Raiz de unidade de ordem n:
// w = 3^(65536/n) mod 65537
func rootOfUnity(n int) int {
    return fpow(G, (P-1)/n, P)
}

Exemplo: raiz de unidade de ordem 8

w = 3^(65536/8) mod 65537

= 3^8192 mod 65537 = 4096

Verificar: 4096^8 mod 65537 = 1 ✓

pois $4096 = 2^{12}$, $4096^8 = 2^{96} = 2^{16\times6} \equiv (-1)^6 = 1 \pmod{P}$

Árvore Merkle SHA-256 (Comprometimento)

          nodes[1]  ← raiz (comprometimento)
         /         \
    nodes[2]        nodes[3]
   /        \      /        \
nodes[4]  nodes[5] nodes[6] nodes[7]
   |          |       |        |
  v₀=5      v₁=26   v₂=677  v₃=654   ← trace values

Cada folha é $\text{SHA-256}(v_i)$, cada nó interno é $\text{SHA-256}(\text{esq} \mathbin{\|} \text{dir})$. Prova de inclusão: $O(\log n)$ siblings.

Protocolo FRI — Dobramento Iterativo

FRI prova que um polinômio tem grau baixo, sem revelar seus coeficientes. Cada round dobra o grau:

$f_1(y) = \frac{f(x)+f(-x)}{2} + r \cdot \frac{f(x)-f(-x)}{2x} \quad (y = x^2)$

O desafio $r$ é derivado do hash Merkle (Fiat-Shamir). Após $k$ rounds, o polinômio é quase constante — prova de baixo grau.

STARK Completo: f(y) = y² + 1, secretX=5, 4 passos

Passo Cálculo Valor
T[0]secretX (privado)5
T[1]5² + 126
T[2]26² + 1677
T[3]677² + 1 mod 65537654
T[4]654² + 1 mod 6553752968

publicOut = 52968 (público) — o verificador confirma que o prover conhece algum $x$ tal que $f^4(x) = 52968 \pmod{65537}$, sem aprender que x=5.

// stark.go
const (
    STEPS   = 4      // iterações da função f
    TRACE_N = 8      // domínio de trace (≥ STEPS+1, potência de 2)
    LDE_N   = 32     // domínio LDE (blowup 4x para solidez)
    N_QUERY = 3      // spot-checks: prob. fraude ≤ (32/65537)³ ≈ 10⁻¹¹
)

func buildTrace(secretX int) []int {
    trace := make([]int, TRACE_N)
    trace[0] = secretX
    for i := 1; i <= STEPS; i++ {
        p := trace[i-1]
        trace[i] = (fmul(p, p) + 1) % P  // f(y) = y² + 1
    }
    return trace
}

Módulo 5 — 10_kyber_fhe_bridge

Bridge ML-KEM + FHE

Sistema completo de votação eletrônica: canal quantum-safe (ML-KEM-768 + AES-GCM) + computação homomórfica (BGV).

Diagrama do Sistema

SERVIDOR                              TERMINAL
────────────────────────────────────────────────────
NewBridgeServer()
  ├─ BGV: LogN=12, LogQ=[38,40], t=65537
  │   → pk_FHE (~196 KB), sk_FHE
  └─ ML-KEM-768 keygen
      → pk_KEM (1184B), sk_KEM (2400B)

Publica pk_KEM ──────────────────→ encapsula: ct_KEM (1088B), ss (32B)

Decapsula ct_KEM                ←─────────── envia ct_KEM
  → ss (32B) [mesmo que terminal]
  → AES-GCM(key=ss, pk_FHE)

enc_pk_FHE ──────────────────────→ AES-GCM decrypt(ss)
                                   → pk_FHE
                                   BGV_Enc(pk_FHE, [1,0,0,...])
                                   → ct_fhe (~131 KB)

Recebe ct_fhe ←──────────────────── envia ct_fhe

Soma homomórfica (sem decriptar!):
  sum = AddNew(ct_A, ct_B)
  sum = AddNew(sum, ct_C)
  result = Decrypt(sk_FHE, sum)
  → [Alice:2, Bob:1, Carlos:0]

Parâmetros BGV (Lattigo v6)

// fhe_engine.go
var BGVParamsLiteral = bgv.ParametersLiteral{
    LogN: 12,           // N = 2^12 = 4096 slots SIMD
    LogQ: []int{38, 40}, // q ≈ 2^78 (2 níveis: 1 multiplicação)
    LogP: []int{40},     // auxiliar para key switching
    PlaintextModulus: 65537,  // t = 2^16+1 (primo Fermat, ideal NTT)
}
// NOTA: Lattigo v6 usa LogQ/LogP (bits), não Q/P (primos explícitos) da v5

Bug Corrigido: Aritmética Modular com uint64

// BUG: int(uint64(big)) % n pode ser NEGATIVO em Go!
// In Go, % preserves sign of dividend. int(0xFF...F) = -1, (-1)%n = -1

// ERRADO:
idx := int(binary.BigEndian.Uint64(hash[:])) % n

// CORRETO: módulo antes de converter
idx := int(binary.BigEndian.Uint64(hash[:]) % uint64(n))

Saída Real da Execução

=== Bridge ML-KEM-768 + BGV/FHE ===

terminal-A: shared secret = 69f056065e74b5f0… [match=true]

terminal-A: voto=0 encriptado → 131406 bytes (FHE ct)

terminal-B: voto=0 encriptado → 131406 bytes (FHE ct)

terminal-C: voto=1 encriptado → 131406 bytes (FHE ct)

Soma homomorfica em 1ms

Alice: 2 votos, Bob: 1 votos, Carlos: 0 votos, Total: 3 votos

Análise de Segurança da Bridge

Camada Algoritmo Base de Segurança Quantum-Safe?
Troca de chaveML-KEM-768Module-LWESIM
Transporte pk_FHEAES-GCM-256Busca exaustivaSIM
Encriptação de votoBGV/RLWERing-LWESIM
ComprometimentoSHA-256Colisão/preimagemSIM

⚠ Urgência 2029

CRQC Timeline — A Janela Está Fechando

Baseado em: Filippo Valsorda — "CRQC Timeline" — engenheiro de criptografia, ex-Go team/Google, autor do age.

Prazo anterior

2035

Estimativa até Jan/2025

Prazo revisado

2029

Google + Oratomic confirmam

Hoje: 2026-04-06

1000

dias até Jan/2029

O Que Mudou em Jan/2025

G

Google Research

Curvas elípticas P-256 e secp256k1 de 256 bits podem ser quebradas em minutos usando qubits supercondutores — com muito menos qubits lógicos do que se estimava anteriormente.

Heather Adkins + Sophie Schmieg: "fronteiras quânticas podem estar mais próximas do que parecem"

Oratomic — Átomos Neutros

Demonstração de que P-256 pode ser quebrado com apenas ~10.000 qubits físicos usando átomos neutros — mais lento, mas igualmente catastrófico.

Scott Aaronson: "comparo este momento ao período em que pesquisas de fissão nuclear foram classificadas (1939–40)"

Harvest Now, Decrypt Later (HNDL)

A ameaça não espera 2029. Adversários estatais já coletam tráfego cifrado com ECDH. Quando o CRQC existir, decriptam tudo retroativamente.

2026 — Hoje

TLS ECDHE capturado
{pub_Bob, ct_AES}

Adversário armazena

2029 — CRQC

Shor(pub_Bob)
→ priv_Bob

Em minutos

Resultado

ECDH(priv_Bob, pub_alice)
→ shared_secret

Mensagem decriptada

// Módulo 11 — demo real (GOWORK=off go run ./fhe/11_crqc_migration)

2029 — Mensagem decriptada: "CONFIDENCIAL: chave mestra sistema bancário — validade 2028-12-31"

Checklist: Agir Agora vs Pode Esperar

🔴 Agir Agora

TLS

HTTPS / TLS 1.3

ECDHE → ML-KEM-768 hybrid. HNDL ativo: sessões hoje decriptadas em 2029.

SSH

SSH Host Keys

ECDSA/Ed25519 → ML-DSA-65. Chaves de longo prazo críticas.

X.509

Certificados TLS

Emitir novos certs com ML-DSA-65. Certs atuais expiram 2027–2029.

DID

Bluesky / atproto DIDs

secp256k1 → ML-DSA. Identidades permanentes explicitamente citadas por Filippo.

BTC

Bitcoin P2PK UTXOs

ECDSA secp256k1 — chave pública diretamente exposta. Requer hard fork.

✅ Simétrico Seguro — Não Migrar

SIM

AES-256-GCM

Grover: 2^128 efetivo. Nenhuma ação necessária.

SHA

SHA-256 / SHA-3 / HMAC

Grover: colisão em 2^128. Seguro para longo prazo.

🟠 Reavaliar em 2026–2027

JWT

JWT ES256 / JOSE

Tokens longa duração = risco. Draft JOSE PQC em desenvolvimento.

age

age (encrypt files)

X25519 recipient → ML-KEM-768. Citado pelo próprio Filippo.

TEE

Intel SGX / AMD SEV-SNP

Sem raízes PQC → attestation não confiável após CRQC.

Comparativo de Tamanhos — Saída do Módulo 11

Troca de Chaves (KEM)

CampoECDH P-256ML-KEM-768
Chave pública65 B1 184 B
Chave privada32 B2 400 B
Ciphertext1 088 B
Shared secret32 B32 B
CRQC 2029❌ Quebrado✓ Seguro

FIPS 203 — Module-LWE (tempo: ~160µs)

Assinatura Digital

CampoECDSA P-256ML-DSA-65
Chave pública65 B1 952 B
Chave privada32 B4 032 B
Assinatura71 B3 309 B
Verify adulteradofalse ✓
CRQC 2029❌ Quebrado✓ Seguro

FIPS 204 — Module-LWE+SIS (tempo: ~750µs)

Timeline Revisada

2024-08

NIST FIPS 203/204/205 publicados — ML-KEM, ML-DSA, SLH-DSA padronizados

2025-01

Google: P-256 quebrado em minutos com supercondutores (menos qubits que o previsto)

2025-01

Oratomic: P-256 quebrado com ~10.000 qubits físicos de átomos neutros

2025-Q1

Filippo Valsorda: "mudei minha visão — prazo crítico é 2029, não 2035" — words.filippo.io/crqc-timeline/

2026-04

← Você está aqui — janela de migração: ~1000 dias

2027-12

Deadline prático: certificados TLS emitidos agora devem ser PQC (validade 2 anos)

2028-12

Última chance: sistemas sem PQC já comprometidos por HNDL acumulado

2029-01

CRQC estimado — ECDH P-256, RSA-2048, secp256k1 potencialmente quebráveis

2030+

Sistemas migrados para ML-KEM + ML-DSA + BGV/FHE permanecem seguros indefinidamente

Módulo 11 — CRQC Migration Demo

# Rodar demo completo: HNDL, ECDH vs ML-KEM, ECDSA vs ML-DSA, checklist
cd fhe/11_crqc_migration
GOWORK=off go run .

# Saída esperada:
# ⚠️ CRQC estimado: Jan/2029 — 1000 dias restantes
# [1] HNDL: "CONFIDENCIAL: chave mestra..." decriptada em 2029
# [2] ML-KEM-768: pk=1184B, sk=2400B, ct=1088B, ss=32B ✓
# [3] ML-DSA-65: pk=1952B, sk=4032B, sig=3309B, verify=true ✓
# [4] 13 protocolos analisados: TLS, SSH, JWT, age, Bitcoin...
# [5] Timeline: 2024-08 NIST → 2025-01 Google/Oratomic → 2029-01 CRQC

Aplicações

20 Aplicações FHE + PQC

Casos de uso reais para o stack quântico-seguro — de votação eletrônica à análise genômica privada.

ML-KEM BGV Governo

🗳️ Votação Eletrônica Quântico-Segura

Terminais encriptam votos com BGV, autoridade soma homomorficamente sem ver os votos individuais. Canal ML-KEM protege a troca de chaves contra Shor em 2030+.

Módulo 10_kyber_fhe_bridge — saída: Alice:2, Bob:1, Carlos:0

CKKS Saúde

🔬 Diagnóstico Médico com FHE

Hospital processa dados de paciente cifrados com CKKS. Resultado do diagnóstico retorna sem expor genoma ou prontuário. Compliant com LGPD/HIPAA.

CKKS para ponto flutuante — precisão configurável por escala Δ

ML-KEM BGV Finanças

🏦 Conformidade Bancária PQC

Bancos calculam exposição regulatória em dados cifrados de clientes sem decifrar. Canal ML-KEM protege a transmissão, BGV processa os dados homomorficamente.

sharedSecret = SHA-256(ss_X25519 || ss_MLKEM) para transição gradual

ML-DSA DevOps

🔐 Assinatura de Código Quantum-Safe

ML-DSA-65 substitui ECDSA em pipelines CI/CD. Binários assinados resistem a computadores quânticos. Assinatura: 3309 B vs 64 B do ECDSA — maior, porém seguro.

sig := scheme.Sign(sk, msg, nil) — FIPS 204, Nível 3

ZKP Lattice Governo

🗝️ Prova Zero-Knowledge de Voto

Votante prova one-hot sem revelar candidato. Lattice Schnorr: A·z = w + c·t mod q. Resistente a Shor, sem curvas elípticas.

Módulo 09_zkp_pqc — parâmetros: q=251, n=8, β=40

ML-KEM ML-DSA Infraestrutura

🏛️ PKI Governamental PQC

ML-KEM-768 para TLS 1.3 + ML-DSA-65 para certificados digitais. Substituição de RSA-2048 em infraestrutura crítica nacional. NIST FIPS 203/204.

pk_KEM=1184B, sk_KEM=2400B, pk_DSA=1952B, sk_DSA=4032B

CKKS Saúde

🧬 Análise Genômica Privada

Laboratório busca marcadores BRCA1/APOE4 em sequência genômica cifrada do paciente com CKKS. Zero exposição de DNA — resultado sem decriptar.

CKKS: encode(z) = ⌊Δ · iDFT(z)⌋, Δ = 2^45, N/2 slots complexos

BGV Governo

📊 Auditoria Fiscal Homomórfica

Receita Federal verifica conformidade de declarações sem acesso aos dados brutos dos contribuintes. BGV processa os registros cifrados, prova conformidade via FHE.

Enc(m₁) + Enc(m₂) = Enc(m₁+m₂ mod t) — adição exata em Z_t

STARK Identidade

🌐 Identidade Digital com STARKs

Provar "tenho mais de 18 anos" sem revelar data de nascimento. Prova hash-only de 2.5 KB, sem trusted setup, verificação em O(log² n).

SHA-256 only: resistente a Grover (128-bit efetivo) e a Shor

Híbrido ML-KEM Infra

🔑 Hybrid KEM para TLS Quântico

X25519 + ML-KEM-768: seguro mesmo que um dos dois seja quebrado. Estratégia adotada por Signal, Chrome e AWS durante a transição para PQC.

sharedSecret = SHA-256(ss_X25519 || ss_MLKEM) — 32 bytes

BGV Blockchain

🏗️ Smart Contracts com FHE

Contratos Ethereum calculam sobre estado cifrado. Leilões cegos — proposta mais alta sem revelar valor até o encerramento. Votação DAO sem expor votos individuais.

BGV: SIMD sobre 4096 slots, cada operação processa em paralelo

BGV Saúde

💊 Pesquisa Clínica Multi-Hospitalar

10 hospitais contribuem dados de pacientes cifrados com BGV. Pesquisador obtém estatísticas agregadas sem ver dados individuais. Compliant com LGPD.

Σ Enc(vᵢ) = Enc(Σvᵢ) — soma homomórfica sem decriptar intermediários

ZKP Lattice Identidade

🔒 Zero-Knowledge para KYC

Provar "meu CPF está na lista aprovada" sem revelar o CPF. Private Set Intersection com FHE + Lattice ZKP — compliance sem exposição de dados pessoais.

SIS: encontrar z com Az=0 mod q e ‖z‖ pequena — infeasível quanticamente

Grover Otimização

⚛️ Busca Quântica em Grafos

Grover aplicado a busca em grafos de rotas: O(√N) vs O(N) clássico. Para N=16: 3 iterações, 96.1% de probabilidade. Para N=1024: 25 iterações.

k_opt = ⌊(π/4)·√N⌋ — para N=1024: k=25, complexidade O(32) vs O(1024)

ML-KEM ML-DSA Hardware

🛡️ HSM Pós-Quântico

ML-KEM-768 + ML-DSA-65 em módulo de hardware seguro. Chaves geradas e assinaturas realizadas dentro do HSM — jamais expostas em memória principal.

sk_KEM=2400B, sk_DSA=4032B — tamanhos maiores que ECDH mas quantum-safe

ML-KEM IoT

📡 IoT com Canal Quantum-Safe

ML-KEM-768 para estabelecer canal em dispositivos IoT com pouca memória. pk de 1184B é viável em microcontroladores ARM. AES-GCM-256 para payload.

ct_KEM=1088B, ss=32B → AES-256 key — overhead mínimo pós-handshake

BGV CKKS Saúde

🏥 Prontuário Eletrônico Federado

Múltiplos hospitais treinam modelo de ML sobre prontuários cifrados com FHE federated. Sem centralizar dados sensíveis — gradientes calculados homomorficamente.

CKKS para ML: ponto flutuante com rescaling automático após multiplicação

STARK FRI Auditoria

✅ Verificação de Integridade STARK

Provar que código/dados não foram adulterados com prova de 2.5KB baseada em SHA-256. Auditável publicamente — qualquer um pode verificar sem trusted setup.

Prob. fraude ≤ (LDE_N/P)^N_QUERY = (32/65537)³ ≈ 10⁻¹¹

ZKP Lattice Supply Chain

💼 Supply Chain com ZKP

Fornecedor prova "tenho certificação ISO" sem revelar detalhes do audit. Prova não-interativa via Fiat-Shamir. Lattice ZKP resistente a computadores quânticos.

c = H(w || t || msg) — Fiat-Shamir transforma protocolo interativo em NI-ZKP

Híbrido Estratégia

🔮 Migração de Legados para PQC

Estratégia híbrida durante a transição: sistemas legados mantêm RSA/ECDH, novos sistemas usam ML-KEM/ML-DSA. "Harvest now, decrypt later" — migração urgente mesmo sem QC hoje.

Timeline: 2024 (NIST FIPS) → 2026 (migração urgente) → 2030 (Q-Day estimado) → 2035 (RSA deprecated)

Análise Comparativa

Segurança Comparativa

Primitiva Shor? Grover? NIST PQC Módulo
RSA-2048/4096SIMNão
ECDH P-256SIMNão
ECDSA / EdDSASIMNão
Schnorr P-256SIMNão09 (demo vulnerável)
AES-128Não64-bit efet.Marginal
AES-256Não128-bit efet.Sim10_bridge
SHA-256Não128-bitSimtodos
ML-KEM-768Não (M-LWE)~168-bitFIPS 20308, 10
ML-DSA-65Não (M-LWE)~165-bitFIPS 20408
BGV / RLWENão (RLWE)~128-bit10_bridge
STARKs (SHA-256)Não128-bit efet.10_stark
Schnorr LatticeNão (SIS)LeveBase FIPS 20409

Timeline da Ameaça Quântica

2024
Padronização NIST — FIPS 203 (ML-KEM), FIPS 204 (ML-DSA), FIPS 205 (SLH-DSA). Migração recomendada agora.
2026
Você está aqui — RSA-2048 ainda seguro. "Harvest Now, Decrypt Later": dados interceptados hoje podem ser decriptados quando o QC existir. Urgência real.
2029
CRQC estimado — revisado — Filippo Valsorda (Jan/2025): Google + Oratomic confirmam P-256 quebrado em minutos. Prazo antecipado de 2035 → 2029. RSA-2048 e secp256k1 potencialmente vulneráveis.
2035
Sistemas clássicos deprecated — Ameaça real a RSA-2048 e ECDH P-256. Sistemas sem migração para PQC estarão comprometidos.
ML-KEM + ML-DSA + BGV — Sistemas migrados para FIPS 203/204 permanecem seguros mesmo com computadores quânticos maduros.

Tamanhos de Dados no Sistema de Votação

ML-KEM-768

pk: 1184 B

sk: 2400 B

ct: 1088 B

ss: 32 B

ML-DSA-65

pk: 1952 B

sk: 4032 B

sig: 3309 B

BGV/FHE

pk_FHE: ~196 KB

ct_FHE: ~131 KB

STARK: ~2.5 KB