A Soberania Calculável.
100 famílias contribuem ao censo. IBGE produz tabela agregada. Sem registros individuais expostos a ninguém.
Cenário
IBGE conduz censo. Cada família contribui dados cifrados localmente. Servidor central computa agregado por região para focalização de programas sociais.
Problema
Hoje IBGE armazena dados em claro em data centers próprios. Acesso de pesquisador exige autorização individual lenta. Risco de vazamento permanente.
Garantia
Sob FHE: dados ficam permanentemente cifrados. Tabelas agregadas são geradas sob cifra. Decifração coletiva exige IBGE + ANPD + AGU.
Definir os parâmetros.
Antes do censo cifrado, escolhemos os parâmetros BGV. Cada um é um trade-off entre segurança, velocidade e capacidade.
Parâmetros BGV
O que cada termo significa
BGV (esquema "exato") — Família FHE que opera sobre inteiros. Sem ruído de aproximação. Para contagem censitária precisa-se de exatidão absoluta — BGV é o esquema correto.
8 192 slots — Cada ciphertext é um vetor de 8 192 valores. Em produção real do censo, cada slot pode codificar uma família ou uma região. Operação única processa todos.
Profundidade multiplicativa 2 — Quantas multiplicações encadeadas o ciphertext suporta. Para somas censitárias, profundidade baixa basta — somar é mais barato que multiplicar.
~128 bits de segurança — Padrão da indústria. Quebrar a chave exigiria ~2128 operações — astronômico, inviável até em hardware quântico.
Base RLWE — Ring Learning With Errors. Mesmo problema do ML-KEM/ML-DSA padronizados pelo NIST como criptografia pós-quântica.
Chave nacional dividida.
Em produção real, a chave de decifração não pertence a uma única entidade. Ela é dividida matematicamente entre múltiplas instituições, cada uma com seu papel constitucional distinto.
Quem detém os shares
IBGE — operador técnico do censo. Detém share 1 da chave. Sozinho não consegue decifrar nada.
ANPD — autoridade nacional de proteção de dado. Detém share 2. Garante que o uso respeita LGPD.
AGU — Advocacia-Geral da União. Detém share 3. Custódia jurídica da operação.
Quórum exigido: 3 de 3. Sem autorização das três, o resultado permanece matematicamente inacessível.
O que é "threshold cryptography"
Chave dividida, não copiada — A chave secreta que decifra o resultado é matematicamente dividida em N pedaços (shares) usando técnicas como Shamir Secret Sharing. Nenhum pedaço sozinho contém qualquer informação útil sobre a chave inteira — é como dar 3 pedaços de um quebra-cabeças onde nenhum pedaço isoladamente revela a imagem.
Decifração coletiva — Para decifrar, cada parte gera um "share de decifração" (não revela seu pedaço de chave). Os shares são agregados matematicamente, e só então o resultado aparece em claro. Se faltar uma parte, o agregado é inútil.
k-de-n (quórum) — Em produção real você pode configurar "3-de-5" ou "4-de-7", permitindo redundância: se até k-1 partes ficarem indisponíveis, o sistema ainda funciona. Aqui usamos 3-de-3 (todas obrigatórias) por simplicidade.
Garantia tripla — Técnica (matemática), jurídica (LGPD via ANPD), política (auditoria pública via AGU). Cada decifração deixa rastro irrefutável das três autorizações.
Famílias contribuem cifrado.
Cada família responde ao censo no próprio dispositivo (app, terminal, recenseador). O dado é cifrado antes de qualquer byte sair da casa. APENAS o ciphertext viaja para o IBGE.
Exemplo concreto · Família X
Dados em claro (no celular):
renda_familiar: R$ 850/mês
linha_pobreza : SIM
num_pessoas : 4
Vetor binário gerado localmente:
total_por_região = [0,1,0,0,0]
↑
Nordeste = 1
Cifragem local: o vetor é cifrado com a chave pública do consórcio (gerada na fase de threshold). Sai da casa apenas o ciphertext de ~384 KB.
O que cada coisa significa
Vetor característico (one-hot) — Em vez de enviar "estou no Nordeste e sou pobre", a família envia um vetor binário onde cada posição representa uma região, e o valor é 1 ou 0. Isso permite que o IBGE simplesmente some os vetores para obter o total por região.
Cifragem antes do envio — A diferença crucial vs censo tradicional: o vetor é cifrado na própria casa, antes de viajar. Em nenhum momento existe uma cópia em claro fora do dispositivo da família.
3 ms por dataset — Cifrar um vetor de 8 192 slots leva poucos milissegundos em smartphone comum. Velocidade não é gargalo.
100 famílias na demo — Versão didática. Em produção real do IBGE, milhões de famílias contribuem em paralelo. O padrão escala porque cada cifragem é independente.
O que chega ao servidor.
Os ciphertexts viajam pela internet até o IBGE — e podem inclusive ser hospedados em cloud estrangeira (AWS, Azure, GCP) sem problema. O motivo é matemático.
O que o servidor enxerga
Bytes que chegam:
74 65 78 74 4d 65 74 61
44 61 74 61 22 3a 7b 22
53 63 61 6c 65 22 3a 7b
...
Esses bytes são pseudoaleatórios — indistinguíveis de ruído para qualquer observador sem a chave secreta.
Por que cloud estrangeira pode hospedar
CLOUD Act americano — Lei dos EUA (2018) que obriga empresas americanas (incluindo AWS, Azure, GCP) a entregar dados de seus clientes mediante ordem judicial americana, mesmo se os dados estão fisicamente fora dos EUA. É a maior preocupação de soberania digital do Brasil hoje.
Por que FHE neutraliza — A cloud só armazena ciphertext. Não tem a chave (que está distribuída no Brasil entre IBGE+ANPD+AGU). Mesmo se receber ordem judicial americana e for obrigada a entregar tudo o que tem, entrega bytes pseudoaleatórios. Ninguém — nem mesmo o juiz americano — consegue extrair informação útil.
Soberania de dado por matemática — Em vez de migrar tudo para cloud nacional (caro, lento, limitado), o Brasil pode usar a infraestrutura global de cloud sem entregar soberania. É exatamente o tipo de movimento que países sérios em soberania digital (França via SecNumCloud, Alemanha via Gaia-X) estão buscando.
Servidor soma sob cifra.
O servidor central recebe os ciphertexts de todas as famílias e os agrega — sem nunca decifrar nenhum. A operação central é literalmente uma soma cifrada.
O algoritmo · em pseudo-código
ct_acumulado := ct[0]
// 2. Soma todos sob cifra
for i := 1; i < N; i++ {
ct_acumulado := evaluator.Add(
ct_acumulado, ct[i],
)
}
// 3. Resultado: ct_total_por_região
// nenhum decifração até aqui
O que está acontecendo
Soma homomórfica — A propriedade que dá nome a "FHE" (Fully Homomorphic Encryption) é exatamente esta: a soma de dois ciphertexts decifra para a soma dos plaintexts. Dec(ct₁ + ct₂) = m₁ + m₂. O servidor faz a operação sem nunca ver os números.
Slot-wise — Cada ciphertext tem 8 192 slots (5 deles ativos para as 5 regiões). A soma é feita slot a slot. Slot 0 (Norte) acumula só os 1's vindos das famílias do Norte. Slot 1 (Nordeste) acumula só os do Nordeste. E assim por diante. Tudo paralelo, em uma única operação.
Por que esta demo é "trivial" — O exemplo didático já chega com os agregados pré-somados para simplificar o passo a passo. Em produção real do IBGE, este passo é onde as milhões de somas acontecem — e é o passo que mais ganha com batching de slots.
Sem decifração — Em momento algum o servidor toca em valores em claro. Ele só sabe que tem dois "objetos opacos" e que a operação Add devolve um terceiro objeto opaco. A matemática garante que esse terceiro objeto, quando decifrado pelo quórum, será a soma correta.
A tabela pública.
Após o quórum (IBGE + ANPD + AGU) autorizar a decifração, o resultado agregado é revelado. APENAS o agregado por região — nenhum registro individual.
Resultado decifrado
| Região | Pobres | Total | % Pobreza |
|---|---|---|---|
| Norte | 4 | 13 | 30.8% |
| Nordeste | 10 | 21 | 47.6% |
| Centro-Oeste | 3 | 15 | 20.0% |
| Sudeste | 5 | 30 | 16.7% |
| Sul | 4 | 21 | 19.0% |
Como ler esta tabela
Pobres — quantas famílias daquela região estão abaixo da linha de pobreza (renda mensal < R$ 218 per capita).
Total — quantas famílias da amostra estão naquela região.
% Pobreza — taxa de pobreza relativa, calculada após a decifração (não sob cifra). É o número que vai para a focalização do programa social.
Distribuição esperada — Nordeste lidera (47,6%), Sudeste tem menor (16,7%). Coerente com dados reais do IBGE — a demo gerou os dados sintéticos com essa distribuição calibrada.
O que NÃO está aqui — nenhuma família individual aparece. Nenhum CPF. Nenhum endereço. Nenhuma renda específica. Apenas as 5 contagens agregadas e os 5 totais.
Validação matemática.
Para provar que o cálculo cifrado produziu o mesmo resultado que um cálculo plaintext tradicional, comparamos lado a lado.
Comparação FHE × plaintext
| Região | FHE | Claro | Erro |
|---|---|---|---|
| Norte | 4 | 4 | 0 |
| Nordeste | 10 | 10 | 0 |
| Centro-Oeste | 3 | 3 | 0 |
| Sudeste | 5 | 5 | 0 |
| Sul | 4 | 4 | 0 |
Por que é exato
BGV é esquema "exato" — Diferente de CKKS (que opera em números reais aproximados), BGV opera em inteiros módulo um primo. Sem ruído de aproximação. O resultado da soma cifrada é sempre bit-a-bit idêntico à soma plaintext.
Por que isso importa para censo — Em estatística pública, "31% pobres no Norte" e "30,8% pobres no Norte" são números diferentes. A precisão precisa ser absoluta. BGV garante isso. Para benchmarking de hospital ou ML federado, CKKS aproximado basta. Para censo, exigimos BGV exato.
Auditoria pública possível — Como o resultado é matematicamente verificável (FHE não introduz aleatoriedade no resultado final), qualquer auditor independente pode rodar a mesma operação sobre os mesmos ciphertexts e obter o mesmo agregado. Reproducibilidade é parte da garantia.
Defesa em três camadas.
Vamos imaginar três adversários diferentes tentando extrair dado individual. Cada um falha por um motivo diferente — e essa redundância é a defesa.
Adversário 1 — Governo estrangeiro (CLOUD Act)
Ataque: juiz americano emite ordem para AWS/Azure/GCP entregar todos os dados brasileiros hospedados em seus servidores.
Defesa: a cloud só tem ciphertext. Entrega bytes pseudoaleatórios. Sem a chave (que está distribuída no Brasil entre IBGE+ANPD+AGU), nada é decifrável. Mesmo a NSA com supercomputador clássico precisaria de ~2128 operações para tentar quebrar uma única chave.
Adversário 2 — Funcionário desonesto do IBGE
Ataque: funcionário com acesso ao share do IBGE tenta decifrar dado individual.
Defesa: ele tem só 1 dos 3 shares necessários. Sozinho, seu share é matematicamente inútil. Para decifrar precisaria convencer ANPD e AGU a colaborar — três decisões institucionais simultâneas, com auditoria.
Adversário 3 — Pesquisador com bases públicas
Ataque: pesquisador legítimo tenta cruzar a tabela agregada com bases públicas (eleitorais, CNPJ, OpenStreetMap) para re-identificar famílias específicas.
Defesa: a tabela agregada com K-anonymity ≥ 10 por célula é resistente — cada célula representa pelo menos 10 famílias indistinguíveis. Para hardening adicional, pode-se aplicar privacidade diferencial (ruído gaussiano calibrado) antes de publicar.
Por que três camadas?
Defesa em profundidade — A força não vem de uma única barreira "perfeita", mas de três barreiras independentes que precisariam ser quebradas simultaneamente. Quebrar a matemática (RLWE) é inviável. Quebrar a distribuição de chaves exige colusão tripla institucional. Quebrar a anonimização exige re-identificação contra base agregada protegida por DP.
Não é "confiança no IBGE" — A defesa é deliberadamente construída para sobreviver a um IBGE malicioso. Esse é o ponto de FHE + threshold: não confiar em ninguém, e mesmo assim funcionar.
Estado soberano por desenho.
O que esta demo prova, em poucas frases: é possível conduzir censo público sem que nenhuma instituição (nem o IBGE) tenha acesso unilateral a registros individuais.
O fluxo completo
- Definimos parâmetros BGV (esquema exato, ideal para contagem)
- Chave dividida em 3 shares (IBGE, ANPD, AGU)
- 100 famílias cifraram dados localmente em vetor binário
- Ciphertexts viajaram (cloud nacional ou estrangeira indiferente)
- Servidor somou ciphertexts sob cifra (operação Add homomórfica)
- Quórum 3-de-3 autorizou a decifração
- Tabela agregada por região revelada — apenas 5 contagens
- Validação confirmou match exato com plaintext