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-keyproduz 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 -ae envie-a. O outro lado importa comgpg --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
Nunca compartilhe sua chave privada (--export-secret-keys). Sempre distribua a chave pública (--export). Uma chave privada vazada permite que outros descriptografem seu texto cifrado e forjem assinaturas em seu nome.
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 -bcria um arquivo de assinatura separado;--verifyo 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."