# AEAD vs CBC: por que o modo importa

> A diferença prática entre uma cifra AEAD como o AES-GCM e uma cifra CBC mais antiga com um HMAC separado, os ataques de oráculo de preenchimento que mataram o MAC-then-encrypt, e a única troca que o AEAD ainda pede.

Source: https://ronutz.com/pt-BR/learn/aead-vs-cbc  
Updated: 2026-06-29  
Related tools: https://ronutz.com/pt-BR/tools/cipher

---

## Duas formas de cifrar um registro

Depois que um handshake TLS acordou as chaves, cada registro de dados da aplicação precisa ser ao mesmo tempo cifrado, para que um bisbilhoteiro não possa lê-lo, e autenticado, para que um atacante não possa adulterá-lo. Há duas grandes formas de uma suíte de cifra fazer isso, e o token de modo no nome da suíte diz qual delas.

Uma cifra **AEAD**, como AES-GCM, AES-CCM ou ChaCha20-Poly1305, faz as duas tarefas em uma única primitiva. Você lhe dá o texto claro e alguns dados associados, e ela devolve o texto cifrado mais uma etiqueta de autenticação. A decifração verifica a etiqueta e os dados juntos, e falha como uma só operação se algo foi alterado.

Uma cifra **CBC** faz apenas a cifragem. Para obter integridade, a suíte a combina com um HMAC separado, nomeado pelo hash final na suíte (por exemplo, o `SHA` em `TLS_RSA_WITH_AES_128_CBC_SHA`). As duas operações são amarradas pelo protocolo, e a ordem em que acontecem acaba importando enormemente.

## Por que o MAC-then-encrypt deu errado

O TLS originalmente usava MAC-then-encrypt: calcular o HMAC sobre o texto claro, anexá-lo, preencher o resultado até um limite de bloco e então cifrar tudo com CBC. O problema é que o receptor precisa decifrar e remover o preenchimento antes de poder verificar o MAC, então preenchimento malformado e um MAC ruim são detectados em estágios diferentes. Um atacante que consiga ver se um registro falhou no preenchimento ou no MAC — seja por uma mensagem de erro ou apenas pelo tempo de resposta — aprende um bit sobre o texto claro por tentativa. Repetido, esse bit se torna a mensagem inteira.

Isso é um oráculo de preenchimento, e não é teórico. Uma série de ataques ao longo dos anos, incluindo BEAST, Lucky13 e POODLE, todos exploraram a proteção de registros CBC no TLS. Cada um foi corrigido com código de tempo constante cada vez mais delicado, mas a construção subjacente continuava produzindo novas variantes. A lição que a indústria tirou foi parar de usá-la.

## Por que o AEAD é o padrão agora

O AEAD remove a classe inteira de problema. Não há etapa de preenchimento separada para sondar nem estágio de MAC separado para cronometrar, porque verificação e decifração são uma operação que ou tem sucesso ou falha. O TLS 1.3 leva isso à conclusão lógica e permite apenas cifras AEAD; suítes CBC simplesmente não fazem parte do TLS 1.3. No TLS 1.2 as duas existem, e é por isso que o decodificador marca uma suíte CBC-com-HMAC-SHA1 como fraca mesmo quando a cifra é AES.

Quando você vê `GCM`, `CCM` ou `POLY1305` no nome de uma suíte, está olhando para AEAD. Quando vê `CBC`, está olhando para a construção mais antiga, e em um serviço moderno isso deveria ser, no máximo, um recurso de contingência.

## A troca que o AEAD ainda pede

O AEAD não é livre de arestas; ele apenas as desloca. Toda cifragem AEAD precisa de um nonce, um número usado uma única vez, e a segurança do GCM em particular desmorona se o mesmo nonce for reutilizado com a mesma chave. O TLS gerencia os nonces para você com um contador por conexão, então isso é um perigo para sistemas que constroem seu próprio enquadramento, e não para o TLS em si, mas é a razão pela qual os projetos AEAD se importam tanto com a construção de nonces.

A outra troca é o comprimento da etiqueta de autenticação. As suítes padrão de GCM e Poly1305 usam uma etiqueta de 16 bytes. As suítes `CCM_8` truncam isso para 8 bytes para economizar sobrecarga em enlaces restritos, o que enfraquece de forma mensurável a integridade. É por isso que `TLS_AES_128_CCM_8_SHA256` é uma suíte AEAD de TLS 1.3 real que a IANA ainda assim se recusa a marcar como recomendada: o modo é moderno, mas a etiqueta curta é um compromisso que a internet em geral não precisa fazer.
