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.
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.txtAdesso 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.txtfacendo 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.txtDove:
- -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.gpgAnche 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.