#!/intro
A maioria das plataformas de mensagens que utilizamos, como o correio eletrónico, não garante, por desenho, a confidencialidade do conteúdo nas mensagens trocadas. Mesmo quando existem mecanismos de proteção no transporte, como TLS, essas garantias tendem a ser 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 falsificação de identidade do remetente e ao 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.
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: 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 conteudo. 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 associa-la a uma identidade. No final, é solicitada uma palavra-passe para proteger a chave privada em repouso, caso o ficheiro seja copiado.
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 sua identidade. É usada para assinar e validar os identificadores da própria chave, como o nome e o 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 e para 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
Vamos criar primeiro a chave primária.
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 de assinar)
(4) RSA (apenas de assinar)
(7) DSA (defina as suas capacidades)
(8) RSA (defina as suas capacidades)
(9) ECC (de assinar e cifrar) *pré-definição*
(10) ECC (apenas de assinar)
(11) ECC (defina as suas capacidades)
(13) Chave existente
(14) Chave do cartão existente
Sua opção? 11
Neste exemplo selecionamos a opção 11, “ECC (defina as suas 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 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 o capacidade de assinar
(A) Alternar a capacidade de autenticação
(T) Terminado
Sua opção? S
Ações possíveis para esta chave ECC: Assinar Certificar Autenticar
Ações permitidas atualmente: Certificar
(S) Alternar o capacidade de assinar
(A) Alternar a capacidade de autenticação
(T) Terminado
Sua 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 qual a curva elíptica que você deseja:
(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
Sua 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 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 a chave expira? (0)
A chave não expira de forma alguma
Isto está correto? (s/N) s
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 as chaves quando o mesmo nome ou o mesmo endereço de email é utilizado.
O GnuPG precisa construir uma ID de utilizador para identificar sua chave.
Nome verdadeiro: Nome
Endereço de email: nome@dominio.tld
Comentário: Chave exemplo
Você selecionou este USER-ID:
"Nome (Chave exemplo) <nome@dominio.tld>"
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 keychain não seja suficiente para usar a chave.
chaves pública e privada criadas e assinadas.
pub rsa3072 2026-01-05 [SC]
373FFA14A88E3BE475DEDDD27D5F03DCD478E726
uid Nome (Chave exemplo) <nome@dominio.tld>
sub rsa3072 2026-01-05 [E]
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
---------
sec ed25519/<KEYID-PRIMARIA> 2026-01-01 [C]
<FINGERPRINT-PRIMARIA>
uid [ plena ] <Nome titular das chave> <email-titular@dominio.tld>
ssb ed25519/<KEYID-SUB-S> 2026-01-01 [S] [expira: 2030-01-01]
ssb ed25519/<KEYID-SUB-A> 2026-01-01 [A] [expira: 2030-01-01]
ssb cv25519/<KEYID-SUB-E> 2026-01-01 [E] [expira: 2030-01-01]
-
sec: primária Ed25519 destinada a certificação [C]. Criada em 2026-01-01 e 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 seu modelo de confiança local, este UID é considerado válido. -
ssb [S]: Subchave Ed25519 para assinatura. Usada para assinar mensagens e ficheiros. Criada em2026-01-01, válida até2030-01-01e identificada por<KEYID-SUB-S>. -
ssb [A]: Subchave Ed25519 para autenticação. Usada para autenticação com chave, por exemplo em SSH. Criada em2026-01-01, válida até2030-01-01e identificada por<KEYID-SUB-A>. -
ssb [E]: Subchave Cv25519 para cifragem. Usada para cifrar dados e para o estabelecimento de chaves de sessão. Criada em2026-01-01, válida até2030-01-01e identificada por<KEYID-SUB-E>.
> tipos_de_chave_o_que_significam_no_assistente
Quando o assistente mostra opções como “RSA and 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 risco de exfiltração, mas aumenta 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 outras chaves e para assinar subchaves. 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 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.
> 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 seu_email@exemplo.pt
Se preferir referir a chave por identificador longo, use o valor apresentado em --list-secret-keys e consulte a impressão digital correspondente.
gpg --fingerprint ID_LONGO_DA_CHAVE
> 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 nome de saída:
gpg --armor --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 cifragem 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_do_destinatario@exemplo.pt documento.txt
Se quiser cifrar e assinar no mesmo passo, para obter confidencialidade e autoria verificável:
gpg --output documento.txt.gpg --encrypt --sign --recipient email_do_destinatario@exemplo.pt 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 decifragem.
gpg --output documento.txt --decrypt documento.txt.gpg
> 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 --recipient email_do_destinatario@exemplo.pt > mensagem.asc
Para decifrar e, se aplicável, validar a assinatura:
gpg --decrypt mensagem.asc
> status: draft
> exit 0