dimecres, 29 de febrer del 2012

Criptografia de clau pública amb GnuPG

Introducció

És molt possible que en alguna ocasió ens hagi sorgit la necessitat d'incrementar la seguretat en les nostres comunicacions per correu electrònic, o garantir l'autoria d'algun document, o la seva integritat.

Aquests són problemes antics i fa temps que se'ls ha donat respostes raonablement satisfactòries. Mai es pot garantir amb certesa absoluta la seguretat de les comunicacions, o l'autoria d'un document o la seva integritat, sobretot per la presència de factors humans. Però per la part del software, almenys es poden posar les coses prou difícils com per a que amb una tecnologia determinada  no sigui possible vulnerar la seguretat en un temps finit i raonablement "curt".

Les comunicacions segures amb organismes oficials o amb entitats financeres passen per l'utilització de certificats digitals. En aquest cas, unes institucions internacionals, les autoritats de certificació,  ens proporcionaran, per un preu, uns certificats digitals temporals de caràcter "universal" que vindran avalats per la confiança que hom té arreu del món en aquestes autoritats de certificació. 

Aquesta solució que és inevitable seguir quan hom tracta amb organismes oficials, o en solucions de comerç electrònic, pot resultar excessiva, o no gens convenient, quan es tracta de garantir la privacitat personal.

¿I si volem restringir estrictament la privacitat de les comunicacions entre nosaltres i els nostres interlocutors sense la intervenció de terceres parts i sense que calgui posar-se contínuament d'acord amb passwords o claus secretes?


GnuPG

