Skip to content

Criptografia Simétrica - Principais Algoritmos

Depois de entender o conceito e o funcionamento da criptografia simétrica, é hora de conhecer os principais algoritmos que a implementam. Alguns deles sustentam toda a segurança digital moderna, outros ainda aparecem em sistemas legados e precisam ser identificados para serem substituídos ou mantidos sob controle.

Neste post percorreremos os algoritmos mais relevantes do universo simétrico: suas origens, características técnicas, variantes, status atual e os cenários em que são utilizados. Essa visão panorâmica permitirá, nos próximos posts, compreender temas como modos de operação, derivação de chaves e protocolos construídos sobre esses algoritmos.

Como os algoritmos simétricos são classificados

Section titled “Como os algoritmos simétricos são classificados”

Antes de entrar nos algoritmos específicos, vale situar as duas grandes famílias que agrupam a maioria deles.

Processam dados em blocos de tamanho fixo, geralmente de 64 ou 128 bits. Mensagens maiores são divididas em blocos, e um modo de operação define como esses blocos se encadeiam. Exemplos: AES, DES, 3DES, Blowfish, Twofish, Serpent, Camellia, IDEA.

Processam a informação bit a bit ou byte a byte, geralmente combinando os dados com uma sequência pseudoaleatória gerada a partir da chave. São úteis quando os dados chegam continuamente, e não em blocos completos. Exemplos: ChaCha20, Salsa20, RC4.

CaracterísticaCifra de blocoCifra de fluxo
Unidade de processamentoBloco (64 ou 128 bits)Bit ou byte
Precisa de modo de operaçãoSimGeralmente não
Exemplo modernoAESChaCha20
Uso típicoDiscos, arquivos, bancosStreaming, VoIP, móvel

Como vimos, cifras de bloco processam a informação em blocos de tamanho fixo (geralmente 128 bits para o AES). Mas mensagens reais, arquivos, pacotes de rede e discos inteiros raramente têm exatamente esse tamanho. Para cifrar dados maiores do que um bloco, é preciso definir como os blocos se encadeiam. Essa definição é o chamado modo de operação.

O modo de operação é tão importante quanto o próprio algoritmo. Um AES bem implementado pode se tornar inseguro se usado em um modo inadequado. Vamos conhecer os principais modos e entender quando cada um é apropriado.

É o modo mais simples e também o mais perigoso. Cada bloco de texto claro é cifrado de forma independente com a mesma chave. Isso significa que blocos idênticos de texto claro produzem blocos idênticos de texto cifrado, revelando padrões estruturais nos dados.

Bloco 1 → [AES + Chave] → Bloco cifrado 1
Bloco 2 → [AES + Chave] → Bloco cifrado 2
Bloco 3 → [AES + Chave] → Bloco cifrado 3
  • Vantagens: paralelizável, simples de implementar
  • Desvantagens: expõe padrões dos dados, não oferece confidencialidade real para dados estruturados
  • Status: inseguro para quase todos os usos, deve ser evitado
  • Exemplo didático famoso: cifrar uma imagem bitmap com ECB preserva visualmente o conteúdo original, pois pixels iguais viram bytes cifrados iguais (o “pinguim ECB” é a ilustração clássica desse problema)

Cada bloco de texto claro é combinado via XOR com o bloco cifrado anterior antes de ser cifrado. O primeiro bloco usa um vetor de inicialização (IV) aleatório. Isso garante que mensagens iguais produzam textos cifrados diferentes (desde que o IV seja distinto).

