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.
gpg --full-generate-keyGPG 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.
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.
gpg --list-keysPer visualizzare le chiavi private (quelle per cui possediamo la chiave segreta).
gpg --list-secret-keysEsportare 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.
gpg --armor --export utente@nome-dominio.com > chiave_pubblica.ascIl 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.
gpg --import chiave_pubblica_di_mario.ascEsportare 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.
gpg --armor --export-secret-keys utente@nome-dominio.com > chiave_privata.ascProteggere 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).
gpg --encrypt --recipient mario@nome-dominio.com documento.txtIl 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.
gpg --encrypt --recipient mario@nome-dominio.com --recipient utente@nome-dominio.com documento.txtDecifratura
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.
gpg --decrypt documento.txt.gpg > documento.txtSe 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.
# 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 |