Una de les eines més populars per a poder fer comunicacions privades segures, signar documents garantint-ne la seva autoria o la seva integritat (que ningú l'ha modificat sense el nostre permís) és el PGP (Pretty Good Privacy). PGP té un equivalent en el programari lliure: el GPG o GnuPG  (GNU Privacy Guard).

A Linux Ubuntu és possible que el tingueu instal·lat per defecte. En tot cas, des del Centre de Programari, o del Synaptic, es pot instal·lar (només cal cercar gpg) sense cap dificultat. Per a màquines Windows es pot instal·lar el Gpg4win que proporciona el gpg, eines per a gestionar claus, i integració amb l'explorador de windows, o amb Outlook.


Enigmail

En el món del programari lliure destacar entre d'altres que GnuPG s'integra amb el gestor de correu Mozilla Thunderbird mitjançant l'addon Enigmail.  


Documentació

Si algú vol conèixer detalls en profunditat sobre GnuPG, la referència és  Using the GNU Privacy Guard, també podem consultar The GNU Privacy Handbook (pdf), i en general, la pàgina de documentació de GnuPG


Criptografia de clau pública

Prenguem contacte amb GnuPG. Primer de tot, crearé el parell de claus privada i pública sobre el que es construeix la seguretat de la criptografia de clau pública de GnuPG.  

Vet aquí el plantejament de GnuPG: Nosaltres, i ningú més que nosaltres, som els guardians de la nostra clau privada que només coneixem nosaltres. No cal intercanviar cap password amb ningú.
La nostra clau pública, en canvi, la pot conèixer tothom.

Per a poder enviar un missatge xifrat a algú, ens cal la seva clau pública.
Per a poder dexifrar un missatge adreçat a nosaltres, ens cal la nostra clau privada.
Per a certificar que un missatge l'enviem nosaltres i que no ha estat alterat, el signem amb la nostra clau privada.
Per a verificar que un missatge l'ha enviat qui diu que l'ha enviat el verifiquem amb la clau pública de l'emissor.
Es pot signar (amb la nostra clau privada) i xifrar (amb la clau pública del destinatari) a l'hora un missatge que enviem.
Es pot verificar (amb la clau pública de l'emissor) i dexifrar (amb la nostra clau privada) a l'hora un missatge que rebem.

Tota l'estona estic parlant de "missatge" i hom podria pensar que em refereixo a missatges de correu electrònic. Però no és el cas. El "missatge" pot ser qualsevol fitxer que rebem per qualsevol via.


Criptografia de clau simètrica

Tanmateix, GnuPG també permet xifrar missatges mitjançant el sistema d'intercanvi de claus. Aquest sistema és el que es coneix com a criptografia de clau simètrica. És el que fem servir quan enviem o rebem un zip protegit amb password. Ens han de donar, o hem de donar, la clau per a poder-lo llegir.

Aleshores, WinZip o GnuPG? No hi ha una avantatge d'un sobre l'altre en quant a l'us de claus simètriques.  L'algorisme de xifrat de clau simètrica que fa servir GnuPG per defecte és el CAST5. Que és superior a l'algorisme de xifrat que emprava originalment WinZip (zip 2.0). Tanmateix, les versions actuals de WinZIP fan servir l'algorisme de xifrat AES. Una altre eina a tenir en compte és OpenSSL. Es tracta de programari lliure per a, entre moltes d'altres opcions, xifrar i desxifrar missatges fent servir criptografia de clau simètrica.


Criptografia híbrida

En realitat, GnuPG combina el xifrat simètric amb el xifrat de clau pública. Els missatges enviats es xifren amb una clau simètrica de sessió (només per a aquell missatge), que a la seva vegada es xifrada amb la clau pública. Tot plegat, missatge i clau, s'empaqueta i s'envia junt. Aleshores el destinatari fa servir la clau privada per desxifrar la clau de sessió i, a continuació, fent servir la clau de sessió, desxifrar el missatge. GnuPG és doncs, de forma més precisa, un esquema de criptografia híbrida. El motiu de fer-ho així és que és  menys costós computacionalment xifrar amb clau simètrica que amb asimètrica.

El criteri per a usar GnuPG, doncs, és per a emprar l'esquema de criptografia de clau pública en el que no cal intercanviar la clau simètrica. En criptografia de clau simètrica, el moment de l'intercanvi de la clau és el moment en que la comunicació és més vulnerable a un atac. En canvi, en la criptografia de clau pública, la vulnerabilitat depèn de la capacitat que tinguem de mantenir les claus privades en secret.


El programa gpg

Anem a tocar l'eina. Acabo d'instal·lar GnuPG amb synaptic. Faig un cop d'ull a les opcions de gpg:

albert@apolo:~$ gpg --help
gpg (GnuPG) 1.4.11
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


Home: ~/.gnupg
Algoritmes suportats:
Clau pública: RSA, RSA-E, RSA-S, ELG-E, DSA
Xifratge: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, 
          CAMELLIA192, CAMELLIA256
Dispersió: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compressió: No comprimit, ZIP, ZLIB, BZIP2


Sintaxi: gpg [opcions] [fitxers]
signa, comprova, xifra o desxifra
l'operació predeterminada depén de les dades introduïdes


Ordres:

 -s, --sign [fitxer]           crea una signatura
     --clearsign [fitxer]      crea una signatura en text clar
 -b, --detach-sign             crea una signatura separada
 -e, --encrypt                 xifra dades
 -c, --symmetric               xifra només amb xifratge simètric
 -d, --decrypt                 desxifra dades (predeterminat)
     --verify                  verifica una signatura
     --list-keys               llista claus
     --list-sigs               llista claus i signatures
     --check-sigs              list and check key signatures
     --fingerprint             llista claus i empremtes digitals
 -K, --list-secret-keys        llista claus secretes
     --gen-key                 genera un nou parell de claus
     --delete-keys             elimina claus de l'anell públic
     --delete-secret-keys      elimina claus de l'anell secret
     --sign-key                signa una clau
     --lsign-key               signa una clau localment
     --edit-key                signa o edita una clau
     --gen-revoke              genera un certificat de revocació
     --export                  exporta claus
     --send-keys               exporta claus a un servidor de claus
     --recv-keys               importa claus d'un servidor de claus
     --search-keys             cerca claus en un servidor de claus
     --refresh-keys            actualitza totes les claus des d'un servidor de claus
     --import                  importa/fon claus
     --card-status             print the card status
     --card-edit               change data on a card
     --change-pin              change a card's PIN
     --update-trustdb          actualitza la base de dades de confiança
     --print-md algo [fitxers]   
                               imprimeix resums de missatges


Opcions:

 -a, --armor                   crea eixida amb armadura ascii
 -r, --recipient NOM           xifra per a NOM
 -u, --local-user              usa aquest id per a signar o desxifrar
 -z N                          nivell de compressió N (0 no comprimeix)
     --textmode                usa el mode de text canònic
 -o, --output                  fitxer d'eixida
 -v, --verbose                 detall
 -n, --dry-run                 no fa cap canvi
 -i, --interactive             pregunta abans de sobreescriure
     --openpgp                 use strict OpenPGP behavior
     --pgp2                    generate PGP 2.x compatible messages


(En la pàgina del man hi ha una llista completa d'ordres i d'opcions)


Exemples:


 -se -r Bob [fitxer]        signa i xifra per a l'usuari Bob
 --clearsign [fitxer]       crea una signatura en text clar
 --detach-sign [fitxer]     crea una signatura separada
 --list-keys [noms]         mostra claus
 --fingerprint [noms]       mostra empremtes digitals


Si us plau, informeu sobre els errors a <gnupg-bugs@gnu.org>.

Tanmateix, amb --help no s'obtenen totes les opcions.  Per a obtenir un llistat de totes les opcions de gpg, cal consultar el manual: a un terminal fem man pgp.


Generar claus

El primer de tot:  Genero les claus amb gpg --gen-key. Fixem-nos com ens permet seleccionar el tipus de clau, el temps de validesa (he triat 1 any), un ID que es construeix amb el nom i cognoms, adreça electrònica i un comentari, i ens demana també un password per xifrar la clau privada. Aquesta password ens la demanarà sempre que ens calgui la clau privada. El password NO és la clau privada. Però ens caldrà el password per a poder-la utilitzar. Trobem novament una clau simètrica per protegir, en aquest cas, la clau privada; però aquí no hem d'intercanviar la password amb ningú. Al contrari. El que cal és que ningú més que nosaltres conegui aquest password.


albert@athena:~$ gpg --gen-key
gpg (GnuPG) 1.4.11; Copyright (C) 2010 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.

gpg: directory `/home/albert/.gnupg' created
gpg: s'ha creat el nou fitxer d'opcions «/home/albert/.gnupg/gpg.conf»
gpg: AVÍS: les opcions en «/home/albert/.gnupg/gpg.conf» encara no estan actives durant aquesta execució
gpg: s'ha creat l'anell «/home/albert/.gnupg/secring.gpg»
gpg: s'ha creat l'anell «/home/albert/.gnupg/pubring.gpg»
Seleccioneu quin tipus de clau voleu:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (només signar)
   (4) RSA (només signar)
La vostra selecció? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
La grandària sol·licitada és 4096 bits
Especifiqueu el temps de validesa de la clau.
         0 = la clau no caduca
      <n>  = la clau caduca als n dies
      <n>w = la clau caduca a les n setmanes
      <n>m = la clau caduca als n mesos
      <n>y = la clau caduca als n anys
Indiqueu la validesa de la clau (0) 1y
Key expires at dj 21 feb 2013 21:30:51 CET
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) <heinrichh@duesseldorf.de>"

Nom i cognoms: Albert Baranguer Codina
Adreça electrònica: abaranguer@gmail.com
Comentari: clau personal
Heu triat l'identificador d'usuari:
    "Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>"

Canvia (N)om, (C)omentari, (E)mail o (O) d'acord / (X) ix o
Cal una contrasenya per a protegir la clau secreta.

Cal generar molts bits aleatòriament. És bona idea fer alguna altra cosa
(teclejar, moure el ratolí, usar els discos) durant la generació de
nombres primers; açò dóna oportunitat al generador de nombres aleatoris
d'aconseguir prou entropia.
..+++++
......+++++
Cal generar molts bits aleatòriament. És bona idea fer alguna altra cosa
(teclejar, moure el ratolí, usar els discos) durant la generació de
nombres primers; açò dóna oportunitat al generador de nombres aleatoris
d'aconseguir prou entropia.
...................................+++++
..............+++++
gpg: /home/albert/.gnupg/trustdb.gpg: s'ha creat la base de dades de confiança
gpg: key 7FCC9B65 marked as ultimately trusted
s'han creat i signat les claus pública i secreta.

gpg: s'està comprovant la base de dades de confiança
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: la pròxima comprovació de la base de dades de confiança serà el 2013-02-21
pub   4096R/7FCC9B65 2012-02-22 [expires: 2013-02-21]
      Key fingerprint = *********** demana'm el fingerprint! ***************
uid                  Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>
sub   4096R/B092F31D 2012-02-22 [expires: 2013-02-21]

albert@athena:~$


La meva clau pública!

Obtinc la clau pública, és el bloc en negreta:

albert@athena:~$ gpg --armor --output public-key.asc --export abaranguer
albert@athena:~$ cat public-key.asc 

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)


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
=+LAQ
-----END PGP PUBLIC KEY BLOCK-----


Si algú em vol enviar missatges xifrats amb GnuPG, ja pot fer-ho! ;-)


Fingerprint

Tothom que em vulgui enviar missatges xifrats haurà de tenir la meva clau pública.  Ara bé, si l'agafa de la web com pot estar-ne segur que és de veritat la meva clau pública? Haurà de verificar-ne el "fingerprint". L'empremta dactilar. Quan he generat la clau una de les línies m'ha informat del fingerprint de la clau:


pub   4096R/7FCC9B65 2012-02-22 [expires: 2013-02-21]
      Key fingerprint = *********** demana'm el fingerprint! ***************


Que he decidit no publicar a la web...

Aleshores, algú que rebi la meva clau pública hauria de posar-se en contacte amb mi d'alguna  forma segura per verificar que el fingerprint de la clau que té correspon amb el fingerprint que jo posseeixo. Si coincideixen l'usuari podrà la confiar que  ha rebut la meva clau pública.

Suposant que copia la clau pública a un fitxer de text anomenat abaranguer@gmail.com.pub.asc l'usuari haurà d'importar la meva clau pública al seu clauer.


Llistar les claus

... i podria començar per verificar les claus que són al clauer.

albert@apolo:~/Documents$ gpg --list-key
/home/albert/.gnupg/pubring.gpg
-------------------------------
pub   4096R/6E28AAB8 2012-02-26 [expires: 2017-02-24]
uid                  Albert Baranguer Codina (Clau Personal 2) <albert.baranguer@josoc.cat>
sub   4096R/3B954851 2012-02-26 [expires: 2017-02-24]


albert@apolo:~/Documents$ 

Només hi té la seva clau. El que ha de fer és...


Importar una clau

Tinc abaranguer@gmail.com.pub.asc a la carpeta Documents i faig:

albert@apolo:~/Documents$ gpg --import abaranguer@gmail.com.pub.asc 
gpg: key 7FCC9B65: public key "Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>" imported
gpg: Nombre total processat: 1
gpg:               importades: 1  (RSA: 1)
albert@apolo:~/Documents$ 

Verifico que he importat la clau

albert@apolo:~/Documents$ gpg --list-key
/home/albert/.gnupg/pubring.gpg
-------------------------------
pub   4096R/6E28AAB8 2012-02-26 [expires: 2017-02-24]
uid                  Albert Baranguer Codina (Clau Personal 2) <albert.baranguer@josoc.cat>
sub   4096R/3B954851 2012-02-26 [expires: 2017-02-24]


pub   4096R/7FCC9B65 2012-02-22 [expires: 2013-02-21]
uid                  Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>
sub   4096R/B092F31D 2012-02-22 [expires: 2013-02-21]


albert@apolo:~/Documents$


Obtenir el fingerprint

Quin és el fingerprint de la clau que acabo d'importar?

albert@apolo:~/Documents$ gpg --fingerprint
/home/albert/.gnupg/pubring.gpg
-------------------------------
pub   4096R/6E28AAB8 2012-02-26 [expires: 2017-02-24]
      Key fingerprint = ************* fingerprint 1 *************
uid                  Albert Baranguer Codina (Clau Personal 2) <albert.baranguer@josoc.cat>
sub   4096R/3B954851 2012-02-26 [expires: 2017-02-24]


pub   4096R/7FCC9B65 2012-02-22 [expires: 2013-02-21]
      Key fingerprint = ******* fingerprint clau importada ******
uid                  Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>
sub   4096R/B092F31D 2012-02-22 [expires: 2013-02-21]

O bé una de sola

albert@apolo:~/Documents$ gpg --fingerprint abaranguer@gmail.com
pub   4096R/7FCC9B65 2012-02-22 [expires: 2013-02-21]
      Key fingerprint = ******* fingerprint clau importada ******
uid                  Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>
sub   4096R/B092F31D 2012-02-22 [expires: 2013-02-21]


Servidors de claus

Recapitulem: fins ara he creat un parell de claus, una de privada que només conec jo i una de pública que he publicat a la web. Tothom que vulgui enviar-me missatges pot fer servir la clau pública per xifrar-los. Si vol estar-ne segur que la clau pública "és bona", hauria de posar-se en contacte amb mi per a verificar-ne el fingerprint.

Hi ha una altre opció per a fer això: puc publicar la clau a un servidor de claus. Els servidors de claus emmagatzemen i permeten examinar claus públiques. A més els servidors de claus repliquen la informació entre ells, de forma que quan hom publica la seva clau a un servidor, en pocs dies aquesta clau és disponible a la resta de servidors.

El camí contrari, "despublicar" del keyserver, demana pujar al servidor el certificat de revocació de la clau. El certificat de revocació el podem generar amb el mateix GnuPG.  Es recomana generar el certificat just al mateix moment en que hom crea el parell de claus.

Si hagués publicat la clau a un keyserver ara, en comptes de publicar la clau a la web, en tindria prou amb publicar-ne l'ID. L'ID de la clau és aquest número que he obtingut al generar.

pub   4096R/7FCC9B65 2012-02-22 [expires: 2013-02-21]

Aleshores qualsevol usuari podria utilitzar l'ID per cercar la clau i descarregar-se-la dels keyservers.

I un usuari amb qui no ens coneixem de res, perquè se n'hauria de refiar d'aquesta clau descarregada d'un keyserver?


Xarxa de confiança

Per a poder respondre a aquesta pregunta cal explicar primer que quan un usuari rep una clau pública,  en verifica el fingerprint  i te confiança en el propietari, aleshores pot signar la clau pública rebuda amb la seva pròpia clau privada. Aquesta clau pública té un plus afegit de confiança: un usuari en certifica la seva validesa. Aquesta clau pública signada es podria passar a un altre usuari que, en cas de verificar el fingerprint  o, senzillament, perquè confia en l'usuari que ha signat la clau podria, a la seva vegada, signar ell també la clau.

Cada cop que algú signa la nostra clau pública està certificant que la clau és de confiança. Com més signatures té la clau, vol dir que més gent certifica que "és bona". A més, cadascun d'aquest usuaris pot tenir la seva pròpia clau pública amb signatures d'altres usuaris.  Aquesta xarxa de signatures de la que participa la nostra clau és la seva "xarxa de confiança" (web of trust).

Tanmateix, hom podria desconfiar d'algunes de les claus de la xarxa de confiança. En aquest cas GnuPG permet afegir un indicador de "confiança"  (mireu també aquí) sobre les diferents persones que han signat. Des del "desconegut", passant pel "cap confiança", "hi confio" fins al "confio com si fos jo mateix". En tot cas, aquest indicador és d'us personal i no es posa a la clau.

La resposta, doncs, a la pregunta de perquè un usuari se n'hauria de refiar de la clau descarregada del key server és que no té perquè fer-ho, però pot pensar que una clau pública que estigui signada per uns quants usuaris, o que pertany o toca a la seva xarxa de confiança pot ser, raonablement, de confiança.


Festa de firmes!

Els grups d'usuaris de PGP / GnuPG convoquen de tant en tant les "Festes de Firmes" (key signing party). Que es un esdeveniment en que els participants s'intercanvien les seves fingerprint després d'haver verificat mutuament  les identitats, per exemple amb el DNI, de forma que, en acabar l'acte, amb els fingerprint de les claus públiques d'altres participants, les descarreguen del keyserver, en verifiquen els fingerprint, les signen i les redifonen. Es tracta d'una forma lúdica d'ampliar la xarxa de confiança (podríem veure-ho com una xarxa social més, en definitiva).

En to cas, podem fer servir GnuPG sense que calgui la xarxa de confiança.


Signar

Un cop explicats aquests conceptes, passem a qüestions més pràctiqes

Com signo un document? Vaig a generar un document de prova (loremipsum.txt) en que hi posaré un paràgraf del Lorem ipsum (el genero amb aquesta web: http://ca.lipsum.com/

Per a signar-lo amb la clau privada faig


gpg --sign loremipsum.txt

Observem que gpg ens demana la password de la clau privada. El resultat eś el fitxer xifrat amb extensió loremipsum.txt.gpg. 

Si volgués que el fitxer fos ilegible i amb un altre nom faria:

gpg --armor --output signat.txt --sign loremipsum.txt

També podria voler que el text original es pogués llegir "en clar", i que la signatura estigués separada en el mateix fitxer. Aleshores faria

gpg  --output signat.2.txt --clearsign loremipsum.txt

Però si el document original amb el missatge no admetés la inclusió de cap signatura, el que es podria fer és posar la signatura en un fitxer signatura.txt apart. A més el vull fer legible. Ho faig així:

gpg --armor --output signatura.txt --detach-sign loremipsum.txt

Depenent del cas, enviaré el document signat, o la signatura i el document en fitxers separats, al seu destinatari. Aquest, un cop rebi el document signat, el verificarà amb la meva clau pública.


Verificar la signatura

El receptor del missatge podria verificar amb

gpg --verify loremipsum.txt.gpg

( o amb signat.txt, o signat.2.txt )

En aquest cas obtindrem un missatge


albert@apolo:~/Documents$ gpg --verify signatura.txt loremipsum.txt
gpg: Signature made dt 28 feb 2012 22:55:35 CET using RSA key ID 7FCC9B65
gpg: Good signature from "Albert Baranguer Codina (Clau Personal) <abaranguer@gmail.com>"


o bé, si venen per separat:

gpg --verify signatura.txt loremipsum.txt

Primer ha d'anar la signatura, i després el document que s'ha signat. En cas de posar-los en l'ordre invers, obtindrem un missatge d'error:


albert@apolo:~/Documents$ gpg --verify loremipsum.txt signatura.txt 
gpg: no s'han trobat dades OpenPGP vàlides.
gpg: no s'ha pogut verificar la signatura.
Recordeu que el fitxer de signatura (.sig o .asc)
ha de ser el primer que figure en la línia d'ordres.


Xifrar un missatge

Per a fer la prova, enviaré  el loremipsum.txt xifrat a l'usuari unaltrecompte@servidor.com, del qual tinc la clau pública.

Tinc algunes claus públiques més al clauer. Per tant he de triar la del destinatari. Ho faig amb l'opció --recipient i l'ID de la clau.

Vet aquí:


albert@athena:~/Documents$ gpg --armor --output xifrat.txt --recipient 6E28AAB8 --encrypt loremipsum.txt
gpg: 3B954851: There is no assurance this key belongs to the named user


pub  4096R/3B954851 2012-02-26 Albert Baranguer Codina (Clau Personal 2) <unaltrecompte@servidor.com>
 Empremta digital de la clau primària: xxxx xxxx xxxx xxxx xxxx  xxxx xxxx xxxx xxxx xxxx
      Empremta digital de la subclau: xxxx xxxx xxxx xxxx xxxx  xxxx xxxx xxxx xxxx xxxx


It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.


Use this key anyway? (y/N) y


Les claus públiques del meu clauer no les he signat ni tenen cap signatura de ningú de "confiança absoluta", per tant rebo un missatge d'advertència. Podria signar la clau i marcar el destinatari com "de confiança absoluta, com si fos jo mateix", (de fet, ho soc! ;-) de forma que m'estalviaria aquest missatge.


Signar una clau pública

Primer miro les claus del clauer


albert@athena:~$ gpg --list-keys
/home/albert/.gnupg/pubring.gpg
-------------------------------
pub   4096R/7FCC9B65 2012-02-22 [expires: 2013-02-21]
uid                  Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>
sub   4096R/B092F31D 2012-02-22 [expires: 2013-02-21]


pub   2048R/D826822A 2012-02-23 [expires: 2017-02-21]
uid                  Serveis TIC i Programari Lliure <stsoftlliure@gmail.com>
sub   2048R/9D8D4AA0 2012-02-23 [expires: 2017-02-21]


pub   4096R/6E28AAB8 2012-02-26 [expires: 2017-02-24]
uid                  Albert Baranguer Codina (Clau Personal 2) <unaltrecompte@servidor.com>
sub   4096R/3B954851 2012-02-26 [expires: 2017-02-24]

I em fixo en els seus ID. Abans de signar-les hauria de comprovar-ne els fingerprint per estar-ne segur de la seva autenticitat. En aquest cas ho considero fet. Totes són  claus de prova.

Per tant, puc passar a signar la clau corresponent 



albert@athena:~$ gpg --sign-key 6E28AAB8


pub  4096R/6E28AAB8  created: 2012-02-26  expires: 2017-02-24  usage: SC  
                     trust: desconeguda   validity: desconeguda
sub  4096R/3B954851  created: 2012-02-26  expires: 2017-02-24  usage: E   
[ unknown] (1). Albert Baranguer Codina (Clau Personal 2) <unaltrecompte@servidor.com>




pub  4096R/6E28AAB8  created: 2012-02-26  expires: 2017-02-24  usage: SC  
                     trust: desconeguda   validity: desconeguda
 Empremta digital de la clau primària: C6EC 5EAF 31BE C8D9 6644  200F 1849 3E7D 6E28 AAB8


     Albert Baranguer Codina (Clau Personal 2) <unaltrecompte@servidor.com>


Aquesta clau caducarà el 2017-02-24.
Are you sure that you want to sign this key with your
key "Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>" (7FCC9B65)


Really sign? (y/N) y


Cal una contrasenya per desblocar la clau secreta de
l'usuari: «Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>» "
4096-bit RSA key, ID 7FCC9B65, created 2012-02-22


gpg: gpg-agent no està disponible en aquesta sessió
                           
albert@athena:~$

Veifico que realment ha signat


albert@athena:~$ gpg --list-sigs
gpg: s'està comprovant la base de dades de confiança
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   2  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: depth: 1  valid:   2  signed:   0  trust: 2-, 0q, 0n, 0m, 0f, 0u
gpg: la pròxima comprovació de la base de dades de confiança serà el 2013-02-21
/home/albert/.gnupg/pubring.gpg
-------------------------------
pub   4096R/7FCC9B65 2012-02-22 [expires: 2013-02-21]
uid                  Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>
sig 3        7FCC9B65 2012-02-22  Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>
sub   4096R/B092F31D 2012-02-22 [expires: 2013-02-21]
sig          7FCC9B65 2012-02-22  Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>


pub   2048R/D826822A 2012-02-23 [expires: 2017-02-21]
uid                  Serveis TIC i Programari Lliure <stsoftlliure@gmail.com>
sig 3        D826822A 2012-02-23  Serveis TIC i Programari Lliure <stsoftlliure@gmail.com>
sub   2048R/9D8D4AA0 2012-02-23 [expires: 2017-02-21]
sig          D826822A 2012-02-23  Serveis TIC i Programari Lliure <stsoftlliure@gmail.com>


pub   4096R/6E28AAB8 2012-02-26 [expires: 2017-02-24]
uid                  Albert Baranguer Codina (Clau Personal 2) <unaltrecompte@servidor.com>
sig 3        6E28AAB8 2012-02-26  Albert Baranguer Codina (Clau Personal 2) <unaltrecompte@servidor.com>
sig          7FCC9B65 2012-02-29  Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>
sub   4096R/3B954851 2012-02-26 [expires: 2017-02-24]
sig          6E28AAB8 2012-02-26  Albert Baranguer Codina (Clau Personal 2) <unaltrecompte@servidor.comt>


albert@athena:~$ 

Aquí podem comprovar que tota signatura públic té, almenys, una signatura, que,es la de la seva parella clau privada. El compte unaltrecompte@servidor.com té, doncs dues signatures, la de la seva parella privada i la que li acabo de posar.

Ara que tinc la clau pública de unaltrecompte@servicor.com signada, repeteixo el xifrat del loreipsum.txt


albert@athena:/media/ADATA UFD/docs$ gpg --armor --output xifrat.2.txt --recipient 6E28AAB8 --encrypt loremipsum.txt
albert@athena:/media/ADATA UFD/docs$




El resultat és que obtinc el fitxer xifrat.2.txt netament, sense cap missatge d'advertència.


Xifrar i signar un missatge

Però, i si el destinatari volgués tenir la certesa que el fitxer l'he enviat jo? Ben mirat, algú em podria haver suplantat i enviar el missatge enlloc meu. El que cal fer, per a eliminar aquest dubte, és signar i xifrar a l'hora el document.

A l'exemple, faig:


albert@athena:/media/ADATA UFD/docs$ gpg --armor --output xifrat.4.txt --recipient 6E28AAB8 --sign --encrypt loremipsum.txt


Cal una contrasenya per desblocar la clau secreta de
l'usuari: «Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>» "
4096-bit RSA key, ID 7FCC9B65, created 2012-02-22


gpg: gpg-agent no està disponible en aquesta sessió
albert@athena:/media/ADATA UFD/docs$ 

i obtinc el fitxer  xifrat i signat xifrat4.txt.  Com sempre que cal fer alguna acció amb la clau privada, gpg m'ha demanat la password per a poder  fer-la servir.


I què hauria passat si la clau no hagués estat signada?

albert@athena:~/Documents$ gpg --armor --output xifrat.2.txt --recipient 6E28AAB8 --sign --encrypt loremipsum.txt


Cal una contrasenya per desblocar la clau secreta de
l'usuari: «Albert Baranguer Codina (clau personal) <abaranguer@gmail.com>» "
4096-bit RSA key, ID 7FCC9B65, created 2012-02-22


gpg: gpg-agent no està disponible en aquesta sessió
gpg: 3B954851: There is no assurance this key belongs to the named user


pub  4096R/3B954851 2012-02-26 Albert Baranguer Codina (Clau Personal 2) <unaltrecompte@servidor.com>
 Empremta digital de la clau primària: xxxx xxxx xxxx xxxx xxxx  xxxx xxxx xxxx xxxx xxxx
      Empremta digital de la subclau: xxxx xxxx xxxx xxxx xxxx  xxxx xxxx xxxx xxxx xxxx


It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.


Use this key anyway? (y/N) y
albert@athena:~/Documents$ 

Primer em demana la password de la clau privada. A continuació m'adverteix que la clau pública del destinatari no està signada. El resultat, en tot cas, és el fitxer xifrat.2.txt


Desxifrar

Ara tinc uns quants fitxers xifrats que només podrà dexifrar  unaltrecompter@servidor.com.

És el més senzill de tot: dexifrar és l'opció per defecte de gpg, per tant, n'hi ha prou amb fer...


albert@apolo:/media/ADATA UFD/docs$ gpg xifrat.txt


Cal una contrasenya per desblocar la clau secreta de
l'usuari: «Albert Baranguer Codina (Clau Personal 2) <unaltrecompte@servidor.com>» "
4096-bit RSA key, ID 3B954851, created 2012-02-26 (main key ID 6E28AAB8)


gpg: gpg-agent no està disponible en aquesta sessió
gpg: encrypted with 4096-bit RSA key, ID 3B954851, created 2012-02-26
      "Albert Baranguer Codina (Clau Personal 2) <unaltrecompte@servidor.com>"
gpg: xifrat.txt: el sufix és desconegut
Introduïu el nou nom del fitxer [loremipsum.txt]: loremipsum.decrypt.txt
albert@apolo:/media/ADATA UFD/docs$ 

Com que per a dexifrar cal la clau privada, el gpg demana el password corresponent.

En examinar loremipsum.decrypt.txt obtinc, com era d'esperar el paràgraf de Lorem Ipsum original.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dignissim lobortis auctor. Nunc sem sapien, egestas eu dignissim non, molestie sit amet mi. In diam lacus, fermentum et mollis quis, pellentesque id enim. Nullam pretium, dolor non malesuada viverra, eros odio convallis arcu, eu tincidunt libero purus sit amet purus. Praesent eu aliquet nunc. Sed vitae augue lacus. Duis fermentum purus sed ligula malesuada nec ornare orci posuere. Etiam ac facilisis turpis.  



Per acabar

En el post dedicat a gpg he fet un repàs dels principals conceptes que cal conèixer per a utilitzar GnuPG. He esmentat altres eines relacionades, com Enigmail. He  distingit entre criptografia de clau simètrica, de clau pública, i híbrida.  També he parlat de les xarxes de confiança que es poden implementar  els intercanvis de claus públiques de GnuPG. He presentat les accions principals que es poden realitzar amb GnuPG, que són signar, xifrar, verificar i dexifrar.

En cap cas he pretès realitzar una anàlisi exhaustiva de l'eina. Hi han molts i bons manuals fets que acompleixen aquesta missió i n'he citat alguns.

Finalment, el resultat d'aquest post és que penjaré la meva clau pública a la web. Per si algú prefereix entrar en contacte amb Serveis TIC i Programari Lliure de forma privada.