Skip to content

Criptografia Simétrica - Conceito e Funcionamento

A criptografia simétrica é a forma mais antiga e também a mais amplamente utilizada de criptografia. Ela está presente em praticamente todos os aspectos da computação moderna: no SSH que usamos para administrar servidores, nos discos cifrados por LUKS, nas comunicações HTTPS depois do handshake inicial, nos backups cifrados e em grande parte do armazenamento em nuvem.

Neste post abrimos a “caixa preta” da criptografia simétrica para entender como ela funciona por dentro: por que depende de uma chave única, como ocorre o processo de cifragem e decifragem, quais são seus elementos essenciais e por que, apesar de todas as suas vantagens, ela carrega um problema fundamental que precisou da invenção da criptografia assimétrica para ser plenamente resolvido.

A criptografia simétrica é definida pelo uso de uma única chave secreta, compartilhada entre as partes que desejam se comunicar. Essa mesma chave é usada tanto para transformar o texto claro em texto cifrado quanto para fazer o processo inverso. Daí o nome “simétrica”: a operação de ida e a de volta usam o mesmo instrumento, de forma espelhada.

Em termos matemáticos, podemos descrever a relação como:

E(K, M) = C
D(K, C) = M

Onde:

  • E é a função de cifragem (encrypt)
  • D é a função de decifragem (decrypt)
  • K é a chave compartilhada
  • M é a mensagem (texto claro)
  • C é o texto cifrado

A característica fundamental é que a chave K é a mesma nas duas operações. Qualquer pessoa que a conheça consegue cifrar e decifrar qualquer mensagem produzida com ela.

O termo vem exatamente dessa relação de espelhamento entre as duas operações. Em contraste, na criptografia assimétrica (que veremos em posts futuros) existem duas chaves diferentes: uma pública e uma privada. O que uma cifra, apenas a outra decifra. Não há mais simetria entre as operações.

Outros nomes equivalentes para criptografia simétrica são:

  • Criptografia de chave secreta (secret key cryptography)
  • Criptografia de chave compartilhada
  • Criptografia convencional (termo mais antigo, hoje em desuso)

O processo de uso da criptografia simétrica pode ser dividido em três etapas fundamentais.

Antes de qualquer troca de mensagens, emissor e receptor precisam compartilhar a mesma chave secreta por meio de um canal seguro. Esse acordo pode acontecer presencialmente, através de criptografia assimétrica, por protocolos específicos como Diffie-Hellman, ou por qualquer outro mecanismo que impeça terceiros de interceptar a chave.

O emissor pega sua mensagem em texto claro e, usando o algoritmo escolhido junto com a chave compartilhada, gera o texto cifrado:

Texto claro + Chave → Algoritmo de cifragem → Texto cifrado

O texto cifrado pode então ser transmitido ou armazenado com segurança, pois sem a chave ele é apenas uma sequência aparentemente aleatória de bytes.

O receptor, que possui a mesma chave, aplica o algoritmo inverso para recuperar a mensagem original:

Texto cifrado + Chave → Algoritmo de decifragem → Texto claro

Se a chave estiver correta, a mensagem original é integralmente recuperada. Se estiver errada, o resultado será lixo aleatório ou um erro de autenticação, dependendo do modo de operação utilizado.

Para que o esquema funcione, quatro elementos precisam estar bem definidos.

Ela é o segredo que sustenta toda a segurança do sistema. Para algoritmos simétricos modernos como o AES, os tamanhos usuais são 128, 192 ou 256 bits. A chave deve ser:

  • Suficientemente longa para resistir à força bruta
  • Aleatória, gerada a partir de uma boa fonte de entropia
  • Única por sessão ou por par de comunicantes, idealmente
  • Mantida em sigilo absoluto pelas partes envolvidas

O algoritmo é a função matemática pública que define como o texto claro, combinado com a chave, se transforma em texto cifrado. Veremos os principais algoritmos simétricos (AES, ChaCha20, 3DES, Blowfish) em detalhe nos próximos posts.

Pelo princípio de Kerckhoffs, a segurança do sistema deve depender apenas do sigilo da chave, nunca do sigilo do algoritmo. Por isso, os algoritmos modernos são públicos, amplamente auditados e implementados em bibliotecas abertas como OpenSSL e libsodium.

Algoritmos como o AES trabalham em blocos de tamanho fixo (128 bits, por exemplo). Para cifrar mensagens de qualquer tamanho, é preciso definir como esses blocos se encadeiam. O modo de operação cuida disso. Alguns modos conhecidos:

  • ECB (Electronic Codebook), inseguro para a maioria dos usos
  • CBC (Cipher Block Chaining), tradicional mas sem autenticação integrada
  • GCM (Galois/Counter Mode), moderno e autenticado
  • CTR (Counter), transforma uma cifra de bloco em uma cifra de fluxo

