2026-01-13 00:00
#!/intro
A maioria das plataformas de mensagens que utilizamos, como o correio eletrónico, não garante, por desenho, a confidencialidade do conteúdo das mensagens trocadas. Mesmo quando existem mecanismos de proteção no transporte, como TLS, essas garantias tendem a ficar limitadas ao trajeto entre pontos específicos e não ao ciclo completo das mensagens. O conteúdo pode ficar armazenado em servidores intermédios, ser reencaminhado, copiado ou analisado por terceiros com acesso ao sistema. Em paralelo, a ausência de uma prova criptográfica de autoria deixa espaço para a falsificação da identidade do remetente e para o comprometimento da integridade da mensagem, sem que o destinatário o consiga detetar com fiabilidade.
O Pretty Good Privacy (PGP) foi concebido para suprir estas lacunas. A assinatura digital fornece autenticidade e integridade, permitindo confirmar que a mensagem foi produzida por uma chave específica e que não foi modificada. A cifra fornece confidencialidade, garantindo que apenas os destinatários previstos conseguem ler o conteúdo. Na prática, as duas operações são normalmente combinadas. A assinatura fixa uma prova verificável de autoria e integridade. A cifra limita a exposição do conteúdo a terceiros que controlem o canal ou o armazenamento. O objetivo do PGP é deslocar as garantias para o próprio conteúdo, reduzindo a dependência do canal e dos intermediários. (ver também: PGP: identidade e confiança em ambientes descentralizados)
O OpenPGP é o padrão aberto que define os formatos e os mecanismos necessários para cifra e assinatura de dados, bem como a estrutura de chaves e certificados usados para distribuir chaves públicas. O GnuPG é uma implementação amplamente utilizada desse padrão. É o GnuPG que vamos utilizar para gerir as chaves, consultar impressões digitais e executar as operações de assinatura, verificação, cifra e decifra.
> pgp
O PGP assenta em criptografia assimétrica: cada utilizador cria um par de chaves, composto por uma chave pública e uma chave privada. A chave pública é distribuída e pode ser divulgada sem risco direto. A chave privada é mantida sob controlo exclusivo e não deve sair do domínio do titular.
As funções das chaves diferem. Para assegurar a confidencialidade, o emissor cifra a mensagem com a chave pública do destinatário, de modo a que apenas o titular da chave privada correspondente a consiga decifrar. Para garantir autenticidade e integridade, o emissor assina a mensagem com a sua chave privada. Qualquer destinatário pode verificar a assinatura com a chave pública correspondente. Assim, a cifra protege o conteúdo contra leitura não autorizada, e a assinatura permite confirmar a autoria e detetar adulterações.
Na prática, o PGP combina ambas as operações. O emissor pode assinar a mensagem e cifrar o seu conteúdo. Deste modo, mesmo que a mensagem circule ou fique armazenada em sistemas intermédios, o conteúdo permanece ilegível para terceiros e a sua integridade pode ser verificada.
Do ponto de vista da segurança operacional, a distribuição de chaves públicas exige validação da identidade associada, idealmente através da verificação da impressão digital por um canal independente, para mitigar ataques de substituição de chave. A chave privada deve permanecer sob controlo exclusivo do titular e ser protegida contra extração e utilização não autorizada, tipicamente com palavra-passe e, quando aplicável, com armazenamento em dispositivo criptográfico.
> criação
O modo mais simples de criar um par de chaves é usar o assistente interativo. Permite escolher o tipo de chave, definir a sua validade e associá-la a uma identidade. No final, é solicitada uma palavra-passe para proteger a chave privada em repouso, caso os ficheiros do porta-chaves sejam copiados.
Em configurações modernas, é habitual existir uma chave primária e uma ou mais subchaves. A chave primária é usada para certificação e gestão do conjunto. A sua função é servir de âncora de confiança da identidade. É usada para assinar e validar os identificadores da própria chave, como o nome e o endereço de email, e para certificar as subchaves, ligando-as de forma criptográfica à chave principal. As subchaves são usadas na operação corrente, tipicamente para assinatura, autenticação e cifra, sem expor a chave primária.
Para usar o assistente, execute o GnuPG com a opção --full-generate-key. A opção --expert acrescenta escolhas adicionais, por exemplo tipos de chave e parâmetros menos comuns.
gpg --expert --full-generate-key
Em alternativa, é possível criar a chave primária de forma não interativa com --quick-generate-key:
gpg --quick-generate-key \
"Nome (Chave exemplo) <[email protected]>" \
ed25519 \
cert \
2y
Neste exemplo, é criada uma chave primária Ed25519 com capacidade de certificação (cert) e validade de dois anos (2y). Esta abordagem é útil quando se pretende criar a chave de forma mais direta ou automatizável, sem percorrer todo o assistente interativo.
Vamos criar primeiro a chave primária usando o assistente.
Na seleção do tipo de chave, define-se simultaneamente o algoritmo criptográfico a usar e as capacidades associadas. O algoritmo determina a família matemática e os parâmetros base, por exemplo RSA, DSA, ElGamal ou ECC. As capacidades definem para que fins a chave poderá ser utilizada, como certificar, assinar, cifrar e, nalguns casos, autenticar.
Neste exemplo selecionamos a opção 11:
Selecione o tipo de chave desejado:
(1) RSA e RSA
(2) DSA e ElGamal
(3) DSA (apenas para assinar)
(4) RSA (apenas para assinar)
(7) DSA (definir capacidades)
(8) RSA (definir capacidades)
(9) ECC (assinar e cifrar) *pré-definição*
(10) ECC (apenas para assinar)
(11) ECC (definir capacidades)
(13) Chave existente
(14) Chave existente em cartão
Opção? 11
Neste exemplo selecionamos a opção 11, “ECC (definir capacidades)”. Esta escolha indica que a chave a criar usará criptografia de curva elíptica e que, em seguida, iremos escolher explicitamente para que fins a chave poderá ser usada. No caso de uma chave primária destinada à certificação, o objetivo é ativar apenas a capacidade de certificar, deixando a assinatura, a autenticação e a cifra para subchaves, usadas na operação corrente.
Em seguida, deixamos ativa apenas a ação criptográfica Certificar:
Ações possíveis para esta chave ECC: Assinar Certificar Autenticar
Ações permitidas atualmente: Assinar Certificar
(S) Alternar a capacidade de assinar
(A) Alternar a capacidade de autenticação
(T) Terminado
Opção? S
Ações possíveis para esta chave ECC: Assinar Certificar Autenticar
Ações permitidas atualmente: Certificar
(S) Alternar a capacidade de assinar
(A) Alternar a capacidade de autenticação
(T) Terminado
Opção? T
Depois de escolhido o tipo, o assistente solicita parâmetros específicos do algoritmo. No caso do RSA, pede o tamanho da chave em bits. No caso do ECC, pede a curva elíptica.
Selecione a curva elíptica:
(1) Curve 25519 *pré-definição*
(2) Curve 448
(3) NIST P-256
(4) NIST P-384
(5) NIST P-521
(6) Brainpool P-256
(7) Brainpool P-384
(8) Brainpool P-512
(9) secp256k1
Opção? 1
Para este exemplo, escolhemos a opção (1) Curve 25519. Na prática, esta escolha traduz-se normalmente em Ed25519 para operações de assinatura e certificação, e Curve25519 para operações de cifra. É uma opção comum pois oferece segurança forte com chaves pequenas e bom desempenho, além de ter uma implementação amplamente auditada.
É também solicitado um prazo de validade. Quando essa data é atingida, a chave fica assinalada como expirada e deixa de poder ser usada em novas operações, até ser renovada. Esta prática reduz o período de exposição em caso de compromisso e incentiva a rotação regular.
Neste exemplo, cria-se uma chave sem prazo de validade:
Especifique quando a chave expira.
0 = chave não expira
<n> = chave expira em n dias
<n>w = chave expira em n semanas
<n>m = chave expira em n meses
<n>y = chave expira em n anos
Quando expira a chave? (0)
A chave não expira
Isto está correto? (s/N) s
A criação de uma chave sem prazo de validade pode ser aceitável em exemplos ou em contextos muito controlados, mas não deve ser a prática normal em ambientes operacionais. Para uso real, é recomendável definir validade limitada e planear a renovação. O exemplo anterior com --quick-generate-key usa uma validade de dois anos precisamente para ilustrar uma configuração mais adequada a uso corrente.
A seguir, o assistente pede os campos de identidade. Normalmente, nome e endereço de email. Pode também incluir um comentário para distinguir chaves quando o mesmo nome ou o mesmo endereço de email é utilizado.
O GnuPG precisa de construir uma ID de utilizador para identificar a sua chave.
Nome verdadeiro: Nome
Endereço de email: [email protected]
Comentário: Chave exemplo
Selecionou este USER-ID:
"Nome (Chave exemplo) <[email protected]>"
Alterar (N)ome, (C)omentário, (E)ndereço, ou (O)k/(S)air? O
Por fim, é solicitada uma palavra-passe para proteger a chave privada armazenada, de modo que a cópia dos ficheiros do porta-chaves não seja suficiente para usar a chave.
Durante a geração, o sistema recolhe entropia para alimentar o gerador de números aleatórios, crítico para a segurança do par de chaves.
Depois de concluir, confirme que a chave secreta existe no porta-chaves local.
gpg --list-secret-keys --keyid-format=long
Exemplo de saída depois da criação da chave primária apenas com capacidade de certificação:
sec ed25519/<KEYID-PRIMARIA> 2026-01-01 [C]
<FINGERPRINT-PRIMARIA>
uid [ plena ] Nome (Chave exemplo) <[email protected]>
Nesta fase, a chave primária existe, mas ainda não foram criadas as subchaves operacionais para assinatura, autenticação ou cifra.
> adicionar_subchaves
Depois de criada a chave primária, podem ser adicionadas subchaves para as operações correntes. Esta separação permite preservar a chave primária para funções de certificação e gestão, usando subchaves para assinar, autenticar ou cifrar.
Para adicionar uma subchave de assinatura:
gpg --quick-add-key <FINGERPRINT-PRIMARIA> ed25519 sign 2y
Para adicionar uma subchave de autenticação:
gpg --quick-add-key <FINGERPRINT-PRIMARIA> ed25519 auth 2y
Para adicionar uma subchave de cifra:
gpg --quick-add-key <FINGERPRINT-PRIMARIA> cv25519 encrypt 2y
Nestes comandos, <FINGERPRINT-PRIMARIA> deve ser substituído pela impressão digital completa da chave primária. O valor 2y define uma validade de dois anos para cada subchave.
Depois de criar as subchaves, confirme novamente o estado da chave secreta:
gpg --list-secret-keys --keyid-format=long
Exemplo de saída:
sec ed25519/<KEYID-PRIMARIA> 2026-01-01 [C]
<FINGERPRINT-PRIMARIA>
uid [ plena ] Nome (Chave exemplo) <[email protected]>
ssb ed25519/<KEYID-SUB-S> 2026-01-01 [S] [expira: 2028-01-01]
ssb ed25519/<KEYID-SUB-A> 2026-01-01 [A] [expira: 2028-01-01]
ssb cv25519/<KEYID-SUB-E> 2026-01-01 [E] [expira: 2028-01-01]
sec: chave primária Ed25519 destinada a certificação[C]. É identificada pelo<KEYID-PRIMARIA>e pela impressão digital<FINGERPRINT-PRIMARIA>.uid: identidade associada à chave. Inclui o nome do titular e o endereço de correio eletrónico. O indicadorplenasignifica que, no modelo de confiança local, este UID é considerado válido.ssb [S]: subchave Ed25519 para assinatura. É usada para assinar mensagens e ficheiros. É identificada por<KEYID-SUB-S>.ssb [A]: subchave Ed25519 para autenticação. Pode ser usada, por exemplo, em autenticação SSH através degpg-agent. É identificada por<KEYID-SUB-A>.ssb [E]: subchave Curve25519 para cifra. É usada para cifrar dados e para proteger a chave de sessão usada na cifra do conteúdo. É identificada por<KEYID-SUB-E>.
> tipos_de_chave_o_que_significam_no_assistente
Quando o assistente mostra opções como “RSA e RSA”, está a indicar que a chave primária e a subchave serão ambas RSA. É uma opção ampla e compatível. É adequada quando precisa de interoperabilidade com sistemas antigos. Em contrapartida, as chaves RSA grandes são mais pesadas em operações e em armazenamento.
Quando o assistente oferece opções de ECC, está a propor chaves baseadas em curvas elípticas. Em OpenPGP moderno, é comum usar Ed25519 para assinatura e certificação, e Curve25519 para cifra. Estas opções tendem a oferecer bom desempenho e chaves mais curtas. A compatibilidade é boa em software atual, mas pode falhar em clientes muito antigos.
Opções como DSA e ElGamal pertencem a perfis mais antigos do ecossistema OpenPGP. Em regra, só fazem sentido por compatibilidade com ambientes legacy. Não são a escolha típica para novas chaves.
Se surgir uma opção para “chave existente num cartão”, refere-se a tokens e smartcards. Nesse modelo, a chave privada é gerada e mantida no dispositivo. O computador pede ao token que assine ou decifre, mas não recebe a chave privada. Isto reduz o risco de exfiltração, mas aumenta a dependência do dispositivo e do seu processo de recuperação.
> funcoes_criptograficas_certificacao_assinatura_cifra_autenticacao
Além do algoritmo, interessa a função. Em OpenPGP, a chave primária costuma ter capacidade de certificação. Serve para assinar identificadores da própria chave, certificar subchaves e, quando aplicável, certificar outras chaves. Isto cria um vínculo verificável entre a identidade e as chaves operacionais.
A assinatura digital é usada para autenticar autoria e integridade de mensagens e ficheiros. Na prática, assina-se com uma subchave de assinatura, não com a chave primária, quando se pretende separar funções.
A cifra é usada para confidencialidade. Em OpenPGP, cifra-se o conteúdo com uma chave de sessão simétrica e protege-se essa chave de sessão para os destinatários com a função de cifra das suas chaves públicas. Cada destinatário recupera a chave de sessão com a sua chave privada e decifra o conteúdo.
A autenticação, quando aparece como função, é tipicamente usada para integração com outros mecanismos, como SSH ou certos fluxos de autenticação. Não é necessária para o caso básico de assinar e cifrar correio.
> recomendacao_pratica
Se o objetivo for uso corrente, escolha um perfil moderno. ECC com Ed25519 e Curve25519 é uma escolha robusta quando a compatibilidade com software antigo não é requisito. RSA continua apropriado quando precisa de maximizar compatibilidade, tipicamente com 3072 ou 4096 bits, conforme o seu perfil de risco e desempenho.
Em ambos os casos, defina um prazo de validade e trate a impressão digital como o identificador a validar por canal independente. A validade não substitui a revogação, mas reduz a janela de exposição e obriga a uma gestão mais disciplinada das chaves.
> exportar_chave_publica
Para que outras pessoas possam cifrar mensagens para si ou verificar assinaturas produzidas pela sua chave, é necessário distribuir a chave pública.
Para exportar a chave pública em formato ASCII:
gpg --armor --export [email protected] > publickey.asc
O ficheiro publickey.asc pode ser enviado ao destinatário ou publicado num local controlado. A publicação da chave pública não compromete a chave privada.
No entanto, a distribuição da chave pública não resolve, por si só, o problema da confiança. Quem recebe a chave deve validar a impressão digital por um canal independente antes de assumir que a chave pertence realmente ao titular indicado.
> verificar_a_impressao_digital
A impressão digital é o identificador que deve validar por um canal independente, antes de assumir que uma chave pertence a uma pessoa. Sem esta validação, é possível aceitar uma chave maliciosa e autenticar o autor errado.
gpg --fingerprint [email protected]
Se preferir referir a chave por identificador longo, use o valor apresentado em --list-secret-keys ou --list-keys e consulte a impressão digital correspondente.
gpg --fingerprint ID_LONGO_DA_CHAVE
A impressão digital deve ser comparada fora do canal onde a chave foi recebida. Pode ser validada presencialmente, por chamada de voz, através de um documento assinado, numa página institucional ou por outro meio independente.
> importar_chave_publica
Para cifrar ficheiros para outra pessoa ou verificar assinaturas produzidas por essa pessoa, precisa da respetiva chave pública no seu porta-chaves.
Se recebeu a chave num ficheiro, importe-a:
gpg --import publickey-do-destinatario.asc
Este passo não substitui a validação da impressão digital.
Depois de importar, consulte a impressão digital da chave recebida:
gpg --fingerprint [email protected]
> assinar_um_ficheiro
A assinatura destacada é o caso mais comum. O conteúdo mantém-se em claro. A assinatura fica num ficheiro separado. É o formato típico para distribuir documentos com integridade verificável.
gpg --armor --detach-sign documento.txt
Por omissão, o GnuPG cria documento.txt.asc.
Se quiser forçar o nome de saída:
gpg --armor --output documento.txt.sig --detach-sign documento.txt
Se tiver várias chaves e quiser indicar explicitamente qual deve ser usada para assinar:
gpg --armor \
--local-user [email protected] \
--output documento.txt.sig \
--detach-sign documento.txt
> verificar_uma_assinatura
A verificação confirma se a assinatura corresponde ao conteúdo e se foi produzida pela chave privada associada à chave pública que tem no seu porta-chaves. A saída “Good signature” indica validade criptográfica. Um aviso de confiança significa, em geral, que a assinatura é válida, mas que ainda não estabeleceu confiança na identidade daquela chave. A ação correta é validar a impressão digital por um canal independente.
gpg --verify documento.txt.asc documento.txt
Se tiver usado um nome de saída diferente:
gpg --verify documento.txt.sig documento.txt
> cifrar_um_ficheiro
Para cifrar para um destinatário, precisa da chave pública do destinatário no seu porta-chaves. Se recebeu a chave num ficheiro, importe-a. Este passo não substitui a validação da impressão digital.
gpg --import publickey-do-destinatario.asc
A cifra produz um ficheiro que só pode ser decifrado por quem tiver a chave privada correspondente. O exemplo seguinte gera um ficheiro binário.
gpg --output documento.txt.gpg \
--encrypt \
--recipient [email protected] \
documento.txt
Se quiser produzir saída em ASCII, adequada para copiar ou enviar através de canais que lidam melhor com texto:
gpg --armor \
--output documento.txt.asc \
--encrypt \
--recipient [email protected] \
documento.txt
Se quiser cifrar e assinar no mesmo passo, para obter confidencialidade e autoria verificável:
gpg --output documento.txt.gpg \
--encrypt \
--sign \
--local-user [email protected] \
--recipient [email protected] \
documento.txt
Se também quiser saída em ASCII:
gpg --armor \
--output documento.txt.asc \
--encrypt \
--sign \
--local-user [email protected] \
--recipient [email protected] \
documento.txt
> decifrar_um_ficheiro
Ao decifrar, o GnuPG pede acesso à chave privada e, se aplicável, valida a assinatura embebida. Se a mensagem foi cifrada e assinada, a validação acontece durante a decifra.
gpg --output documento.txt --decrypt documento.txt.gpg
Para conteúdo em ASCII, o comando é idêntico:
gpg --output documento.txt --decrypt documento.txt.asc
A decifra do conteúdo não significa, por si só, que a assinatura seja confiável. Se a mensagem estava assinada, a saída do GnuPG deve ser analisada com atenção, em especial a identidade da chave usada para assinar e a confiança associada a essa chave.
> cifrar_e_decifrar_texto_em_ascii
Para colar em correio eletrónico, é comum produzir saída em ASCII com --armor. O exemplo seguinte cifra e assina texto.
printf "Segue a informação acordada.\n" | \
gpg --armor \
--encrypt \
--sign \
--local-user [email protected] \
--recipient [email protected] \
> mensagem.asc
Para decifrar e, se aplicável, validar a assinatura:
gpg --decrypt mensagem.asc
Este formato é útil quando o conteúdo tem de ser colado diretamente no corpo de uma mensagem ou transportado por sistemas que não preservam bem ficheiros binários.
> revogacao
A validade de uma chave define até quando ela deve ser usada, mas não substitui a revogação. Se a chave privada for comprometida, se a identidade deixar de ser válida ou se a chave deixar de dever ser usada, deve existir forma de publicar uma revogação.
O GnuPG permite gerar um certificado de revogação para a chave primária:
gpg --output revoke.asc \
--gen-revoke <FINGERPRINT-PRIMARIA>
Este ficheiro deve ser guardado com cuidado. Qualquer pessoa que tenha acesso ao certificado de revogação pode usá-lo para marcar a chave como revogada. Por isso, deve ser armazenado de forma segura e separada do porta-chaves de utilização corrente.
Para importar uma revogação:
gpg --import revoke.asc
Depois de importada e distribuída, a revogação permite sinalizar que a chave deixou de ser confiável para utilização futura.
> conclusão
O PGP permite proteger o conteúdo independentemente do canal utilizado. A cifra assegura confidencialidade, a assinatura fornece autenticidade e integridade, e a impressão digital permite validar a associação entre uma chave pública e uma identidade.
A segurança do modelo depende, no entanto, da gestão correta das chaves. A chave privada deve permanecer protegida, as subchaves devem ter validade definida, a impressão digital deve ser confirmada por canal independente e a revogação deve estar prevista antes de ser necessária.
O GnuPG fornece as ferramentas necessárias para aplicar estes mecanismos na prática, mas não elimina a responsabilidade operacional. Usar PGP de forma segura não é apenas saber executar comandos. É compreender o que cada operação protege, que confiança assume e que riscos permanecem quando a gestão das chaves é negligenciada.
> status: draft
> exit 0