Laboratorio di Crittografia I - PGP/GPG Stefano Cristalli 2 dicembre 2015 a.a. 2015/2016 Corso di Crittografia I Docente: dott. Andrea Visconti
GNU Privacy Guard Risponde alla necessità di utilizzare la crittografia per proteggere la privacy in una varietà di contesti - Cifratura di file - Firma di contenuti (file, email, Git commit) Aderisce allo standard OpenPGP
GPG - Caratteristiche Utilizza una modalità ibrida per cifrare - Crittografia simmetrica con chiave di sessione per cifrare il messaggio - Crittografia asimmetrica con chiavi pubbliche e private degli utenti per cifrare la chiave di sessione Software a linea di comando, non è stato inizialmente progettato come una API Esistono API wrapper e interfacce grafiche
GPG - Generazione di un keypair gpg --gen-key numbers@diamond:~$ gpg gen key gpg (GnuPG) 1.4.16; Copyright (C) 2013 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Selezionare il tipo di chiave: (1) RSA e RSA (predefinito) (2) DSA e ElGamal (3) DSA (solo firma) (4) RSA (solo firma) Selezione?
GPG - Generazione di un keypair Viene richiesto il tipo della chiave. RSA e RSA (l'opzione predefinita) significa che verrà creata una master key per la firma e una subordinate key solo per la cifratura La lunghezza della chiave può essere decisa dall'utente. Essa influenza sia la sicurezza, sia la complessità delle operazioni di cifratura. Se non si hanno particolari motivi per fare altrimenti, si dovrebbe optare per la massima sicurezza (4096).
GPG - Generazione di un keypair La validità temporale della chiave può essere o meno limitata. È obbligatorio specificare un'opzione in fase di creazione, ma è possibile modificare il parametro successivamente. Il keypair generato conterrà i seguenti dati pubblici del proprietario: - Nome - Email - Un commento
GPG - Generazione di un keypair La chiave è protetta da una passphrase, che sarà obbligatorio inserire per effettuare certe operazioni (come la firma) È molto importante scegliere una passphrase robusta, in quanto costituisce una protezione da utilizzi indesiderati della chiave La chiave stessa è cifrata con uno schema simmetrico con la passphrase come chiave
GPG - Generazione di un keypair GPG legge dati casuali da /dev/random per ragioni di sicurezza. Questo comporta la possibilità di finire i byte nel pool e dover generare nuova entropia. Non ci sono abbastanza byte casuali disponibili. Svolgere qualche altro lavoro per dare al SO la possibilità di raccogliere altra entropia (sono necessari altri 164 byte)
GPG - Dettagli delle chiavi gpg --list-keys numbers@diamond:~$ gpg list keys /home/numbers/.gnupg/pubring.gpg pub 2048R/983A023F 2014 11 24 uid Stefano Cristalli (Chiave di prova) <stefano.cristalli@studenti.unimi.it> sub 2048R/E5A1967B 2014 11 24
GPG - Dettagli delle chiavi gpg --list-keys numbers@diamond:~$ gpg list keys /home/numbers/.gnupg/pubring.gpg pub 2048R/983A023F 2014 11 24 uid Stefano Cristalli (Chiave di prova) <stefano.cristalli@studenti.unimi.it> sub 2048R/E5A1967B 2014 11 24 Fingerprint: identificazione di una chiave (utile per la verifica con il proprietario, ad esempio al telefono)
GPG - Esportazione di una chiave (pubblica) gpg --export [uid] Esporta una chiave pubblica dato l'uid (specificato con il nome o con l'email) L'output di default è stdout, ma può essere reindirizzato con l'opzione --output [file] Il formato di default è binario, ma è possibile fare un wrapping con caratteri ASCII tramite l'opzione --armor
GPG - Esportazione di una chiave (pubblica) numbers@diamond:~$ gpg armor export "Stefano Cristalli" BEGIN PGP PUBLIC KEY BLOCK Version: GnuPG v1 mqenbfrzb0cbcacokpiywktsmzqgwjq8w5kug4mbynguqqm7fqi4apjcpfbdk4qd... =TrUW END PGP PUBLIC KEY BLOCK numbers@diamond:~$ ls numbers@diamond:~$ gpg output scristalli.gpg export numbers@diamond:~$ ls scristalli.gpg
GPG - Importazione di una chiave (pubblica) gpg --import [file] Dopo aver importato una chiave pubblica è buona norma controllarne la validità e impostarne la fiducia La fiducia che si dà alla chiave va da 1 (sconosciuto) a 5 (fiducia completa), e misura quanto si ritiene affidabile la firma del proprietario sulle altre chiavi GPG Il meccanismo della validità si basa sul web of trust
GPG - Web of trust Meccanismo di GPG per controllare la validità delle chiavi Una chiave K è considerata valida se soddisfa le condizioni: 1) La chiave soddisfa almeno una delle seguenti proprietà: a] È stata firmata personalmente b] È stata firmata da un utente con fiducia completa c] È stata firmata da tre utenti con fiducia marginale 2) La lunghezza della sequenza di firme da K alla propria chiave è inferiore a 6 È possibile modificare i valori di default per questi parametri
GPG - Verifica di una chiave importata gpg --edit-key [fingerprint] Questo comando apre il menu di modifica di una chiave Si possono effettuare diverse operazioni, terminando con save per aggiornare effettivamente la chiave
GPG - Verifica di una chiave importata gpg> trust Modifica il livello di fiducia per la chiave corrente gpg> fpr Visualizza il fingerprint della chiave corrente gpg> sign Firma la chiave corrente
GPG - Verifica di una chiave importata gpg> check Verifica le firme sulla chiave corrente N.B. GPG non rende la comunicazione sicura in sé. Una gestione accurata delle chiavi è fondamentale (verifica della loro validità, firma SOLO in casi opportuni)
GPG - Distribuzione della chiave Per distribuire la propria chiave pubblica, solitamente si utilizzano due meccanismi: la distribuzione personale e i keyserver Per distribuire personalmente la chiave, si può caricare la stessa sul proprio spazio web, oppure la si può spedire via email I keyserver sono dei repository di chiavi creati allo scopo di facilitare la distribuzione - Il download di una chiave da un keyserver non ne certifica l'autenticità
GPG - Distribuzione della chiave gpg --keyserver [keyserver_address] --recv-key [fingerprint] Recupera la chiave con il fingerprint in input dal server specificato Per vedere e inviare chiavi pubbliche è esposta solitamente anche un'interfaccia web Eventuali modifiche alla chiave pubblica vanno propagate tempestivamente ai keyserver
GPG - Certificati di revoca gpg --gen-revoke [fingerprint] Genera un certificato di revoca per la chiave specificata Nel caso in cui la chiave in questione sia compromessa, questo è lo strumento da utilizzare per invalidarla Resta necessario diffondere l'informazione che la chiave è stata compromessa! Il comando accetta le opzioni --output e --armor
GPG - Cifratura asimmetrica gpg --encrypt [file] --recipient [uid] Cifra un file con la chiave pubblica del destinatario Accetta le opzioni --output e --armor gpg --decrypt [file] Decifra un file Necessaria la chiave privata Necessaria la passphrase corretta
GPG - Cifratura asimmetrica numbers@diamond:~$ echo "Top Secret" > plaintext.txt numbers@diamond:~$ gpg output encrypted.gpg recipient "Barack Obama" encrypt plaintext.txt numbers@diamond:~$ gpg decrypt encrypted.gpg È necessaria una passphrase per sbloccare la chiave segreta dell'utente: "Barack Obama (I'm the real president!)... Top Secret
GPG - Firma e verifica gpg --sign [file] Firma (e comprime) un file gpg --clearsign [file] Crea un file contenente il plaintext e la firma ASCII-armored gpg --detach-sign [file] Crea un file separato contenente la firma Ove opportuni, sono accettati i parametri --output e --armor
GPG - Firma e verifica gpg --verify [file] gpg --verify [firma] [file] Verifica una firma numbers@diamond:~$ echo "CryptoLab" > plaintext.txt numbers@diamond:~$ gpg output plaintext.sig detach sign plaintext.txt... numbers@diamond:~$ gpg verify plaintext.sig plaintext.txt gpg: Firma eseguita in data lun 24 nov 2014 23:16:43 CET usando RSA, ID chiave 983A023F gpg: Firma valida da "Stefano Cristalli (Chiave di prova) <stefano.cristalli@studenti.unimi.it>"
Esercizi Esercizi e homework disponibili sul wiki: https://crypto.club.di.unimi.it