← Índice de Demos
FHE em Ação · PSI Colaborativo
Demo 03 · Combate a Fraude entre Bancos
Demonstração Factual

A Conta que se Mantém Fechada.

Acompanhe como três bancos brasileiros podem descobrir clientes envolvidos em fraude colaborativa — sem nenhum dos três jamais ver a lista dos outros.

O Cenário

Três bancos suspeitam que o mesmo grupo de CPFs movimenta valores suspeitos em todos os três simultaneamente. Cada banco quer descobrir QUAIS CPFs aparecem nas três listas — sem revelar o restante.

O Problema

Por motivos legais (LGPD) e competitivos, nenhum banco pode mostrar sua lista aos outros. PSI sob FHE resolve isso matematicamente.

A Garantia

O servidor neutro nunca vê qualquer das listas. A ÚNICA informação que sai é a interseção decifrada coletivamente. Garantia matemática (RLWE), não política.

Tudo o que você verá é real Os números, tempos, tamanhos e CPFs detectados foram capturados de uma execução verdadeira do código demo 03/main.go usando Lattigo v6 com esquema BGV. Nada é simulado.
Passo 01 · Setup

Definir os parâmetros.

Antes de qualquer cifragem, escolhemos os parâmetros do esquema FHE. Cada parâmetro é um trade-off entre segurança, velocidade e capacidade de cálculo.

Parâmetros Escolhidos · BGV

// Lattigo v6 — BGV
params := bgv.NewParametersFromLiteral({
  LogN: 13,  // N = 8192
  LogQ: [55, 45, 45],
  LogP: [61],
  PlaintextModulus: 65537,
})
8 192Slots/ciphertext
EXATOTipo de esquema

O que cada termo significa

BGV (esquema "exato") — Família de criptografia homomórfica que opera sobre números inteiros. Não tem ruído de aproximação. Resultado é sempre bit-a-bit idêntico ao plaintext. Ideal para contagens, queries SQL e lógica booleana — exatamente o que PSI precisa.

8 192 slots — Cada ciphertext FHE não é um único valor: é um vetor de 8 192 valores empacotados. Você opera sobre os 8 192 ao mesmo tempo com uma única operação. Esse "batching" nativo é o que torna FHE viável em escala — em produção, cabem milhões de CPFs por ciphertext.

Profundidade multiplicativa 2 — Quantas multiplicações encadeadas o ciphertext suporta antes de ficar instável. Cada multiplicação consome 1 nível. PSI de 3 partes precisa de 2 multiplicações encadeadas → profundidade 2 basta.

~128 bits de segurança — Padrão da indústria. Quebrar a chave por força bruta exigiria ~2128 operações — número astronômico, inviável até em hardware quântico previsível.

Base RLWE — Ring Learning With Errors. O problema matemático que sustenta a segurança. É o mesmo problema sobre o qual NIST padronizou ML-KEM e ML-DSA, a próxima geração de criptografia pós-quântica.

Passo 02 · Chaves

Gerar par de chaves.

Em produção, esta chave seria gerada via threshold cryptography entre os 3 bancos + uma autoridade neutra. Aqui simplificamos com chave única para clareza.

Fluxo de Chaves

Banco A
Threshold
k-de-n
Bancos B+C

Quórum exigido para decifrar o resultado final. Nenhuma parte sozinha pode ver nada.

O Que Foi Gerado

~10 msGeração de chaves
7.0 KBChave pública (~)
44 KBRelinearização (~)
128 bitSegurança
Passo 03 · Listas

Cada banco gera e cifra.

Cada banco produz um vetor característico binário (1 = CPF na lista) e cifra localmente. APENAS o ciphertext sai do banco.

Listas em Claro (apenas referência didática)

  • Banco A (BB)007 023 089 142 200
    + 5 CPFs próprios
  • Banco B (Itaú)007 023 089 142 200
    + 5 CPFs próprios
  • Banco C (Bradesco)007 023 089 142 200
    + 5 CPFs próprios
Interseção esperada
CPF#007 · CPF#023 · CPF#089 · CPF#142 · CPF#200

Cifragem BGV

3.0 msPor banco
32 BPlaintext (256 bits)
384 KBCiphertext
~12 000×Overhead

O overhead é o preço da privacidade matemática. Em troca, os outros bancos jamais conseguem ver esta lista.

Passo 04 · Trânsito

O que o servidor neutro recebe.

Os 3 bancos enviam apenas seus ciphertexts. O servidor neutro JAMAIS recebe a chave secreta.

Amostra Real do Ciphertext (32 primeiros bytes)

01 7b 22 50 6c 61 69 6e
74 65 78 74 4d 65 74 61
44 61 74 61 22 3a 7b 22
53 63 61 6c 65 22 3a 7b
...

Cada ciphertext completo tem ~384 KB de bytes pseudoaleatórios. Sem a chave secreta, recuperar a lista de CPFs exigiria resolver Ring-LWE em dimensão 8 192 — ~2128 operações.

Total Trafegado