Esse tema será aprofundado em um post próprio da série.

A maioria dos modos de operação exige um vetor de inicialização (IV) ou nonce, que é um valor aleatório ou único usado junto com a chave para garantir que mensagens idênticas produzam textos cifrados diferentes. O IV não precisa ser secreto, mas em geral precisa ser único por operação, pois sua reutilização pode comprometer a segurança do esquema.

O princípio fundamental: XOR e reversibilidade

Section titled “O princípio fundamental: XOR e reversibilidade”

A base matemática de praticamente toda cifragem simétrica moderna é a operação XOR (ou exclusivo). Ela é especial porque possui uma propriedade quase mágica: aplicá-la duas vezes com o mesmo valor devolve o dado original.

A XOR B = C
C XOR B = A

Vamos ver isso na prática. Considere o caractere A, cujo valor em binário é 01000001, e uma chave simples de um byte igual a 00111010:

Texto claro : 01000001 (letra 'A' = 0x41)
Chave : 00111010 (0x3A)
--------
Texto cifrado: 01111011 (0x7B = caractere '{')

Para decifrar, basta aplicar XOR novamente com a mesma chave:

Texto cifrado: 01111011
Chave : 00111010
--------
Texto claro : 01000001 (letra 'A' recuperada)

É possível demonstrar isso rapidamente no terminal Linux:

Terminal window
# Representando a letra 'A' em hexadecimal.
# Usamos 'printf' porque ele não adiciona nova linha ao final.
# Se usarmos 'echo' sem a opção -n, aparecerá um "0a" extra
# correspondente ao caractere de nova linha (saída: 410a).
printf 'A' | xxd -p
# saída: 41
# Equivalente com echo (opção -n suprime o newline)
echo -n 'A' | xxd -p
# saída: 41
# Aplicando XOR com a chave 0x3A
python3 -c "print(hex(0x41 ^ 0x3A))"
# saída: 0x7b (correspondente ao caractere '{')
# Decifrando com a mesma chave
python3 -c "print(hex(0x7b ^ 0x3A))"
# saída: 0x41 (de volta ao 'A')

Essa é a essência da reversibilidade na criptografia simétrica. Algoritmos modernos como o AES fazem muito mais do que um simples XOR (combinam substituições, permutações, misturas de colunas e múltiplas rodadas de transformação), mas a propriedade de reversibilidade com a mesma chave permanece.

Vejamos um fluxo completo de cifragem simétrica usando o openssl com AES-256 em modo CBC.

Primeiro, criamos um arquivo com o texto claro:

Terminal window
echo "Esta é uma mensagem confidencial" > mensagem.txt

Em seguida, cifragem com AES-256 no modo CBC, usando derivação de chave por PBKDF2 e sal:

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

Significado de cada opção:

  • enc: subcomando do openssl responsável pela cifragem e decifragem simétrica de arquivos
  • -aes-256-cbc: define o algoritmo e o modo de operação (AES com chave de 256 bits no modo CBC)
  • -pbkdf2: utiliza a função PBKDF2 para derivar a chave de cifragem a partir da senha informada, prática muito mais segura que o KDF padrão antigo do OpenSSL
  • -salt: adiciona um valor aleatório (sal) ao processo de derivação da chave, impedindo que senhas iguais produzam a mesma chave e dificultando ataques por tabela pré-calculada
  • -in mensagem.txt: arquivo de entrada contendo o texto claro
  • -out mensagem.enc: arquivo de saída que receberá o texto cifrado

Após a cifragem, podemos inspecionar o conteúdo do arquivo gerado, que será uma sequência binária aparentemente aleatória:

Terminal window
xxd mensagem.enc | head

Para recuperar o conteúdo original, usamos o mesmo algoritmo com a opção de decifragem:

Terminal window
openssl enc -aes-256-cbc -pbkdf2 -d \
-in mensagem.enc \
-out mensagem_recuperada.txt

Significado de cada opção:

  • enc: mesmo subcomando utilizado para cifrar
  • -aes-256-cbc: mesmo algoritmo e modo utilizados na cifragem (precisam coincidir, caso contrário a decifragem falha)
  • -pbkdf2: mesma função de derivação de chave utilizada na cifragem
  • -d: indica a operação de decifragem (sem essa opção, o padrão do subcomando enc é cifrar)
  • -in mensagem.enc: arquivo de entrada com o texto cifrado
  • -out mensagem_recuperada.txt: arquivo de saída com o texto claro recuperado

Finalmente, conferimos o conteúdo recuperado:

Terminal window
cat mensagem_recuperada.txt

