#!/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 indicador plena significa 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 em 2026-01-01, válida até 2030-01-01 e identificada por <KEYID-SUB-S>.

  • ssb [A]: Subchave Ed25519 para autenticação. Usada para autenticação com chave, por exemplo em SSH. Criada em 2026-01-01, válida até 2030-01-01 e 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 em 2026-01-01, válida até 2030-01-01 e 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