Fundamentos de GPG: Criptografando, Descriptografando e Assinando Arquivos

Fundamentos de GPG: Criptografando, Descriptografando e Assinando Arquivos

O Que Você Vai Aprender

  • Como criptografar e descriptografar arquivos com gpg
  • Quando usar modo de chave pública vs modo de senha (simétrico)
  • Como assinar arquivos e verificar contra adulteração

Resumo Rápido

  • Proteger com uma senha que você compartilha -> gpg -c (simétrico / modo de senha)
  • Enviar para alguém usando a chave pública dessa pessoa -> gpg -e -r <destinatario> (modo de chave pública)
  • Provar que um arquivo não foi alterado -> gpg -b (assinatura destacada)

Pré-requisitos

  • SO: Ubuntu / família Debian (apt install gnupg). Incluso por padrão na maioria das distros.
  • O nome do comando é gpg (GnuPG 2.x assumido).

O que é GPG?

Conclusão: GPG é a implementação GnuPG do OpenPGP. Criptografia torna dados ilegíveis; assinatura detecta adulteração.

GPG (GnuPG, GNU Privacy Guard) implementa o padrão OpenPGP (RFC 4880). Ele faz duas coisas principais:

  • Criptografar / descriptografar: manter o conteúdo longe de terceiros
  • Assinar / verificar: provar quem criou um arquivo e que ele não foi alterado

A criptografia vem em dois modos. O modo de chave pública criptografa com a chave pública do destinatário, de forma que apenas a chave privada dele possa descriptografar. O modo de senha (simétrico) usa uma única passphrase para criptografia e descriptografia. Comecamos com o modo de senha porque não requer configuração de chaves.

Como criptografar apenas com senha?

Conclusão: A opção mais simples é gpg -c. Criptografa com uma passphrase que você digita e descriptografa com a mesma passphrase -- sem necessidade de par de chaves.

Não é necessário criar chaves. Use -c (--symmetric) para criptografar com uma passphrase.

$ gpg -c secret.txt

Você será solicitado a digitar uma passphrase, e secret.txt.gpg (binário) é criado. O original permanece no lugar, então exclua-o separadamente se não precisar dele.

Descriptografe com -d (--decrypt).

$ gpg -d secret.txt.gpg

O conteúdo é impresso na saída padrão. Para gravar em um arquivo, use -o.

$ gpg -o secret.txt -d secret.txt.gpg

Quando você precisa de uma forma em texto que possa colar em email ou chat, adicione -a (--armor). Você obtém secret.txt.asc, um formato ASCII (Base64).

$ gpg -c -a secret.txt

O modo de senha assume que você pode entregar a passphrase de forma segura. Enviar o texto cifrado e a senha lado a lado no mesmo chat anula o propósito. Se a troca de chaves é difícil, use o modo de chave pública abaixo.

Como configurar o modo de chave pública?

Conclusão: Crie um par de chaves primeiro. gpg --full-generate-key produz uma chave privada (sua) e uma chave pública (para distribuir).

O modo de chave pública usa um par: uma chave pública para criptografia e uma chave privada para descriptografia. Crie-o primeiro.

$ gpg --full-generate-key

Você será perguntado interativamente sobre tipo de chave, tamanho, expiração, nome e email. Os padrões (RSA, 3072 bits ou maior) são adequados. Por fim, defina uma passphrase. Esta protege a chave privada -- um papel diferente de uma senha de criptografia.

Liste suas chaves com:

$ gpg --list-keys          # chaves publicas
$ gpg --list-secret-keys   # chaves privadas

A longa string hexadecimal é o ID da chave / fingerprint. Você a usa para especificar destinatários posteriormente.

Como compartilhar sua chave pública?

Conclusão: Exporte sua chave pública como texto com gpg --export -a e envie-a. O outro lado importa com gpg --import.

Para permitir que alguém criptografe para você, forneça sua chave pública. Adicione -a ao --export para torná-la texto.

$ gpg --export -a "you@example.com" > my-pubkey.asc

Eles importam:

$ gpg --import my-pubkey.asc

Como criptografar e descriptografar com chave pública?

Conclusão: gpg -e -r <destinatario> criptografa com a chave pública do destinatário. Apenas esse destinatário pode descriptografar.

Depois de importar a chave pública do destinatário, criptografe com -e (--encrypt) e -r (--recipient).

$ gpg -e -r "friend@example.com" report.pdf

Isso cria report.pdf.gpg, que apenas o detentor da chave privada de friend@example.com pode descriptografar. Ele executa:

$ gpg -d report.pdf.gpg > report.pdf

Para poder ler você mesmo depois, adicione-se como destinatário também (-r pode ser repetido).

$ gpg -e -r "friend@example.com" -r "you@example.com" report.pdf

Adicione -a para uma saída em formato texto.

$ gpg -e -a -r "friend@example.com" message.txt   # message.txt.asc

Como verificar integridade com uma assinatura?

Conclusão: Para provar autenticidade sem ocultar o conteúdo, assine em vez de criptografar. gpg -b cria um arquivo de assinatura separado; --verify o verifica.

Assinar é diferente de criptografar. O conteúdo permanece legível, enquanto a assinatura prova que foi feita pelo assinante e não foi alterada. É comum para verificar a autenticidade de arquivos distribuídos.

A forma mais prática é uma assinatura destacada. Use -b (--detach-sign) para criar um arquivo de assinatura separado do original.

$ gpg -b -a release.tar.gz

Isso cria release.tar.gz.asc. Distribua-o junto com o original. O destinatário verifica com --verify.

$ gpg --verify release.tar.gz.asc release.tar.gz

Uma linha Good signature significa que a verificação foi bem-sucedida com a chave pública do assinante e o arquivo está intacto.

Assinatura e criptografia podem ser combinadas: -s -e -r <destinatario> produz saída assinada e criptografada. --clearsign incorpora uma assinatura em texto legível, frequentemente usado em corpos de email.

Mesmo uma Good signature não confirma que a chave pública realmente pertence ao remetente. Verifique onde você obteve a chave (um fingerprint de site oficial, etc.). A verificação apenas prova "assinado com aquela chave."

Resumo: Folha de Referência de Comandos

Conclusão: Modo de senha é -c, modo de chave pública é -e -r, assinatura é -b. Adicione -a para saída em texto e -d para descriptografar -- isso cobre o uso diário.

Objetivo Comando
Criptografar com senha gpg -c file
Criptografar com chave pública gpg -e -r <ID> file
Descriptografar gpg -d file.gpg
Criar um par de chaves gpg --full-generate-key
Exportar uma chave pública gpg --export -a <ID>
Importar uma chave pública gpg --import key.asc
Criar assinatura destacada gpg -b -a file
Verificar uma assinatura gpg --verify file.asc file