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.
O que é criptografia simétrica?
Section titled “O que é criptografia simétrica?”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) = CD(K, C) = MOnde:
- 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.
Por que “simétrica”?
Section titled “Por que “simétrica”?”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)
Funcionamento básico
Section titled “Funcionamento básico”O processo de uso da criptografia simétrica pode ser dividido em três etapas fundamentais.
1. Acordo prévio da chave
Section titled “1. Acordo prévio da chave”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.
2. Cifragem no emissor
Section titled “2. Cifragem no emissor”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 cifradoO 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.
3. Decifragem no receptor
Section titled “3. Decifragem no receptor”O receptor, que possui a mesma chave, aplica o algoritmo inverso para recuperar a mensagem original:
Texto cifrado + Chave → Algoritmo de decifragem → Texto claroSe 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.
Os elementos essenciais
Section titled “Os elementos essenciais”Para que o esquema funcione, quatro elementos precisam estar bem definidos.
A chave
Section titled “A chave”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
Section titled “O algoritmo”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.
O modo de operação
Section titled “O modo de operação”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.
IV ou nonce
Section titled “IV ou nonce”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 = CC XOR B = AVamos 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: 01111011Chave : 00111010 --------Texto claro : 01000001 (letra 'A' recuperada)É possível demonstrar isso rapidamente no terminal Linux:
# 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 0x3Apython3 -c "print(hex(0x41 ^ 0x3A))"# saída: 0x7b (correspondente ao caractere '{')
# Decifrando com a mesma chavepython3 -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.
Um fluxo prático em Linux
Section titled “Um fluxo prático em Linux”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:
echo "Esta é uma mensagem confidencial" > mensagem.txtEm seguida, cifragem com AES-256 no modo CBC, usando derivação de chave por PBKDF2 e sal:
openssl enc -aes-256-cbc -pbkdf2 -salt \ -in mensagem.txt \ -out mensagem.encSignificado de cada opção:
enc: subcomando doopensslresponsá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:
xxd mensagem.enc | headPara recuperar o conteúdo original, usamos o mesmo algoritmo com a opção de decifragem:
openssl enc -aes-256-cbc -pbkdf2 -d \ -in mensagem.enc \ -out mensagem_recuperada.txtSignificado 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 subcomandoencé 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:
cat mensagem_recuperada.txtNote 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:
- Ela precisa que Bob tenha a mesma chave que ela.
- Se enviar a chave pela mesma rede, qualquer atacante na rota pode capturá-la.
- 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.
Soluções modernas
Section titled “Soluções modernas”A solução prática ao problema de distribuição envolve duas abordagens principais, utilizadas em conjunto:
-
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.
-
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.
Quando a criptografia simétrica brilha
Section titled “Quando a criptografia simétrica brilha”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.
Limitações inerentes ao modelo
Section titled “Limitações inerentes ao modelo”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.
Considerações Finais
Section titled “Considerações Finais”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.