Bloco 1: XOR(Texto1, IV) → [AES] → Cifrado 1
Bloco 2: XOR(Texto2, Cifrado 1) → [AES] → Cifrado 2
Bloco 3: XOR(Texto3, Cifrado 2) → [AES] → Cifrado 3
  • Vantagens: oculta padrões dos dados, foi padrão por décadas em TLS, IPsec e outros protocolos
  • Desvantagens: cifragem não é paralelizável (cada bloco depende do anterior); vulnerável a ataques de padding oracle quando usado sem autenticação (ataques Vaudenay, Lucky Thirteen, POODLE)
  • Status: ainda seguro quando combinado com HMAC em modo Encrypt-then-MAC, mas superado por modos AEAD modernos como GCM
  • Observação: exige padding (geralmente PKCS#7) para que a mensagem seja múltipla do tamanho do bloco

Transforma uma cifra de bloco em uma cifra de fluxo. Em vez de cifrar o texto claro diretamente, o algoritmo cifra um contador incremental combinado com um nonce. O resultado é combinado via XOR com o texto claro para produzir o texto cifrado.

Contador 0 + Nonce → [AES] → Keystream 0 → XOR com Texto1 → Cifrado 1
Contador 1 + Nonce → [AES] → Keystream 1 → XOR com Texto2 → Cifrado 2
Contador 2 + Nonce → [AES] → Keystream 2 → XOR com Texto3 → Cifrado 3
  • Vantagens: altamente paralelizável, não requer padding, permite acesso aleatório a qualquer parte do texto cifrado
  • Desvantagens: catastrófico se o par (chave, nonce) for reutilizado (permite recuperar o texto claro facilmente)
  • Status: seguro quando o nonce é único por operação; base para o modo GCM
  • Uso típico: cifragem em transmissões de áudio, vídeo e discos (variante XTS)

É um modo AEAD (Authenticated Encryption with Associated Data): combina o modo CTR para cifragem com um código de autenticação baseado em multiplicação no campo de Galois (GHASH). Garante simultaneamente confidencialidade, integridade e autenticidade em uma única operação.

  • Vantagens: autenticado por padrão, muito rápido com aceleração em hardware (AES-NI + PCLMULQDQ), paralelizável
  • Desvantagens: também catastrófico se o nonce for reutilizado com a mesma chave
  • Status: padrão atual para TLS 1.2, TLS 1.3, SSH, IPsec e muitos outros protocolos
  • Recomendação: use AES-256-GCM sempre que possível em novos projetos

XTS (XEX-based Tweaked codebook with ciphertext Stealing)

Section titled “XTS (XEX-based Tweaked codebook with ciphertext Stealing)”

Modo especializado para criptografia de disco. Projetado para cifrar setores individuais de forma independente, permitindo acesso aleatório a qualquer bloco do disco sem precisar decifrar tudo. Usa duas chaves distintas combinadas com o endereço do setor (chamado tweak).

  • Vantagens: acesso aleatório, cada setor cifrado é independente, resistente a ataques por manipulação de blocos
  • Desvantagens: não oferece autenticidade por si só (um atacante pode alterar bits do disco sem ser detectado), por isso é geralmente combinado com verificações de integridade em outra camada
  • Status: padrão em LUKS (Linux), BitLocker (Windows) e FileVault (macOS)
  • Observação: a chave AES-XTS-512 é na verdade duas chaves de 256 bits concatenadas, resultando em 256 bits de segurança efetiva

CFB (Cipher Feedback) e OFB (Output Feedback)

Section titled “CFB (Cipher Feedback) e OFB (Output Feedback)”

Modos clássicos que também transformam cifras de bloco em cifras de fluxo, mas de formas diferentes do CTR. Hoje são raramente escolhidos para novos projetos, pois o CTR e o GCM oferecem desempenho e segurança superiores.

  • CFB: realimenta o texto cifrado anterior na próxima operação, similar ao CBC mas sem exigir padding
  • OFB: realimenta a saída do algoritmo (não o texto cifrado), gerando um keystream independente do texto
  • Status: funcionais, mas em desuso

Outro modo AEAD, combina CTR para cifragem com CBC-MAC para autenticação. É mais lento que o GCM, mas tem implementações compactas, úteis em dispositivos embarcados.

  • Status: usado no Wi-Fi WPA2 (AES-CCMP) e em protocolos IoT como Zigbee

Modo AEAD moderno projetado para ser resistente ao reuso de nonce. Diferentemente do GCM e do CCM, repetir o nonce com o SIV não é catastrófico (no pior caso, revela apenas que duas mensagens eram iguais).

  • Status: recomendado em cenários nos quais garantir unicidade de nonce é difícil, como gerenciamento de chaves (AES-GCM-SIV é uma variante popular)
ModoAutenticadoParalelizávelPadding?Status atual
ECBNãoSimSimInseguro, evitar
CBCNãoSó decifragemSimLegado, superado por GCM
CFBNãoSó decifragemNãoEm desuso
OFBNãoNãoNãoEm desuso
CTRNãoSimNãoSeguro, base do GCM
GCMSimSimNãoPadrão recomendado
CCMSimParcialmenteNãoUsado em Wi-Fi WPA2 e IoT
XTSNão (direto)SimNãoPadrão para criptografia de disco
SIVSimSimNãoResistente a reuso de nonce

O AES (Advanced Encryption Standard) é hoje o algoritmo simétrico mais utilizado do mundo. Está presente em praticamente tudo: HTTPS, SSH, VPNs, LUKS, BitLocker, Wi-Fi WPA2 e WPA3, bancos de dados, mensageiros e cofres de senha.

O AES surgiu de uma competição aberta promovida pelo NIST (Estados Unidos) entre 1997 e 2001, com o objetivo de substituir o DES, considerado defasado. Entre quinze candidatos iniciais e cinco finalistas (MARS, RC6, Rijndael, Serpent e Twofish), o algoritmo belga Rijndael, projetado por Vincent Rijmen e Joan Daemen, foi escolhido e padronizado como AES em 2001.

O AES é uma cifra de bloco baseada em uma rede de substituição e permutação (SPN), que opera sobre blocos fixos de 128 bits. A chave pode ter três tamanhos, cada um definindo um número diferente de rodadas de transformação:

VarianteTamanho da chaveNº de rodadas
AES-128128 bits10
AES-192192 bits12
AES-256256 bits14

Cada rodada combina quatro operações matemáticas:

  • SubBytes: substituição baseada em uma S-box
  • ShiftRows: deslocamento das linhas da matriz de estado
  • MixColumns: mistura das colunas
  • AddRoundKey: XOR com uma subchave derivada da chave principal

Processadores modernos da Intel e da AMD possuem instruções dedicadas chamadas AES-NI (AES New Instructions), que executam as operações internas do AES diretamente em silício. Isso permite velocidades de processamento acima de 10 GB/s em um único núcleo moderno, com baixo consumo de energia. ARM e outras arquiteturas também possuem instruções equivalentes.

Após mais de 20 anos de análise pública intensa, nenhum ataque prático contra o AES foi descoberto. Ele é considerado seguro para o futuro previsível, mesmo com margem para a computação quântica no caso do AES-256 (o algoritmo de Grover reduziria sua força efetiva para 128 bits, ainda considerados seguros).

Cifragem de um arquivo com AES-256 em modo CBC:

Terminal window
openssl enc -aes-256-cbc -pbkdf2 \
-in arquivo.txt -out arquivo.enc

Significado de cada opção:

  • enc: subcomando do openssl responsável pela cifragem e decifragem simétrica
  • -aes-256-cbc: define o algoritmo e o modo de operação (AES com chave de 256 bits em modo CBC)
  • -pbkdf2: utiliza PBKDF2 para derivar a chave de cifragem a partir da senha informada
  • -in arquivo.txt: arquivo de entrada com o texto claro
  • -out arquivo.enc: arquivo de saída que receberá o texto cifrado

Cifragem com AES-256 em modo GCM (autenticado):

Terminal window
openssl enc -aes-256-gcm -pbkdf2 \
-in arquivo.txt -out arquivo.enc

As opções são as mesmas do exemplo anterior, com uma única diferença: -aes-256-gcm seleciona o modo GCM, que, além da confidencialidade, protege também a integridade e autenticidade dos dados (modo AEAD).

O ChaCha20 é uma cifra de fluxo projetada por Daniel J. Bernstein em 2008, evolução direta do algoritmo Salsa20 do mesmo autor. É amplamente utilizada em protocolos modernos, especialmente em cenários nos quais o AES não dispõe de aceleração por hardware.

  • Opera sobre uma chave de 256 bits e um nonce de 96 bits
  • Baseado em operações ARX (Add, Rotate, XOR), simples e rápidas em software
  • Executa 20 rodadas de mistura

Na prática, o ChaCha20 é quase sempre combinado com o Poly1305, um código de autenticação de mensagem (MAC). Juntos formam o ChaCha20-Poly1305, um esquema AEAD (Authenticated Encryption with Associated Data) que garante confidencialidade e integridade simultaneamente.

  • TLS 1.3 (uma das três cifras obrigatórias)
  • OpenSSH (preferido em sessões modernas)
  • WireGuard (única cifra utilizada)
  • Signal e outros mensageiros ponta a ponta
  • Dispositivos sem AES-NI (celulares antigos, roteadores, IoT)
  • Implementações puramente em software em linguagens de alto nível
  • Cenários que exigem alta performance com baixo consumo de energia

Cifragem com ChaCha20 em modo stream puro:

Terminal window
openssl enc -chacha20 -pbkdf2 \
-in arquivo.txt -out arquivo.enc

Significado de cada opção:

  • enc: subcomando do openssl responsável pela cifragem e decifragem simétrica
  • -chacha20: define o algoritmo utilizado (ChaCha20 com chave de 256 bits)
  • -pbkdf2: utiliza PBKDF2 para derivar a chave de cifragem a partir da senha informada
  • -in arquivo.txt: arquivo de entrada com o texto claro
  • -out arquivo.enc: arquivo de saída que receberá o texto cifrado

Versão autenticada com Poly1305 (requer OpenSSL recente):

Terminal window
openssl enc -chacha20-poly1305 -pbkdf2 \
-in arquivo.txt -out arquivo.enc

As opções são as mesmas do exemplo anterior, com uma única diferença: -chacha20-poly1305 seleciona o esquema AEAD, que combina a cifragem ChaCha20 com a autenticação Poly1305, garantindo confidencialidade e integridade simultaneamente.

O Triple DES, ou 3DES, é uma extensão do antigo DES criada para prolongar sua utilidade sem exigir mudanças profundas em sistemas que o utilizavam. Ele aplica o DES três vezes consecutivas, no esquema EDE (Encrypt, Decrypt, Encrypt), com até três chaves diferentes.

  • Bloco de 64 bits (herdado do DES)
  • Chave efetiva de 112 bits (com duas chaves) ou 168 bits (com três chaves)
  • Amplamente utilizado em sistemas bancários e protocolos antigos

O 3DES já não é mais considerado seguro para novos projetos. O NIST estabeleceu sua descontinuação oficial em dezembro de 2023. Além da chave efetiva ser menor que a do AES-128, o bloco de 64 bits o torna vulnerável a ataques como o Sweet32 quando grandes volumes de dados são cifrados com a mesma chave.

Ainda assim, o 3DES continua presente em muitos sistemas legados, especialmente no setor financeiro. Em projetos novos, deve ser substituído pelo AES.

O DES (Data Encryption Standard) foi padronizado pelo NIST em 1977, derivado do algoritmo Lucifer da IBM. Foi o primeiro padrão comercial de criptografia e dominou o mercado por quase 25 anos.

  • Chave de apenas 56 bits, hoje quebrável em horas com hardware comum
  • Em 1998 a EFF construiu o Deep Crack, hardware dedicado que quebrou uma chave DES em 56 horas
  • Em 2008 pesquisadores demonstraram quebra em menos de um dia usando FPGAs comerciais

Hoje o DES tem apenas valor histórico e didático. Não deve ser utilizado em nenhum sistema novo.

Blowfish (1993) e Twofish (1998) são algoritmos projetados por Bruce Schneier, criptógrafo e autor de livros como Applied Cryptography.

  • Bloco de 64 bits
  • Chave variável de 32 a 448 bits
  • Ainda encontrado em programas como o bcrypt (função de hash para senhas, não a cifra em si), no OpenSSH (opções legadas) e em alguns protocolos VPN
  • Vulnerável ao mesmo ataque Sweet32 do 3DES devido ao bloco pequeno
  • Bloco de 128 bits (compatível com o AES)
  • Chave de até 256 bits
  • Foi um dos finalistas do concurso AES, perdeu para o Rijndael
  • Considerado tecnicamente seguro, mas pouco adotado em protocolos modernos devido à vitória do AES

Cifra de fluxo criada em 1987 por Ron Rivest. Foi extremamente popular no SSL/TLS 1.0 e no WEP (Wi-Fi), devido à simplicidade e à velocidade. Hoje é considerada quebrada, com vieses estatísticos conhecidos que permitem ataques práticos. Foi oficialmente proibida em TLS a partir de 2015 (RFC 7465).

Desenvolvida em 2000 pela NTT e pela Mitsubishi, no Japão. Possui estrutura e desempenho semelhantes ao AES e é aceita em padrões como TLS, IPsec e OpenPGP. É particularmente usada em sistemas asiáticos como alternativa ao AES.

Finalista do concurso AES, ficou em segundo lugar. É considerada mais conservadora e mais segura que o próprio AES por utilizar 32 rodadas, mas em contrapartida é significativamente mais lenta. Pode ser encontrada em ferramentas como o VeraCrypt.

Projetada em 1991, foi muito utilizada em implementações antigas do PGP. Patenteada até 2012, teve adoção limitada por essa razão. Hoje raramente aparece em sistemas novos.

Padrão chinês de criptografia simétrica, utilizado principalmente dentro da China em ambientes governamentais e corporativos. Padronizado também pela ISO.

AlgoritmoTipoBlocoChaveStatus
AESBloco (SPN)128 bits128, 192, 256Padrão atual, seguro
ChaCha20Fluxo (ARX)n/a256Moderno, seguro
3DESBloco (Feistel)64 bits112 ou 168Descontinuado em 2023
DESBloco (Feistel)64 bits56Obsoleto
BlowfishBloco (Feistel)64 bits32 a 448Legado, bloco pequeno
TwofishBloco (Feistel)128 bits128, 192, 256Seguro, pouco usado
SerpentBloco (SPN)128 bits128, 192, 256Seguro, lento
CamelliaBloco (Feistel)128 bits128, 192, 256Seguro, uso regional
RC4Fluxon/aVariávelQuebrado, proibido
IDEABloco64 bits128Histórico

Para novos projetos, a resposta é curta: AES ou ChaCha20.

CenárioRecomendação
Servidor com AES-NI (x86-64 moderno)AES-256-GCM
Servidor sem aceleração, dispositivo embarcadoChaCha20-Poly1305
Protocolo TLS modernoAES-GCM ou ChaCha20-Poly1305
Criptografia de discoAES-XTS (padrão em LUKS, BitLocker)
VPN modernaChaCha20 (WireGuard) ou AES-GCM
Compatibilidade com sistemas legadosAvaliar substituição planejada

Verificando algoritmos disponíveis no OpenSSL

Section titled “Verificando algoritmos disponíveis no OpenSSL”

Para listar todos os algoritmos simétricos suportados pela sua instalação do OpenSSL:

Terminal window
openssl list -cipher-algorithms

Para ver a velocidade estimada de cada um em sua máquina:

Terminal window
openssl speed -evp aes-256-gcm
openssl speed -evp chacha20-poly1305

Esses testes são úteis tanto para validar se o seu hardware dispõe de aceleração AES-NI quanto para decidir qual algoritmo utilizar em cada contexto.

A escolha de um algoritmo simétrico envolve mais do que simplesmente “pegar o mais recente”. Envolve avaliar o hardware disponível, o protocolo que será utilizado, as restrições regulatórias e a compatibilidade com os sistemas existentes. Felizmente, para a maioria das situações atuais, a resposta converge para AES-256-GCM ou ChaCha20-Poly1305, ambos amplamente auditados, performáticos e autenticados.

No próximo post da série exploraremos os casos de uso da criptografia simétrica, mapeando como esses algoritmos aparecem concretamente em servidores Linux, aplicações corporativas e no dia a dia dos administradores de sistema.