384 KBct_A · Banco BB
384 KBct_B · Banco Itaú
384 KBct_C · Banco Bradesco
~1.1 MBTotal enviado
Passo 05 · Servidor

Computar interseção sob cifra.

O servidor multiplica os 3 ciphertexts elemento-a-elemento. Slot a slot, o produto é 1 apenas onde TODOS os três bancos têm 1 — exatamente a interseção.

O Algoritmo

// servidor: três ciphertexts, sem chave
// (1) ct_A · ct_B sob cifra
ctAB := evaluator.Mul(ctA, ctB)
evaluator.Relinearize(ctAB)
// (2) (ct_A · ct_B) · ct_C
ctABC := evaluator.Mul(ctAB, ctC)
evaluator.Relinearize(ctABC)
// resultado: vetor binário cifrado
// 1 = CPF está nas 3 listas
// 0 = caso contrário

Performance Real Medida

7 msTotal · 3 partes
2Multiplicações
1Ciphertext final
0Bytes decifrados
O que o servidor sabe agora Um ciphertext que codifica a interseção dos três conjuntos. Não tem ideia de quais CPFs. Não sabe nem o tamanho real das listas dos bancos.
Passo 06 · Decifração

Decifração colaborativa.

O resultado cifrado é decifrado coletivamente (em produção, com quórum threshold). Cada bit 1 do vetor resultante revela um CPF na interseção.

CPFs Detectados na Interseção

★ CPF#007
★ CPF#023
★ CPF#089
★ CPF#142
★ CPF#200

O Que Cada Banco Recebe

APENAS estes 5 CPFs. Os outros 5 CPFs de cada lista permanecem privados — nenhum banco descobre as listas dos concorrentes.

O ponto crucial Os bancos agora podem agir sobre os 5 CPFs (alertas, bloqueio, reporte ao Coaf). Sem ter visto nada além do necessário.
Passo 07 · Prova

Validação matemática.

Para provar que o cálculo cifrado equivale ao plaintext, comparamos contra a interseção esperada calculada em claro.

FHE vs Plaintext

MétricaValor
Esperado5 CPFs
Encontrado5 CPFs
Corretos5 / 5
Falsos positivos0
Falsos negativos0
StatusMATCH PERFEITO

Por que é Exato

EXATAPrecisão FHE vs claro

BGV é um esquema exato (sem ruído de aproximação como CKKS). Para inteiros dentro do plaintext modulus, o resultado FHE é idêntico ao plaintext bit por bit.

Passo 08 · Adversarial

O que um banco desonesto consegue.

Suponha que um dos bancos (ou um funcionário do servidor neutro) tente descobrir a lista dos OUTROS bancos a partir do ciphertext recebido.

Tentativas de Ataque

  • Tentativa 1 — Ler bytes do ciphertext Resultado: bytes pseudoaleatórios. Nada extraído.
  • Tentativa 2 — Brute force das listas Universo de 256 posições, ~10 ativas. Combinações: C(256,10) ≈ 1017. Inviável; e ainda precisaria decifrar para verificar.
  • Tentativa 3 — Recuperar sk a partir de pk Resolver Ring-LWE em dimensão 8 192. Melhor ataque conhecido: ~2128 operações. Inviável em hardware clássico ou quântico previsível.

O que sai do sistema

A ÚNICA informação que sai legitimamente é o resultado decifrado pelo quórum threshold: a interseção. E só.

O ponto regulatório Para LGPD e Coaf, a diferença entre "tratamos com cuidado" e "matematicamente impossível ver" é a diferença entre risco residual e risco zero.
Passo 09 · Síntese

O que acabou de acontecer.

Em menos de 1 segundo total, três bancos descobriram fraudadores comuns sem nenhum deles ver a lista dos outros.

O Fluxo Completo

  1. Três bancos geraram listas privadas de CPFs suspeitos
  2. Cada banco cifrou sua lista localmente sob BGV
  3. Enviaram apenas os ciphertexts ao servidor neutro
  4. O servidor multiplicou os 3 ciphertexts sob cifra (7 ms)
  5. Decifração colaborativa revelou apenas a interseção
  6. Cada banco descobriu os 5 fraudadores comuns

Números Reais Desta Execução

3 msCifragem por banco
7 msInterseção sob cifra
384 KBPor ciphertext
EXATAPrecisão
Esta primitiva serve 6 eBooks Bancos (AML), Farmácias (controlados), Operadoras (sinistro), Seguradoras (fraude), E-commerce (chargeback), Governo (cruzamento agências). Mesma matemática, indústrias diferentes.
Como isto escala para produção realEsta demo usa universo de 256 CPFs representados como vetor característico binário — cabe em 8 192 slots. Para 10M+ de CPFs por banco (realismo brasileiro), um vetor característico bruto seria inviável: exigiria 10M de slots. Em produção real, PSI usa hashing: Bloom filters, Cuckoo hashing ou OPRF-based PSI (Chase-Miao, SoK 2020). A primitiva "AND cifrado via multiplicação" permanece a mesma; apenas a representação de entrada muda. O padrão é usado por sistemas reais de partnership bancária e pelo Google Password Checkup.