Skip to content

Criptografia Assimétrica - Casos de Uso

A criptografia assimétrica é a tecnologia que estabelece confiança em redes abertas. Sempre que você acessa um site HTTPS, se autentica em um servidor SSH com chaves, assina um documento digital, instala um pacote verificado em uma distribuição Linux ou envia uma mensagem em um aplicativo com criptografia ponta a ponta, está utilizando criptografia assimétrica em alguma camada.

Neste post percorreremos os principais casos de uso da criptografia assimétrica, categorizados por função (autenticação, confidencialidade, integridade e identidade), com foco em como aparecem em servidores Linux e aplicações cotidianas.

Em qualquer conexão HTTPS, o servidor apresenta um certificado digital contendo sua chave pública. O cliente usa essa chave pública para:

  • Verificar a assinatura da autoridade certificadora (CA) sobre o certificado
  • Participar do handshake de troca de chaves (ECDHE geralmente)

Após o handshake, a comunicação propriamente dita é feita com criptografia simétrica (AES-GCM ou ChaCha20-Poly1305).

Terminal window
# Inspecionar o certificado de um site
openssl s_client -connect blog.ferpdias.com.br:443 \
-showcerts </dev/null 2>/dev/null | \
openssl x509 -noout -text

Significado de cada opção:

  • s_client: cliente TLS para teste de servidores
  • -connect <host:porta>: endereço do servidor a conectar
  • -showcerts: exibe toda a cadeia de certificados
  • </dev/null: envia entrada vazia para o cliente desconectar após o handshake
  • 2>/dev/null: descarta mensagens de erro
  • openssl x509 -noout -text: formata a saída do certificado em texto legível

A autenticação por chaves no SSH é um dos usos mais comuns de criptografia assimétrica em servidores Linux. Em vez de senhas, o cliente prova possuir a chave privada correspondente a uma chave pública registrada no servidor.

Terminal window
# Gerar um par de chaves SSH Ed25519
ssh-keygen -t ed25519 -C "fernando@notebook"

Significado de cada opção:

  • ssh-keygen: utilitário do OpenSSH para gerar e manipular chaves
  • -t ed25519: tipo do algoritmo (Ed25519)
  • -C "fernando@notebook": comentário opcional que será incluído no final da chave pública, útil para identificação
Terminal window
# Copiar a chave pública para um servidor remoto
ssh-copy-id usuario@servidor

Significado:

  • ssh-copy-id: utilitário que adiciona a chave pública local ao arquivo ~/.ssh/authorized_keys do servidor remoto, autenticando-se inicialmente com senha

Após essa configuração, as conexões subsequentes usarão apenas as chaves, dispensando a senha.

  • WireGuard: utiliza X25519 obrigatoriamente para autenticação de peers
  • OpenVPN com certificados: usa RSA ou ECDSA para autenticação mútua
  • IPsec em modo de certificados: também baseado em assinaturas digitais
  • JWT (JSON Web Token) assinados com RSA ou ECDSA
  • SAML e OpenID Connect com assinaturas em asserções
  • mTLS (TLS mútuo) para autenticar clientes em APIs e microsserviços

A criptografia assimétrica raramente cifra dados diretamente. Em quase todos os casos práticos, ela é usada para cifrar uma chave simétrica aleatória (chave de sessão), que então cifra o volume de dados. Esse é o modelo híbrido.

Após o handshake:

  1. Cliente e servidor acordam uma chave simétrica via ECDHE
  2. Todo o restante da conexão é cifrado com AES-GCM ou ChaCha20-Poly1305

A chave assimétrica (do certificado) serve apenas para autenticar o servidor e proteger o acordo de chaves, não para cifrar dados.

O PGP (Pretty Good Privacy) e sua implementação livre GPG (GNU Privacy Guard) usam criptografia híbrida:

  1. O e-mail é cifrado com uma chave simétrica aleatória (AES, por exemplo)
  2. Essa chave simétrica é então cifrada com a chave pública do destinatário
  3. O destinatário usa sua chave privada para recuperar a chave simétrica, e então decifra o e-mail
Terminal window
# Gerar um par de chaves GPG
gpg --full-generate-key

Significado:

  • gpg: utilitário do GnuPG
  • --full-generate-key: inicia um assistente interativo que permite escolher algoritmo, tamanho, validade e identidade
Terminal window
# Cifrar um arquivo para um destinatário
gpg --encrypt --recipient fernando@exemplo.com arquivo.txt