Note que a mesma senha (transformada em chave via PBKDF2) é utilizada nas duas operações. Essa é a essência da simetria: a chave de ida é a mesma de volta.

O problema fundamental: distribuição da chave

Section titled “O problema fundamental: distribuição da chave”

O modelo simétrico funciona perfeitamente desde que as duas partes já tenham a chave. Mas como a chave chega até o receptor?

Essa pergunta aparentemente simples é o problema fundamental da criptografia simétrica. Imagine que Alice queira enviar uma mensagem cifrada a Bob pela internet:

  1. Ela precisa que Bob tenha a mesma chave que ela.
  2. Se enviar a chave pela mesma rede, qualquer atacante na rota pode capturá-la.
  3. Se cifrar a chave antes de enviar, precisaria de outra chave para fazer isso, criando um problema recursivo.

Esse paradoxo foi um dos grandes obstáculos à expansão da criptografia durante décadas. Enquanto a comunicação se restringia a militares, diplomatas e grandes corporações, era viável trocar chaves presencialmente, por mensageiros ou por canais fisicamente seguros. Mas em uma internet aberta, com bilhões de usuários trocando mensagens entre si, essa abordagem é inviável.

A solução prática ao problema de distribuição envolve duas abordagens principais, utilizadas em conjunto:

  1. Troca Diffie-Hellman: um protocolo matemático engenhoso em que duas partes conseguem acordar uma chave simétrica em comum sem jamais transmiti-la pela rede, mesmo que toda a comunicação seja observada por um atacante.

  2. Criptografia assimétrica: cada parte possui um par de chaves (pública e privada). A chave simétrica é cifrada com a chave pública do destinatário e enviada com segurança. Esse modelo deu origem ao conceito de criptografia híbrida, usado em TLS, SSH, PGP e praticamente todos os protocolos seguros modernos.

Em outras palavras, a criptografia assimétrica resolve a distribuição da chave, mas a cifragem efetiva dos dados continua sendo feita por criptografia simétrica, que é muito mais rápida.

Apesar da limitação de distribuição, a criptografia simétrica tem vantagens que a tornam insubstituível em muitos cenários:

  • Velocidade: algoritmos simétricos modernos processam gigabytes por segundo em hardware comum, com aceleração dedicada no processador (instruções AES-NI em CPUs Intel e AMD recentes).
  • Baixo consumo de recursos: ideal para dispositivos com pouca capacidade, como roteadores, sensores IoT e sistemas embarcados.
  • Chaves pequenas: 128 ou 256 bits oferecem segurança excelente, enquanto a assimétrica precisa de milhares de bits para níveis comparáveis.
  • Simplicidade de implementação: os algoritmos são bem documentados e amplamente disponíveis em bibliotecas padrão de qualquer linguagem.

Por isso, mesmo em protocolos que começam com uma troca assimétrica, o volume real de dados sempre acaba sendo cifrado simetricamente. Essa é a essência da criptografia híbrida apresentada no post sobre tipos de criptografia.

Além do problema de distribuição, a criptografia simétrica apresenta outras limitações estruturais:

  • Escala quadrática de chaves: para N participantes, são necessárias cerca de N × (N − 1) / 2 chaves distintas se cada par precisar de uma chave própria. Em uma rede com 100 pessoas, isso significa quase 5 mil chaves para gerenciar.
  • Ausência de identidade intrínseca: como as duas partes compartilham a mesma chave, ela sozinha não permite provar quem gerou determinada mensagem. Para isso é preciso recorrer a criptografia assimétrica (assinatura digital).
  • Comprometimento concentrado: se o segredo compartilhado vazar, todas as mensagens passadas e futuras cifradas com ele ficam vulneráveis. Protocolos modernos mitigam isso com rotação frequente de chaves e técnicas de forward secrecy.

Essas limitações não desqualificam a criptografia simétrica. Elas apenas definem onde cada abordagem se encaixa melhor dentro de um sistema maior.

A criptografia simétrica é a base silenciosa de praticamente todo o sigilo digital que experimentamos no dia a dia. Ela é rápida, eficiente, matematicamente elegante e dispõe de algoritmos extremamente robustos, como o AES e o ChaCha20. Seu único grande “calcanhar de Aquiles” é o problema da distribuição de chaves, resolvido na prática pela combinação com criptografia assimétrica no modelo híbrido.

No próximo post da série, veremos os principais algoritmos simétricos em uso hoje: o AES com suas variantes de 128, 192 e 256 bits, o ChaCha20, o 3DES (ainda presente em sistemas legados) e as razões pelas quais o DES, o Blowfish e outros algoritmos clássicos caíram em desuso. Em seguida, aprofundaremos os modos de operação, as técnicas de derivação de chaves a partir de senhas e exemplos práticos adicionais de uso em Linux.