La crittografia asimmetrica utilizza una coppia di chiavi — una pubblica e una privata — per cifrare e decifrare i dati. A differenza della crittografia simmetrica, dove entrambe le parti devono conoscere la stessa password, qui chi cifra usa la chiave pubblica del destinatario e solo il destinatario può decifrare con la propria chiave privata. Questo meccanismo è fondamentale quando dobbiamo scambiare file cifrati con altre persone o macchine, oppure automatizzare operazioni di cifratura senza inserire una password interattiva.

Prima di iniziare

Questa guida presuppone familiarità con i concetti base di GPG. Se non hai mai utilizzato GPG per cifrare file, ti consigliamo di leggere prima la nostra guida sulla crittografia simmetrica con GPG , dove vengono spiegati i fondamentali come formati di output, algoritmi e utilizzo delle pipe.

Come Funziona la Crittografia Asimmetrica

Il principio alla base della crittografia asimmetrica è semplice: abbiamo due chiavi matematicamente collegate ma con funzioni opposte.

La chiave pubblica è quella che possiamo distribuire liberamente. Chiunque la possieda può usarla per cifrare un file destinato a noi. La chiave privata è quella che dobbiamo custodire con la massima attenzione. È l’unica in grado di decifrare ciò che è stato cifrato con la corrispondente chiave pubblica.

Un’analogia utile: la chiave pubblica è come l’indirizzo della nostra cassetta postale. Chiunque lo conosca può inviarci una lettera. Ma solo noi abbiamo la chiave della cassetta per aprirla e leggere il contenuto.

Questo è lo stesso principio utilizzato dalle chiavi SSH per l’autenticazione remota, trattato nella guida Configurare Connessioni SSH . La differenza è che SSH usa le chiavi per l’autenticazione, mentre qui le usiamo per la cifratura dei file.

Generare una Coppia di Chiavi

Generazione Interattiva

Per generare una nuova coppia di chiavi utilizziamo il comando --full-generate-key, che ci guida attraverso una procedura interattiva.

bash
gpg --full-generate-key

GPG ci chiederà di scegliere alcune opzioni.

Quale tipo di chiave scegliere

Per un utilizzo moderno, le chiavi ECC (Elliptic Curve Cryptography) con curva ed25519 offrono la stessa sicurezza di RSA-4096 con chiavi molto più corte e operazioni più veloci. Se la compatibilità con sistemi molto datati non è un requisito, ECC è la scelta consigliata. In caso contrario, RSA con una lunghezza di 4096 bit è l’opzione più conservativa.

Generazione Rapida

Se vogliamo generare una coppia di chiavi con le impostazioni predefinite, senza passare per la procedura interattiva, possiamo usare il flag --quick-generate-key.

bash
gpg --quick-generate-key "Nome Cognome <utente@nome-dominio.com>"

Questo comando genera una chiave con gli algoritmi predefiniti di GPG (nella versione 2.x, tipicamente ed25519 per la firma e cv25519 per la cifratura).

Gestire il Keyring

Il keyring è il “portachiavi” locale di GPG, dove vengono memorizzate tutte le chiavi — sia le nostre che quelle di altre persone che abbiamo importato. Sapere come gestirlo è fondamentale per lavorare con la crittografia asimmetrica.

Elencare le Chiavi

Per visualizzare tutte le chiavi pubbliche nel nostro keyring utilizziamo il seguente comando.

bash
gpg --list-keys

Per visualizzare le chiavi private (quelle per cui possediamo la chiave segreta).

bash
gpg --list-secret-keys

Esportare la Chiave Pubblica

Per permettere ad altri di cifrare file destinati a noi, dobbiamo condividere la nostra chiave pubblica. Possiamo esportarla in formato ASCII-armored, facilmente trasmissibile via email o pubblicabile online.

bash
gpg --armor --export utente@nome-dominio.com > chiave_pubblica.asc

Il file chiave_pubblica.asc contiene solo la chiave pubblica ed è sicuro da condividere. Non contiene in alcun modo la chiave privata.

Importare una Chiave Pubblica

Quando riceviamo la chiave pubblica di qualcun altro, dobbiamo importarla nel nostro keyring prima di poterla usare per cifrare file destinati a quella persona.

bash
gpg --import chiave_pubblica_di_mario.asc

Esportare la Chiave Privata (Backup)

In caso di necessità, possiamo esportare anche la chiave privata per farne un backup. Questo file va trattato con la massima cura e conservato in un luogo sicuro.

bash
gpg --armor --export-secret-keys utente@nome-dominio.com > chiave_privata.asc

Proteggere la chiave privata

La chiave privata è il cuore della sicurezza della crittografia asimmetrica. Se qualcuno la ottiene, può decifrare tutti i file cifrati con la nostra chiave pubblica. Conservare il backup della chiave privata su un supporto offline (chiavetta USB cifrata, ad esempio) e mai su servizi cloud non cifrati.

Cifrare un File per un Destinatario

Cifratura

Per cifrare un file destinato a una persona specifica utilizziamo il flag --recipient (abbreviabile in -r) seguito dall’identificativo della chiave del destinatario (email, nome o fingerprint).

bash
gpg --encrypt --recipient mario@nome-dominio.com documento.txt

Il comando genera il file documento.txt.gpg, che solo Mario potrà decifrare con la sua chiave privata. Nemmeno noi potremo decifrarlo, a meno di non aggiungere anche noi stessi come destinatari.

Per cifrare un file che sia leggibile sia dal destinatario che da noi stessi, aggiungiamo un secondo flag --recipient con il nostro identificativo.

bash
gpg --encrypt --recipient mario@nome-dominio.com --recipient utente@nome-dominio.com documento.txt

Decifratura

Il destinatario decifra il file con il comando standard di decifratura. GPG riconosce automaticamente che il file è stato cifrato con la sua chiave pubblica e utilizza la corrispondente chiave privata.

bash
gpg --decrypt documento.txt.gpg > documento.txt

Se la chiave privata è protetta da una passphrase (come dovrebbe essere), GPG la chiederà in questo passaggio.

Cifrare Directory e Archivi

Il metodo per cifrare directory con la crittografia asimmetrica è identico a quello visto nella guida sulla crittografia simmetrica: utilizziamo tar per creare l’archivio e le pipe per evitare file intermedi in chiaro sul disco. L’unica differenza è il flag usato per GPG.

bash
# Cifratura di una directory per un destinatario
tar -czf - cartella/ | gpg --encrypt --recipient mario@nome-dominio.com --output backup.tar.gz.gpg

# Decifratura
gpg --decrypt backup.tar.gz.gpg | tar -xzf -

Firmare un File

Revocare una Chiave Compromessa

Se sospettiamo che la nostra chiave privata sia stata compromessa, dobbiamo revocarla per informare tutti coloro che possiedono la nostra chiave pubblica che non è più affidabile.

Scenario Pratico: Cifratura tra Server

Riepilogo Comandi

Operazione Comando
Generare una coppia di chiavi gpg --full-generate-key
Elencare chiavi pubbliche gpg --list-keys
Elencare chiavi private gpg --list-secret-keys
Esportare chiave pubblica gpg --armor --export utente@nome-dominio.com > pubblica.asc
Importare chiave pubblica gpg --import chiave.asc
Cifrare per un destinatario gpg --encrypt --recipient utente@nome-dominio.com file.txt
Decifrare gpg --decrypt file.txt.gpg > file.txt
Esportare chiave privata (backup) gpg --armor --export-secret-keys utente@nome-dominio.com > privata.asc