Significado de cada opção:

  • --encrypt: operação de cifragem
  • --recipient fernando@exemplo.com: destinatário cuja chave pública (já importada) será usada
  • arquivo.txt: arquivo de entrada; o resultado será arquivo.txt.gpg
Terminal window
# Decifrar o arquivo recebido
gpg --decrypt arquivo.txt.gpg > arquivo.txt

Significado:

  • --decrypt: operação de decifragem usando a chave privada do usuário atual
  • > arquivo.txt: redireciona a saída decifrada para o arquivo original
  • Signal, WhatsApp, Messenger usam o Protocolo Signal, que combina X3DH (acordo de chaves assimétrico inicial) com Double Ratchet (cifragem simétrica com rotação constante de chaves)
  • iMessage: RSA para troca de chaves, AES para cifragem
  • Threema e outros: ECDH para acordo, AES ou XSalsa20 para cifragem

Integridade e autenticidade: assinaturas digitais

Section titled “Integridade e autenticidade: assinaturas digitais”

Praticamente toda distribuição Linux assina seus pacotes com chaves assimétricas, para garantir que:

  • O pacote foi produzido pela equipe oficial
  • Não foi alterado em trânsito ou no espelho (mirror)
Terminal window
# Verificar assinaturas dos pacotes instalados (Debian / Ubuntu)
sudo apt install debsums
sudo debsums -c

Significado de cada comando:

  • apt install debsums: instala a ferramenta debsums, que verifica integridade de pacotes
  • debsums -c: verifica apenas pacotes com problemas (-c significa changed)
Terminal window
# Verificar pacotes RPM (RHEL / Fedora)
rpm -Va

Significado:

  • rpm -V: verifica integridade de pacotes instalados
  • -a: aplica em todos os pacotes

Assinatura de documentos (ICP-Brasil, eIDAS)

Section titled “Assinatura de documentos (ICP-Brasil, eIDAS)”

A assinatura digital com certificados ICP-Brasil (padrão A1 em arquivo ou A3 em token/smartcard) tem validade jurídica no Brasil, conforme a MP 2.200-2/2001. Baseia-se em criptografia assimétrica, geralmente RSA 2048.

Processo típico:

  1. Documento é lido e tem seu hash calculado (SHA-256)
  2. Hash é cifrado com a chave privada do assinante
  3. O par (documento, assinatura) pode ser verificado por qualquer um usando a chave pública (do certificado)
  4. A cadeia de confiança do certificado é validada até a raiz da ICP-Brasil
Terminal window
# Configurar o Git para assinar commits com GPG
git config --global user.signingkey <ID-da-chave>
git config --global commit.gpgsign true
# Fazer um commit assinado
git commit -S -m "Mensagem do commit"

Significado de cada comando:

  • git config --global user.signingkey <ID>: define qual chave GPG usar para assinatura
  • git config --global commit.gpgsign true: ativa assinatura automática em todos os commits
  • git commit -S -m "...": cria um commit explicitamente assinado (opcional se já ativado globalmente)
  • Secure Boot da UEFI usa assinaturas RSA para validar o bootloader
  • Pacotes (.deb, .rpm) incluem assinaturas verificadas pelo gerenciador de pacotes
  • Imagens ISO oficiais vêm acompanhadas de arquivos de assinatura (.sig ou .asc)

Toda a infraestrutura TLS, S/MIME e ICP-Brasil é construída sobre certificados X.509, que são essencialmente blocos assinados contendo:

  • A chave pública da entidade
  • Identidade da entidade (CN, SAN, etc.)
  • Período de validade
  • Assinatura da autoridade certificadora
Terminal window
# Gerar uma CSR (Certificate Signing Request)
openssl req -new -newkey rsa:3072 -nodes \
-keyout servidor.key -out servidor.csr \
-subj "/C=BR/ST=SP/L=São Paulo/O=Exemplo/CN=exemplo.com.br"

Significado de cada opção:

  • req -new: cria uma nova solicitação de certificado
  • -newkey rsa:3072: gera uma nova chave RSA de 3072 bits
  • -nodes: não protege a chave privada com senha (do inglês no DES)
  • -keyout servidor.key: arquivo onde a chave privada será salva
  • -out servidor.csr: arquivo onde a CSR será salva
  • -subj "/C=.../CN=...": campos do titular do certificado, incluindo país (C), estado (ST), localidade (L), organização (O) e nome comum (CN)

O Let’s Encrypt é uma autoridade certificadora gratuita que automatiza a emissão de certificados TLS via protocolo ACME. Internamente, o ACME também usa assinaturas digitais para provar controle sobre domínios e sobre chaves privadas.

