La crittografia simmetrica è il metodo più diretto per proteggere i propri file: si utilizza una singola passphrase per cifrare e decifrare i dati. È l’approccio ideale nel self-hosting quando vogliamo proteggere file sensibili sul nostro server, come backup, configurazioni o credenziali. In questa guida utilizzeremo GPG (GNU Privacy Guard), lo strumento standard su Linux per la crittografia, per cifrare file singoli, directory e archivi.

Cos’è la Crittografia Simmetrica

La crittografia simmetrica funziona come un lucchetto con una sola chiave: chi cifra e chi decifra deve conoscere la stessa password. GPG prende il file originale, lo trasforma in un file illeggibile utilizzando un algoritmo di cifratura, e solo chi conosce la passphrase corretta può ripristinarlo.

Per impostazione predefinita, GPG utilizza l’algoritmo AES-256 (Advanced Encryption Standard con chiave a 256 bit), lo stesso standard adottato da governi e organizzazioni militari. La passphrase che inseriamo non viene usata direttamente come chiave di cifratura: GPG la passa attraverso una funzione di derivazione (key derivation function) che la trasforma in una chiave della lunghezza corretta, aggiungendo un valore casuale chiamato “sale” (salt) e iterazioni multiple per rendere più difficili gli attacchi a forza bruta (brute force).

Crittografia simmetrica vs asimmetrica

Questa guida tratta esclusivamente la crittografia simmetrica, pensata per proteggere i propri file personali. Se hai necessità di cifrare file destinati ad altre persone o automatizzare la cifratura senza inserire una password interattiva, consulta la nostra guida sulla crittografia asimmetrica con GPG .

Verificare l’Installazione di GPG

GPG è preinstallato sulla maggior parte delle distribuzioni Linux. Possiamo verificare la sua presenza e la versione installata con il seguente comando.

bash
gpg --version

L’output mostrerà la versione di GPG e gli algoritmi supportati. Assicuriamoci di avere la versione 2.x (GnuPG 2), che è quella moderna e attivamente mantenuta.

Se GPG non fosse installato, possiamo aggiungerlo con il gestore pacchetti della nostra distribuzione.

bash
# Debian/Ubuntu
sudo apt install gnupg

# Fedora
sudo dnf install gnupg2

# Arch Linux
sudo pacman -S gnupg

Cifrare un File Singolo

Cifratura

Per cifrare un singolo file con crittografia simmetrica utilizziamo il flag --symmetric (abbreviabile in -c). GPG ci chiederà di inserire una passphrase e di confermarla.

bash
gpg --symmetric documento.txt

Il comando genera un file documento.txt.gpg nella stessa directory. Questo è il formato binario, più compatto e adatto alla maggior parte dei casi d’uso.

Se preferiamo un output in formato testo leggibile (ASCII-armored), utile quando dobbiamo trasmettere il file attraverso canali che gestiscono solo testo come email o messaggi, possiamo aggiungere il flag --armor (abbreviabile in -a).

bash
gpg --symmetric --armor documento.txt

In questo caso il file generato sarà documento.txt.asc e il suo contenuto sarà codificato in Base64, leggibile con qualsiasi editor di testo.

Specificare l’Algoritmo

Possiamo specificare l’algoritmo di cifratura con il flag --cipher-algo. Come anticipato, AES-256 è il default nelle versioni recenti di GPG, ma possiamo indicarlo esplicitamente per chiarezza.

bash
gpg --symmetric --cipher-algo AES256 documento.txt

Per visualizzare tutti gli algoritmi supportati dalla nostra installazione utilizziamo il seguente comando.

bash
gpg --version

Gli algoritmi di cifratura disponibili sono elencati nella riga che inizia con “Cipher”. Non c’è motivo pratico di cambiare AES-256, a meno di requisiti specifici di compatibilità con sistemi molto datati.

Decifratura

Per decifrare un file utilizziamo il flag --decrypt (abbreviabile in -d). GPG ci chiederà la passphrase utilizzata in fase di cifratura.

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

Il flag --decrypt scrive il contenuto decifrato sullo standard output (il terminale). Per salvarlo in un file utilizziamo la redirezione > come mostrato sopra, oppure il flag --output (abbreviabile in -o) per specificare direttamente il nome del file di destinazione.

bash
gpg --output documento.txt --decrypt documento.txt.gpg

Attenzione

