Parte II · 1 — Primitivas simétricas
Uma chave, partilhada pelos dois lados. É o cavalo de trabalho da confidencialidade: rápida, madura e — quando usada com o modo certo — segura. Aqui estão as cifras e, mais importante, como não errar ao usá-las.
1.1 Duas famílias: bloco e fluxo
A criptografia simétrica usa a mesma chave secreta para cifrar e decifrar. Há duas formas de construir a cifra:
- Cifra de bloco — opera em blocos de tamanho fixo (o AES usa 128 bits).
Para cifrar dados maiores que um bloco, precisa de um modo de operação (seção 1.3). Exemplos: AES, o veterano DES (hoje inseguro).
- Cifra de fluxo — gera um keystream pseudoaleatório que é combinado
(XOR) com o plaintext, bit a bit. Exemplo moderno: ChaCha20.
Na prática a fronteira é fluida: uma cifra de bloco em modo contador (CTR) vira uma cifra de fluxo. O importante não é a família, é a construção completa que se usa.
1.2 Como uma cifra de bloco funciona: SPN e Feistel
Uma cifra de bloco é uma permutação parametrizada pela chave que aplica os princípios de Shannon (confusão e difusão) em várias rodadas. Duas estruturas dominam:
- Rede de substituição-permutação (SPN) — cada rodada faz substituição
(S-boxes → confusão) e permutação/mistura (→ difusão). É a estrutura do AES.
- Rede de Feistel — divide o bloco em duas metades e processa uma com uma
função da outra, alternando. Permite que cifrar e decifrar usem o mesmo circuito. É a estrutura do DES.
1.3 O AES e a escolha de cifra
O AES (Advanced Encryption Standard, 2001 — originalmente Rijndael) é a cifra de bloco padrão do mundo: bloco de 128 bits, chaves de 128192256 bits, 101214 rodadas. Tem aceleração em hardware (instruções AES-NI) na maioria das CPUs, o que o torna rápido e constant-time por construção.
| Cifra | Quando usar |
|---|---|
| AES-256 (em modo AEAD) | Default geral; ideal com AES-NI no hardware. |
| ChaCha20 (em AEAD, com Poly1305) | Quando não há AES-NI (mobile, embarcado) — rápida em software puro e resistente a canais laterais de cache. |
Nunca escolha "uma cifra" sozinha. Escolha uma construção AEAD completa (próxima seção) — AES-256-GCM ou ChaCha20-Poly1305.
1.4 Modos de operação — onde mais se erra
Uma cifra de bloco só sabe cifrar um bloco. O modo estende isso para mensagens reais — e é a fonte número um de vulnerabilidades de quem implementa.
| Modo | Veredito | Por quê |
|---|---|---|
| ECB | ❌ nunca | Blocos iguais → ciphertexts iguais. Vaza padrões (o famoso "pinguim ECB"). |
| CBC | ⚠️ legado | Encadeia blocos; precisa de IV aleatório e, sozinho, não autentica (sujeito a padding-oracle). |
| CTR | ⚠️ só com MAC | Vira cifra de fluxo; nunca reutilizar (nonce, chave). Sem autenticação por si. |
| GCM / Poly1305 | ✅ | AEAD — cifra e autentica de uma vez. O default moderno. |
1.5 AEAD: cifrar e autenticar juntos
A lição mais cara da história da criptografia aplicada: cifrar sem autenticar é inseguro. Um adversário que não consegue ler a mensagem muitas vezes consegue alterá-la de forma útil (ataques de maleabilidade, padding-oracle).
AEAD (Authenticated Encryption with Associated Data) resolve isso numa primitiva só. Ela recebe quatro coisas e devolve duas:
- Chave — o segredo simétrico.
- Nonce — number used once: público, mas jamais repetido com a mesma
chave. Repetir um nonce em GCM é catastrófico (revela o segredo de autenticação). É o erro fatal mais comum.
- Plaintext — o que será cifrado.
- Associated data (AAD) — cabeçalhos que precisam ser
autenticados mas não cifrados (ex.: o destinatário de um pacote).
Saída: o ciphertext + uma tag de autenticação. Na decifragem, se a tag não confere, a operação falha por inteiro — nada de plaintext parcial.
Regra de ouro da simétrica: use AES-256-GCM ou ChaCha20-Poly1305, com um nonce que nunca se repete por chave (contador ou aleatório de 96+ bits), e deixe a biblioteca gerenciar a tag. Tudo abaixo disso é pedir um CVE.
Referência densa: estruturas, DES/3DES, todos os modos e os parâmetros de GCMCCM estão em [
04-simetrica](..08-referencia/04-simetrica.md). A seguir: Hash, MAC e KDF — a outra metade do mundo simétrico, onde mora a integridade.