GNU Privacy Guard (GPG o GnuPG) és una implementació lliure i de codi obert de l’estàndard OpenPGP (RFC 4880). Permet xifrar i signar dades i comunicacions, gestionar claus criptogràfiques i verificar l’autenticitat de fitxers i missatges.
| Estàndard | Descripció |
|---|---|
| OpenPGP | RFC 4880 — format de missatges, claus i signatures |
| RFC 4880bis | Esborrany d’actualització (ed25519, AEAD) |
| S/MIME | GPG pot interoperar amb S/MIME via gpgsm |
| X.509 | Suportat via gpgsm per a certificats de CA |
| SSH | L’agent GPG pot substituir ssh-agent |
| Versió | Estat | Notes |
|---|---|---|
GnuPG 1.x (gpg) |
Llegat | Monolític, sense dependències externes |
GnuPG 2.x (gpg2) |
Actual | Modular, amb gpg-agent, suport a smartcards |
| GnuPG 2.2.x | LTS | Branca estable de llarg suport |
| GnuPG 2.4.x | Modern | Branca més recent, millores en ed25519, AEAD |
A la majoria de distribucions actuals, gpg és un àlies
de gpg2.
| Component | Descripció |
|---|---|
gpg |
Eina principal per a OpenPGP |
gpg2 |
Versió modular (equivalent a gpg en sistemes
moderns) |
gpg-agent |
Dimoni que gestiona les claus privades i frases de pas |
gpgsm |
Gestió de certificats S/MIME i X.509 |
gpgconf |
Configuració dels components de GnuPG |
gpg-connect-agent |
Comunicació directa amb gpg-agent |
dirmngr |
Dimoni per accedir a servidors de claus i CRL/OCSP |
scdaemon |
Gestió de smartcards i tokens USB (YubiKey, etc.) |
gpgtar |
Xifratge i signatura d’arxius tar |
watchgnupg |
Monitoratge dels sockets de GnuPG |
sudo apt update
sudo apt install gnupg2sudo dnf install gnupg2sudo pacman -S gnupgbrew install gnupgDescarregar Gpg4win des de https://gpg4win.org (inclou Kleopatra com a interfície gràfica).
GPG no usa una autoritat de certificació centralitzada (CA), sinó una xarxa de confiança descentralitzada:
unknown, none, marginal, full, ultimate.| Validesa | Descripció |
|---|---|
unknown |
No se sap res de la clau |
undefined |
No s’ha assignat confiança |
marginal |
Confiança parcial |
full |
Confiança plena |
ultimate |
Confiança absoluta (pròpies claus) |
AES-128, AES-192, AES-256, 3DES, CAST5, Blowfish, Twofish, Camellia
RSA, DSA, ElGamal, ECDH, ECDSA, EdDSA (Ed25519)
SHA-1, SHA-256, SHA-384, SHA-512, SHA-224, RIPEMD-160, MD5
# Generació interactiva (recomanada)
gpg --full-generate-key
# Generació ràpida amb valors per defecte
gpg --gen-key
# Generació per lots (no interactiva)
gpg --batch --generate-key <<EOF
%echo Generant clau de prova
Key-Type: EdDSA
Key-Curve: Ed25519
Subkey-Type: ECDH
Subkey-Curve: Curve25519
Name-Real: Ramon López
Name-Email: ramon@thosicodina.cat
Expire-Date: 2y
Passphrase: la_meva_frase_de_pas
%commit
EOF# Claus públiques del clauer
gpg --list-keys
gpg -k
# Claus privades del clauer
gpg --list-secret-keys
gpg -K
# Amb empremtes digitals (fingerprints)
gpg --list-keys --fingerprint
# Format llarg (amb KeyID complet de 16 hex)
gpg --list-keys --keyid-format LONG# Exportar clau pública (format ASCII)
gpg --armor --export ramon@thosicodina.cat > clau_publica.asc
# Exportar clau privada (fer còpia de seguretat!)
gpg --armor --export-secret-keys ramon@thosicodina.cat > clau_privada.asc
# Exportar subclaus privades
gpg --armor --export-secret-subkeys ramon@thosicodina.cat > subclaus.asc# Importar una clau pública
gpg --import clau_publica.asc
# Importar des d'un servidor de claus
gpg --keyserver hkps://keys.openpgp.org --recv-keys 0xIDDELACLAU# Eliminar clau pública (cal eliminar primer la privada si n'hi ha)
gpg --delete-key ramon@thosicodina.cat
# Eliminar clau privada
gpg --delete-secret-key ramon@thosicodina.cat
# Eliminar ambdues
gpg --delete-secret-and-public-key ramon@thosicodina.catgpg --edit-key ramon@thosicodina.catSubordres útils dins gpg --edit-key:
| Subordre | Acció |
|---|---|
passwd |
Canvia la frase de pas |
expire |
Canvia la data de caducitat |
adduid |
Afegeix una identitat (UID) |
deluid |
Elimina una identitat |
addsubkey |
Afegeix una subclau |
revuid |
Revoca una identitat |
trust |
Assigna nivell de confiança |
sign |
Signa la clau |
save |
Desa els canvis |
quit |
Surt sense desar |
# Xifratge asimètric (per al destinatari)
gpg --encrypt --recipient destinatari@thosicodina.cat document.pdf
# Xifratge per a múltiples destinataris
gpg -e -r destinatari1@thosicodina.cat -r destinatari2@thosicodina.cat fitxer.txt
# Xifratge + signatura en un sol pas
gpg --encrypt --sign --recipient destinatari@thosicodina.cat fitxer.txt
# Sortida en format ASCII (armored)
gpg --armor --encrypt -r destinatari@thosicodina.cat fitxer.txt
# Genera fitxer.txt.asc# Xifratge simètric (demanarà una contrasenya)
gpg --symmetric fitxer.txt
# Genera fitxer.txt.gpg
# Especificant algoritme
gpg --symmetric --cipher-algo AES256 fitxer.txt
# Amb sortida ASCII
gpg --armor --symmetric fitxer.txt# Desxifratge (detecta automàticament el tipus)
gpg --decrypt fitxer.txt.gpg > fitxer_desxifrat.txt
# O simplement
gpg fitxer.txt.gpg# Signatura separada (crea fitxer.txt.sig)
gpg --detach-sign fitxer.txt
# Signatura separada en ASCII
gpg --armor --detach-sign fitxer.txt
# Crea fitxer.txt.asc
# Signatura integrada (crea fitxer.txt.gpg amb contingut + signatura)
gpg --sign fitxer.txt
# Signatura de text en clar (llegible sense GPG, signatura al peu)
gpg --clearsign fitxer.txt
# Crea fitxer.txt.asc# Verificar signatura separada
gpg --verify fitxer.txt.asc fitxer.txt
# Verificar signatura integrada o en clar
gpg --verify fitxer.txt.gpg
# Verificar i extreure el contingut
gpg --output fitxer_original.txt --decrypt fitxer.txt.gpggpg: Signature made dl 08 jun 2026 10:30:00 CEST
gpg: using EdDSA key A1B2C3D4E5F60001
gpg: Good signature from "Ramon López <ramon@thosicodina.cat>" [ultimate]
És imprescindible generar el certificat de revocació just després de crear la clau.
# Generar certificat de revocació
gpg --gen-revoke ramon@thosicodina.cat > revocacio.asc
# Aplicar la revocació (quan calgui)
gpg --import revocacio.asc
# Publicar la revocació al servidor de claus
gpg --keyserver hkps://keys.openpgp.org --send-keys 0xIDDELACLAUImportant: Desa el fitxer de revocació en un lloc segur i separat de la clau privada.
# Pujar clau pública a un servidor
gpg --keyserver hkps://keys.openpgp.org --send-keys 0xIDDELACLAU
# Buscar una clau per correu
gpg --keyserver hkps://keys.openpgp.org --search-keys usuari@exemple.com
# Baixar/actualitzar una clau
gpg --keyserver hkps://keys.openpgp.org --recv-keys 0xIDDELACLAU
# Actualitzar totes les claus del clauer
gpg --refresh-keys| Servidor | Notes |
|---|---|
hkps://keys.openpgp.org |
Recomanat; verifica propietat per correu |
hkps://keyserver.ubuntu.com |
Mantingut per Canonical |
hkps://pgp.mit.edu |
Històric, no suprimeix claus |
hkps://keys.mailvelope.com |
Usat per Mailvelope |
gpg-agent és un dimoni que guarda les frases de pas en
memòria durant una sessió, evitant haver-les d’introduir
repetidament.
# Iniciar l'agent (normalment s'inicia automàticament)
gpg-agent --daemon
# Verificar que l'agent corre
gpg-connect-agent /bye
# Oblidar totes les frases de pas en caché
gpg-connect-agent reloadagent /bye
# Configuració: ~/.gnupg/gpg-agent.conf
default-cache-ttl 3600 # Temps de caché en segons (1h)
max-cache-ttl 86400 # Temps màxim (24h)
pinentry-program /usr/bin/pinentry-gtk-2 # Programa per demanar frase de pas# Afegir a ~/.gnupg/gpg-agent.conf
enable-ssh-support
# Afegir a ~/.bashrc o ~/.zshrc
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agentLes subclaus permeten mantenir la clau mestra (certificació) fora de línia i usar subclaus per a les operacions quotidianes.
Estructura recomanada:
Clau mestra [C] — Certificació (offline, molt protegida)
├── Subclau [S] — Signatura
├── Subclau [E] — Xifrat
└── Subclau [A] — Autenticació (SSH)
# Afegir subclau a una clau existent
gpg --edit-key ramon@thosicodina.cat
> addsubkey
# Seleccionar tipus (sign/encrypt/auth) i mida/corba
> saveGnuPG suporta targetes intel·ligents via scdaemon:
# Llistar targetes connectades
gpg --card-status
# Moure subclaus a la targeta (operació irreversible!)
gpg --edit-key ramon@thosicodina.cat
> key 1
> keytocard
> save
# Configurar PIN de la targeta
gpg --card-edit
> passwdYubiKey és el dispositiu més popular per a aquest ús (OpenPGP Card 3.x).
~/.gnupg/gpg.conf# Algoritmes preferits
personal-cipher-preferences AES256 AES192 AES
personal-digest-preferences SHA512 SHA384 SHA256
personal-compress-preferences ZLIB BZIP2 ZIP Uncompressed
# Format d'identificació de claus llarg
keyid-format LONG
# Mostrar empremtes digitals
with-fingerprint
# Servidor de claus per defecte
keyserver hkps://keys.openpgp.org
# No incloure la versió als fitxers armored
no-emit-version
# Xifratge creusat (per a un mateix)
default-recipient-self
# No incluir comentaris
no-comments
# Hash per defecte
cert-digest-algo SHA512
| Client | Integració |
|---|---|
| Thunderbird | Suport natiu OpenPGP des de v78 |
| Mutt/NeoMutt | Integrat per defecte |
| Evolution | Connector GPG integrat |
| KMail | Connector Kleopatra (KDE) |
| Geary | Suport bàsic |
sudo apt install pass
pass init ramon@thosicodina.cat
pass insert correu/gmail
pass show correu/gmail# Configurar GPG per a Git
git config --global user.signingkey 0xIDDELACLAU
git config --global commit.gpgsign true
git config --global gpg.program gpg2
# Commit signat
git commit -S -m "Commit amb signatura GPG"
# Verificar signatura d'un commit
git log --show-signature
git verify-commit HEADGPG s’usa per verificar l’autenticitat dels dipòsits:
# Debian/Ubuntu: claus dels dipòsits a /etc/apt/trusted.gpg.d/
# Verificar un paquet descarregat
gpg --verify paquet.deb.asc paquet.deb# Xifrar un tar amb GPG
tar czf - /home/usuari/ | gpg --symmetric --cipher-algo AES256 -o backup.tar.gz.gpg
# Desxifrar i restaurar
gpg -d backup.tar.gz.gpg | tar xzf - -C /destí/# Baixar la clau del projecte
gpg --keyserver hkps://keys.openpgp.org --recv-keys 0xCLAUDELPROJECTE
# Verificar
gpg --verify ubuntu-24.04.iso.gpg ubuntu-24.04.isogpg --encrypt --sign --armor \
--recipient destinatari@thosicodina.cat \
--local-user jo@thosicodina.cat \
fitxer_confidencial.txtgpg --refresh-keys).~/.gnupg/: permisos 700 al directori, 600 als fitxers.# Permisos correctes
chmod 700 ~/.gnupg
chmod 600 ~/.gnupg/*| Ruta | Contingut |
|---|---|
~/.gnupg/ |
Directori principal de GnuPG |
~/.gnupg/pubring.kbx |
Clauer públic (format KeyBox, GnuPG >= 2.1) |
~/.gnupg/trustdb.gpg |
Base de dades de confiança |
~/.gnupg/private-keys-v1.d/ |
Claus privades (una per fitxer) |
~/.gnupg/gpg.conf |
Configuració de GPG |
~/.gnupg/gpg-agent.conf |
Configuració de l’agent |
~/.gnupg/dirmngr.conf |
Configuració del gestor de directoris |
~/.gnupg/sshcontrol |
Claus autoritzades per SSH via GPG-Agent |
gpgconf --kill gpg-agent
gpg-agent --daemongpg --keyserver hkps://keys.openpgp.org --recv-keys 0xIDDELACLAUgpgconf --check-dirs
chmod 700 ~/.gnupg && chmod 600 ~/.gnupg/*gpg --edit-key ramon@thosicodina.cat
> expire
# Introduir nova durada (p. ex. "2y")
> save
gpg --keyserver hkps://keys.openpgp.org --send-keys 0xIDDELACLAUgpg --list-packets fitxer.asc
gpg --verbose --list-keys ramon@thosicodina.cat| Eina | Descripció |
|---|---|
| Age | Eina moderna de xifratge de fitxers, sintaxi senzilla |
| Sequoia-PGP | Implementació OpenPGP en Rust |
| Kleopatra | Interfície gràfica per a GnuPG (KDE/Windows) |
| GPG Suite | Integració de GPG per a macOS |
| Gpg4win | Paquet GPG per a Windows (inclou Kleopatra) |
| pass | Gestor de contrasenyes basat en GPG |
| gopass | Alternativa moderna a pass |