Il file originale non viene cancellato automaticamente dopo la cifratura. Se il motivo per cui stiamo cifrando è proteggere dati sensibili, dobbiamo ricordarci di eliminare il file in chiaro in modo sicuro. Consultare la nostra guida sulla cancellazione sicura dei dati per approfondire questo aspetto.

Cifrare una Directory

GPG lavora su singoli file e non può cifrare direttamente una directory. Per cifrare un’intera cartella dobbiamo prima “impacchettarla” in un unico file utilizzando tar, e poi cifrare l’archivio risultante. Questo segue la filosofia Unix: ogni strumento fa una cosa sola e bene, e si combinano insieme per ottenere il risultato desiderato.

Metodo in Due Passaggi

Il metodo più semplice e intuitivo prevede due comandi separati: prima creiamo l’archivio, poi lo cifriamo.

bash
# Passo 1: creare l'archivio
tar -cf cartella_backup.tar cartella/

# Passo 2: cifrare l'archivio
gpg --symmetric cartella_backup.tar

Questo produce il file cartella_backup.tar.gpg. Al termine dobbiamo eliminare il file intermedio cartella_backup.tar che contiene i dati in chiaro.

Metodo con Pipe (Consigliato)

Il metodo migliore dal punto di vista della sicurezza utilizza le pipe di Linux per concatenare i due comandi. In questo modo l’archivio tar non viene mai scritto sul disco in chiaro: passa direttamente dalla memoria (RAM) a GPG.

bash
# Cifratura
tar -cf - cartella/ | gpg --symmetric --output cartella_backup.tar.gpg

# Decifratura
gpg --decrypt cartella_backup.tar.gpg | tar -xf -

Nel comando di cifratura, tar -cf - scrive l’archivio sullo standard output (indicato dal trattino -) invece che su un file. La pipe | passa questo flusso di dati direttamente a GPG, che lo cifra e scrive il risultato nel file specificato con --output.

Il comando di decifratura funziona al contrario: GPG decifra il contenuto e lo passa tramite pipe a tar -xf -, che legge l’archivio dallo standard input e lo estrae nella directory corrente.

Perché usare le pipe

Utilizzare le pipe non è solo una questione di eleganza. Se il file intermedio in chiaro tocca il disco, anche dopo averlo cancellato i dati potrebbero essere recuperabili, specialmente su filesystem con journaling (ext4, XFS) o su SSD. Con le pipe, i dati in chiaro transitano solo in memoria RAM e non vengono mai scritti sul disco.

Cifrare Archivi Compressi

Possiamo combinare compressione e cifratura in un unico passaggio aggiungendo il flag di compressione a tar. Le opzioni più comuni sono -z per gzip e -j per bzip2.

bash
# Cifratura con compressione gzip
tar -czf - cartella/ | gpg --symmetric --output cartella_backup.tar.gz.gpg

# Decifratura con decompressione gzip
gpg --decrypt cartella_backup.tar.gz.gpg | tar -xzf -
bash
# Cifratura con compressione bzip2
tar -cjf - cartella/ | gpg --symmetric --output cartella_backup.tar.bz2.gpg

# Decifratura con decompressione bzip2
gpg --decrypt cartella_backup.tar.bz2.gpg | tar -xjf -

La compressione avviene prima della cifratura, il che è importante: i dati cifrati sono essenzialmente casuali e non comprimibili. Se cifrassimo prima e comprimessimo dopo, la compressione non avrebbe alcun effetto sulla dimensione del file.

Gestione della Passphrase

La sicurezza della crittografia simmetrica dipende interamente dalla qualità della passphrase scelta. Con AES-256, l’algoritmo è praticamente inviolabile — il punto debole è sempre la passphrase.

Nessun recupero possibile

Se dimentichiamo la passphrase, i dati cifrati sono irrecuperabili. Non esiste un meccanismo di recupero. GPG non ha una “password dimenticata”. È fondamentale conservare la passphrase in un luogo sicuro, come un password manager.

Scenario Pratico: Cifrare un Backup

Riepilogo Comandi

Operazione Comando
Cifrare un file gpg --symmetric file.txt
Cifrare un file (ASCII) gpg --symmetric --armor file.txt
Decifrare un file gpg --decrypt file.txt.gpg > file.txt
Cifrare una directory (pipe) tar -czf - cartella/ | gpg --symmetric --output backup.tar.gz.gpg
Decifrare una directory (pipe) gpg --decrypt backup.tar.gz.gpg | tar -xzf -