Terminal window
# Emitir certificado com Certbot (nginx)
sudo certbot --nginx -d exemplo.com.br

Significado de cada opção:

  • certbot: cliente ACME oficial do Let’s Encrypt
  • --nginx: plugin que configura automaticamente o Nginx
  • -d exemplo.com.br: domínio para o qual o certificado será emitido

Além de commits, o Git permite assinar tags (geralmente usadas para releases):

Terminal window
git tag -s v1.0 -m "Versão 1.0 estável"
git tag -v v1.0

Significado de cada comando:

  • git tag -s <nome>: cria uma tag assinada com GPG
  • -m "...": mensagem anexa
  • git tag -v <nome>: verifica a assinatura de uma tag

Toda criptomoeda moderna depende fortemente de criptografia assimétrica:

  • Bitcoin e Ethereum usam ECDSA sobre a curva secp256k1 para assinar transações
  • Chaves privadas controlam a propriedade de moedas
  • Endereços são derivados das chaves públicas por meio de hashes
  • Assinaturas são usadas em cada transação para provar autoria

Alguns projetos mais recentes adotam Ed25519 (como Solana e Monero) por eficiência.

O padrão WebAuthn permite autenticação em sites e aplicações sem senhas, usando pares de chaves gerados por dispositivos (chaves de segurança como YubiKey, Trusted Platform Modules, biometria):

  • O site conhece apenas a chave pública do usuário
  • O dispositivo mantém a chave privada protegida localmente
  • A autenticação é feita por desafio/resposta assinado

É a base das passkeys adotadas por Apple, Google e Microsoft para substituir senhas.

Caso de usoAlgoritmo típicoFerramentas / Padrões
HTTPSECDSA P-256 ou RSA 3072Nginx, Apache, Caddy, Let’s Encrypt
SSHEd25519 ou ECDSAOpenSSH
VPN modernaX25519 (WireGuard)WireGuard
E-mail cifradoRSA ou ECC via OpenPGPGPG, Enigmail, Thunderbird
Assinatura de pacotesRSA ou ECCAPT, DNF, YUM, Pacman
Assinatura de códigoRSA ou ECDSAGPG, codesign, signtool
Assinatura jurídicaRSA 2048 (ICP-Brasil)tokens A3, software A1
Certificados TLSRSA, ECDSA, Ed25519OpenSSL, cfssl, step-ca
Mensageria ponta a pontaX25519 + AESSignal, WhatsApp, iMessage
CriptomoedasECDSA (secp256k1), Ed25519Bitcoin, Ethereum, Solana
WebAuthn / PasskeysECDSA, Ed25519YubiKey, TPM, Google Password Manager
Blockchain em geralECDSA ou Ed25519diversos protocolos

A criptografia assimétrica aparece em diversas rotinas administrativas:

~/.ssh/authorized_keys
# Verificar chaves SSH do servidor
ls -la ~/.ssh/
# Chaves privadas do usuário: ~/.ssh/id_ed25519, ~/.ssh/id_rsa
# Listar fingerprint de chaves conhecidas
ssh-keygen -lf ~/.ssh/known_hosts
# Importar chave pública de um colaborador no GPG
gpg --import chave_publica.asc
# Listar chaves no chaveiro GPG
gpg --list-keys
# Validar cadeia de certificados de um site
openssl s_client -connect site.exemplo.com:443 -showcerts
# Verificar validade de um certificado local
openssl x509 -in certificado.pem -noout -dates

Significado de cada comando:

  • ssh-keygen -lf <arquivo>: lista o fingerprint das chaves no arquivo
  • gpg --import <arquivo>: importa chaves (públicas ou privadas) no chaveiro local
  • gpg --list-keys: lista chaves públicas no chaveiro
  • openssl x509 -in <cert> -noout -dates: exibe apenas as datas de validade do certificado

A criptografia assimétrica se tornou o cimento invisível da internet. Ela é o mecanismo pelo qual confiamos em servidores que nunca vimos, autenticamos usuários sem compartilhar segredos, assinamos documentos com validade legal e protegemos nossas identidades digitais em dispositivos que nunca interagiram antes.

Entender onde e como ela se aplica é essencial não apenas para administrar sistemas corretamente, mas também para avaliar riscos, projetar arquiteturas e responder a incidentes de segurança. No próximo post faremos um comparativo direto entre criptografia simétrica e assimétrica, consolidando as diferenças entre os dois paradigmas e mostrando por que, na prática, eles são complementares em quase todos os sistemas reais.