OpenPGP è un sistema di crittografia a chiave pubblica che viene utilizzato solitamente per l’ invio di mail con contenuto sensibile.

Chiave Pubblica e Chiave Privata

Sostanzialmente quello che si fa è creare due chiavi collegate. Una di queste sarà la nostra chiave “Pubblica” l’ altra invece sarà la nostra chiave “Privata”. Quando qualcuno ce la chiede, daremo la nostra chiave pubblica (la mia per esempio la allego in calce alle mie mail). La chiave privata però, è da tenere segreta e nascosta nel proprio computer. Si possono usare a seconda del caso, una chiave per encriptare e l’altra per decriptare file binari o di testo.

Per esempio, se volessi mandarmi qualcosa potresti criptarla usando la mia chiave pubblica. Una volta criptato il messaggio, nessun’ altro potrà decriptarlo a meno che non abbia la mia chiave privata. D’ altra parte, potrei voler essere sicuro che sia veramente tu a mandarmi il messaggio. In questo caso, premesso che anche tu abbia una coppia di chiavi, puoi criptare il tuo messaggio usando la tua chiave privata (questa è chiamata firma digitale).
Se poi riesco a decriptare il tuo messaggio usando la tua chiave pubblica (teoricamente dovrei aver ottenuto la chiave pubblica in una maniera che mi dia la certezza che appartenga veramente a te -esistono enti per questo), vuol dire che il messaggio è stato veramente inviato da te.

L’ algoritmo di generazione delle coppie di chiavi, viene chiamato OpenPGP. Sui sistemi Linux abbiamo il programma creato da Gnu, chiamato GNU Privacy Guard (o GPG).
Vediamo ora i passaggi da seguire per:[fancy_list style=”plus_list”]

  • Generare una chiave pubblica e privata,
  • Aggiungere la chiave pubblica di un utente, e criptare un messaggio
  • Decriptare un messaggio ricevuto, criptato con la propria chiave pubblica.

[/fancy_list]
GnuGPLogo

Creare una coppia di chiavi

Dal nostro pc con Linux, apriamo un terminale e digitiamo:

gpg --gen-key

Dopodiche, vi allego gli output del programma con le risposte alle varie domande:

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.
 
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 2048
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
        = key expires in n days
      w = key expires in n weeks
      m = key expires in n months
      y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
 
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) "
 
Real name: Federico Ponzi
Email address: admin@informaticalab.com
Comment: Federico's key
You selected this USER-ID:
    "Federico Ponzi (Federico's key) "
 
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.
 
gpg: gpg-agent is not available in this session
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
 
Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 300 more bytes)
..+++++
....+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
..+++++
........+++++
gpg: key D7D8381B marked as ultimately trusted
public and secret key created and signed.
 
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
pub   2048R/D7D8381B 2014-10-31
      Key fingerprint = 49FD F791 8FD4 CAF6 8469  C9CA 3F99 8F48 D7D8 381B
uid                  Federico Ponzi (Federico's key) 
sub   2048R/2C02D001 2014-10-31

La PassPhrase dovrebbe essere una password veramente difficile. Può contenere spazi, non è limitata in lunghezza e ovviamente dovremo ricordarcela per criptare e decriptare i messaggi. Per l’esempio ho usato il sito http://randomkeygen.com/ (non ho molta fantasia :P) e scelto come password:

p5909"=AU]

Una parte interessante è alla fine, durante la generazione delle chiavi ha bisogno di byte casuali. Per questo motivo, ci chiede di effettuare delle operazioni in modo da poter far lavorare la CPU. Potete aprire un programma di editing, un gioco, o navigare nel browser. Quando una sufficiente quantità di byte è stata raccolta, ci avvisa che la procedura è terminata.
Per avere la lista delle nostre chiavi, diamo:

federicoponzi: ~ $ gpg --list-keys
/home/federicoponzi/.gnupg/pubring.gpg
--------------------------------------
pub   2048R/D7D8381B 2014-10-31
uid                  Federico Ponzi (Federico's key) 
sub   2048R/2C02D001 2014-10-31

Prepariamo la nostra chiave pubblica dando:

gpg --armor --export admin@informaticalab.com > publickey.txt

Adesso ci ritroveremo un file chiamato publickey.txt contenente la nostra chiave pubblica.

federicoponzi: ~ $ cat publickey.txt
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

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
ClpSZYECFHxQ3SShApN4go8Xc5aZGcZXpLn2Z1AaElC5AQ0EVFN2WgEIANRFIc3b
fgvgtpNKIs8i56dKqIjr+K2jIiXxwAC3Asa51zV5VV0qCfxGY7+PhWf4BTfwWMi0
lfg1W5teJOnaiMMH/UYbc6OerZ+iNL5mEYU5GTNqWQP2V+0vs0CuBQGxsoGdEfnH
mYpCB1AdNMpHJ4tpceL7l6hlUsOS+cRTVKL4NnxWyzGmxGSaCLsvuOKvnrFe547D
BCXW5JeF171QnLNopcBb5jvS9Y65Tj97OLqf7EOWtETCkyGAMfgWcYQ6Kos7BBme
2XFXES9Ji1OJngFFTGPLP6TRmK3K1XmvriSy5ykt0/veANNV3ZuAKbkcWjoN6f2n
5vTpXFtK2d+KnGkAEQEAAYkBHwQYAQIACQUCVFN2WgIbDAAKCRA/mY9I19g4G12t
CACkNAwC0gGlcMHalTEsQ8cRtkVZQXIzuohE9JS4y7XeMazHQRNN7T3y62GsQM4P
lXjU2f9tzLeztCVvmFbOSR5Y8lHYmR97qXadxYX2fibITQJ4U3JqYSG5yDc4OtAY
jKNQirDZnADJs+JZ26kJbKwjTvjJAenBSP1fZsdGX87FdreuqjlNkebZeOVjqyrc
brxjSq/FLJnOapcubjk/PoOEOv+zv4BLfsle2xzYa5buCd/SNk7yJUWiQF991xvi
nBkZ3jmpt/BdnV56Tnsrnu1RPbW+UPrlZ+yrcLodOkkgWtns4pKcfon9+DsI5v+f
5UdWwOgIE8ebOnxDMmipL+Cs
=mWIM
-----END PGP PUBLIC KEY BLOCK-----

Vediamo adesso come usare la chiave pubblica appena generata per scambiare un messaggio.

Alice vuole mandarmi un messaggio privato: come usare la chiave pubblica

In qualche modo, ho inviato la mia chiave pubblica ad Alice che ha la certezza di avere esattamente la mia chiave pubblica. Un modo per effettuare lo scambio potrebbe essere quello di dargli fisicamente una copia della nostra chiave pubblica, oppure potremmo pubblicarla nel nostro sito web.

Per inviare una mail a qualcuno con una chiave pubblica, innanzitutto dobbiamo aggiungerla:

gpg--import federicopublickey.txt

facendo ora gpg --list-keys, Alice vedrà oltre che la sua chiave anche la mia.

Adesso, localizziamo il file che vogliamo criptare. Nel mio caso si chiama messaggio-segreto.txt (molto fantasiosamente). Diamo questo comando:

gpg -e -r "Federico Ponzi" --out segreto.gpg messaggio-segreto.txt

Dove:

  • -e: Encrypt
  • -r : User id del ricevente
  • --out: Specifica il nome del file di output (cioè, quello che segue il parametro)
  • segreto.gpg: il nostro file di output
  • messaggio-segreto.txt: il nostro file di input.

Adesso dando un ls, ci ritroveremo anche il file segreto.txt. Adesso Alice mi manderà il file criptato come preferisce (ad esempio via mail) ed avrà la certezza che solo io potrò leggerne il contenuto.

Decriptare un messaggio criptato con la chiave pubblica

Adesso che ho ricevuto il file segreto.gpg, dobbiamo decriptarlo per scoprire il contenuto! Fare ciò è ancora più facile che criptare, quello che dovremo fare è semplicemente usare questo comando:

gpg -d segreto.gpg

Anche in questo caso, volendo possiamo specificare un file di output (altrimenti verrà utilizzato lo stdout) usando il parametro --out


federicoponzi: ~ $ gpg -d segreto.gpg           
 
You need a passphrase to unlock the secret key for
user: "Federico Ponzi (Federico's key) "
2048-bit RSA key, ID 9362A5D8, created 2014-11-05 (main key ID AF820169)
 
gpg: gpg-agent is not available in this session
gpg: encrypted with 2048-bit RSA key, ID 9362A5D8, created 2014-11-05
      "Federico Ponzi (Federico's key) "
Questo e' un file che verra' criptato.
federicoponzi: ~ $ gpg -d --out risultato.txt segreto.gpg                                                                       
 
You need a passphrase to unlock the secret key for
user: "Federico Ponzi (Federico's key) "
2048-bit RSA key, ID 9362A5D8, created 2014-11-05 (main key ID AF820169)
 
gpg: gpg-agent is not available in this session
gpg: encrypted with 2048-bit RSA key, ID 9362A5D8, created 2014-11-05
      "Federico Ponzi (Federico's key) "
federicoponzi: ~ $ ls
risultato.txt messaggio-segreto.txt segreto.gpg
federicoponzi: ~ $ cat risultato.txt 
Questo e' un file che verra' criptato.