Criptografia amb GPG

De wikijoan
Salta a la navegació Salta a la cerca

Introducció

Farem una introducció a la criptografia i als gestors de claus de xifratge en un sistema GNU/Linux. L'objectiu final és poder xifrar i signar documents, que només puguin visualitzar aquelles persones amb les quals compartim la nostra clau pública.

Referències

La pràctica està basada en aquests documents:

Miniteoria

Què és la criptografia asimètrica?

La criptografia asimètrica és el mètode criptogràfic que fa servir una parella de claus complementàries, la pública i la privada, per xifrar documents o missatges. Aquells documents codificats amb una clau privada necessiten la clau pública corresponent per poder descodificar-los. I el mateix passa al revés: els documents codificats amb una clau pública només es poden descodificar amb una clau privada. La clau privada només la pot conèixer el propietari, mentre que la clau pública es pot donar a conèixer obertament.

El fet que la clau privada només estigui a l'abast del propietari permet dues coses importants:

  • Qualsevol document generat a partir d'aquesta clau privada ha d'haver estat generat pel propietari de la clau (signatura electrònica).
  • Un document al qual s'ha aplicat la clau pública només pot obrir-lo el propietari de la clau pública amb la clau privada corresponent (xifratge electrònic).

Què és un certificat electrònic?

Un certificat electrònic és un document emès i signat per una autoritat de certificació que identifica una persona (física o jurídica) amb una parella de claus. Un certificat conté la informació que s'indica tot seguit:

  • Identificació del titular del certificat (nom del titular, NIF, correu electrònic, etc.).
  • Distintius del certificat: número de sèrie, entitat que l'emet, data d'emissió, període de validesa del certificat, etc.
  • Una parella de claus: pública i privada.
  • La signatura electrònica del certificat amb la clau de l'autoritat de certificat (AC) que el va emetre.

Tota aquesta informació es pot dividir en dues parts:

  • Part privada del certificat: clau privada.
  • Part pública del certificat: resta de dades del certificat, inclosa la signatura electrònica de l'autoritat de certificació que el va emetre.

La part privada mai no és cedida pel propietari. Aquesta és la base de la seguretat. Amb la parella de claus es poden aplicar funcions de xifratge, amb la peculiaritat que allò que es xifra amb la clau privada només es pot verificar amb la pública i a l'inrevés.

Desenvolupament

gpg (GNU Privacy Guard) és una utilitat de consola per a xifrar i signar; seahorse és una utilitat gràfica (Gestors de claus de xifratge).

Comprovem que el tenim instal.lats, i si no, ho fem:

$ gpg
gpg: directory `/home/joan/.gnupg' created
gpg: s'ha creat el nou fitxer d'opcions «/home/joan/.gnupg/gpg.conf»
gpg: AVÍS: les opcions en «/home/joan/.gnupg/gpg.conf» encara no estan actives durant aquesta execució
gpg: s'ha creat l'anell «/home/joan/.gnupg/secring.gpg»
gpg: s'ha creat l'anell «/home/joan/.gnupg/pubring.gpg»
gpg: Endavant, escriviu el missatge...

efectivament ho tenim instal.lat. Fem Ctrl-C per aturar, doncs ara no podem encriptar cap missatge perquè no tenim cap clau. Afegirem una clau en mode gràfic amb seahorse:

$ seahorse

creació de claus. Xifratge i signatura amb seahorse

$ seahorse

Ctrl-N, anem a crear una nova clau. Escollim Clau PGP, i fiquem el nostre nom i mail. Escollim un sistema de xifratge, per exemple DSA ElGamal. Fiquem una clau de pas, o com es suggereix en el tutorial, busquem una clau de pas que sigui forta.

Aleshores es genera la clau (triga una estona). S'ha creat la clau dins de la pestanya claus personals. Ara he de dir que aquesta clau és meva, és a dir, he de signar la clau (Fitxer > Signa la clau).

Ara Exportem aquesta clau a un fitxer, per tal de fer-la pública i així que d'altres la pguguin utilitzar. Fitxer > Exporta, i creem un fitxer amb extensió .asc. És interessant obrir aquesta fitxer amb un editor de text:

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

mQMuBE5pO4kRCACWHlF+Aiz3Lywr1w
...

Com veiem en Propietats de la clau, hem fet una clau PGP privada (privada perquè és personal). Però si aquesta clau la distribuim, de fet és una clau pública. Ara que ja tenim una clau pública, podem fer una comunicació xifrada amb GPG amb un altre usuari.

intercanvi de les claus públiques

per tal de poder tenir una comunicació constant amb GPG ha d'haver-hi els següents requeriments, pensant en una conversa entre dues persones:

  • ambdós han d'haver generat la seva clau
  • han d'exportar les seves claus públiques i intercanviar-les entre ells.

Així doncs, un segon usuari fa el mateix procés. S'intercanvien les claus (per exemple enviant-les com a adjunt per mail), i s'importa la clau (Fitxer > Importa)

enviar un fitxer signat i encriptat. El destinatari el desencripta.

Per poder encriptar un fitxer de text directament des del Nautilus, hem d'instal.lar una extensió del seahorse:

$ sudo apt-get install seahorse-plugins

Tancar la sessió i tornar a logar-se, ara ja, amb el botó dret sobre el fitxer que volem encriptar, podem veure el menu xifra i signa.

Així doncs tenim un fitxer de text que volem enviar per mail a un company. Aquest fitxer el signem (es genera el fitxer .sig) i el xifrem (es genera el fitxer .pgp). Tant el fitxer .sig com el fitxer .pgp són binaris.

Aquests dos fitxers els enviem com a adjunt al company. Aquest company, en obrir-lo, necessitarà posar la seva clau de pas (no la del company) per tal de desxifrar el document. Alhora que es desxifra el document, el sistema ens informa que la signatura és bona.

Enviar un mail encriptat (Firefox i Gmail)

FireGPG és un complement per a Firefox, que permet enviar missatges xifrats des de l'entorn de Gmail.

$ sudo apt-get install xul-ext-firegpg

És un plugin de Firefox i que té un assistent de configuració. En l'assistent habilitem el suport per a Gmail, i cliquem les opcions signa, xifra i adjunts (signarem i xifrarem el contingut del mail, i també els possibles adjunts que enviem). En la següent pantalla deixem l'opció per defecte habiliat la detecció inline.

Ara fixem-nos que en les preferències del Firefox, apartat Avançat, hi ha la pestanya Xifratge (ho visualitzem). A Eines > Complements puc veure el plugin FirePGP i totes les seves preferències. I a Eines > FirePGP tenim múltiples opcions per treballar amb missatges xifrats. Concretament hi ha un editor (Obre l'editor) que va molt bé per fer proves de signatura i xifratge.

Amb un compte de Gmail de què es disposi, enviem un mail xifrat, i el receptor l'haurà de desxifrar. Per fer-ho seleccionem el cos del missatge, i al Mozilla (cerquem complement FireGPG) xifrem el missatge. Recordem:

  • si el xifrem amb una clau pública, només el propietari de la clau el podrà obrir/desencriptar
  • si el xifrem amb la nostra clau privada, els que rebin el missatge el podran desencriptar amb la nostra clau pública, i tindran la certesa i autenticitat de quin és l'origen del mail.

utiltizar gpg en mode comanda

Totes les anteriors opcions es poden fer en línia de comanda. Com es veu en la man page ($ man pgp) hi ha múltiples opcions.

NAME
       gpg - OpenPGP encryption and signing tool

SYNOPSIS
       gpg [--homedir dir] [--options file] [options] command [args]

DESCRIPTION
       gpg  is the OpenPGP part of the GNU Privacy Guard (GnuPG). It is a tool
       to provide digital encryption and signing services  using  the  OpenPGP
       standard.  gpg features complete key management and all bells and whis‐
       tles you can expect from a decent OpenPGP implementation.

       This is the standalone version of gpg.  For desktop use you should con‐
       sider using gpg2.
$ gpg --list-keys 
/home/joan/.gnupg/pubring.gpg
-----------------------------
pub   2048D/DF96AF63 2011-09-08
uid                  Joan Quintana (Joan Quintana) <joan_quintana@yahoo.com>
sub   2048g/B43647C6 2011-09-08

pub   2048R/8B91239A 2011-09-08
uid                  pere quintana (pere) <pere@gmail.com>
sub   2048R/6C9BB6B3 2011-09-08
$ gpg --fingerprint
/home/joan/.gnupg/pubring.gpg
-----------------------------
pub   2048D/DF96AF63 2011-09-08
      Key fingerprint = CE1D 4D91 FA77 4143 CDB1  3C88 513D C034 DF96 AF63
uid                  Joan Quintana (Joan Quintana) <joan_quintana@yahoo.com>
sub   2048g/B43647C6 2011-09-08

pub   2048R/8B91239A 2011-09-08
      Key fingerprint = 729C 51ED 12C8 D550 6438  010E 1289 C25C 8B91 239A
uid                  pere quintana (pere) <pere@gmail.com>
sub   2048R/6C9BB6B3 2011-09-08

Anem a encriptar i desencriptar un fitxer utiltizant gpg en línia de comanda.

per signar i encriptar el fitxer xopen.c per a l'usuari pere:

$ gpg -se -r pere xopen.c

es genera xopen.c.gpg

De la man page:

...
   Key related options

       --recipient name

       -r     Encrypt for user id name. If this option  or  --hidden-recipient
              is  not  specified, GnuPG asks for the user-id unless --default-
              recipient is given.
...

Per desencriptar aquest fitxer:

$ gpg -d xopen.c.gpg
o bé podem canviar-li el nom de destí en el moment de desencriptar:
$ gpg -o xopen2.c -d xopen.c.gpg 

Servidors de claus

una clau pública la podem exportar a un servidor de claus, i així es facilita la feina de propagar la clau pública. Per exemple, dos servidors de claus són

Com que són servidors de claus públiques, podem enviar allà la nostra clau, o bé cercar la clau d'algú. Per exemple, rebem un document i ens diuen que per obrir-lo necessitem una clau de tal persona que està hostatjada al servidor de claus de rediris. Per exemple, cercar la clau de Joan Quintana a keyserver.ubuntu.com:

pub  2048D/DF96AF63 2011-09-08            

uid Joan Quintana (Joan Quintana) <joan_quintana@yahoo.com>
sig  sig3  DF96AF63 2011-09-08 __________ __________ [selfsig]

sub  2048g/B43647C6 2011-09-08            
sig sbind  DF96AF63 2011-09-08 __________ __________ []

Així doncs, podem enviar la clau al servidor de claus d'Ubuntu:

$ gpg --send-keys DF96AF63 --keyserver keyserver.ubuntu.com
gpg: "--keyserver" not a key ID: skipping
gpg: "keyserver.ubuntu.com" not a key ID: skipping
gpg: sending key DF96AF63 to hkp server keys.gnupg.net

Cas d'ús: repositoris d'Ubuntu

PPA:Personal Package Archives

Des del punt de vista de l'usuari, els Personal Package Archives (PPA) són repositoris no oficials on hi ha paquets d'Ubuntu que pots instal.lar de la mateixa manera de sempre: sudo apt-get install paquet.

Des del punt de vista del desenvolupador: si un desenvolupador té un programa escrit per exemple en llenguatge C, per compilar aquest programa necessita linkar-ho amb unes llibreries, etc. Un cop compilat (amb make o gcc) es genera un binari. Instal.lar un binari significa copiar l'executable al lloc adient (/usr/bin), però també s'han de crear enllaços amb les llibreries necessàries, etc. Una solució pot ser que tot aquest procés (compilació, instal.lació, dependències) es faci amb un paquet Debian (fitxer .deb). Crear el paquet Debian es pot fer manualment pas a pas (per exemple, ha d'incloure un man page). Però si el desenvolupador treballa amb un sistema que es diu Launchpad, tota aquesta part de crear el paquet .deb a partir del codi font es fa automàtica. Per tant, el desenvolupador pot pujar el codi a Launchpad i allà es compilaran i crearan els paquets Debian. Però a més, allí es publicaran com un repositori apt per tal que els usuaris els puguin descarregar de forma fàcil.

Per tant, utilitzar repositoris oficials i no-oficials (PPA) té avantatge per a l'usuari final, però també per al desenvolupador. Entre d'altres, el desenvolupador que treballi en la plataforma Launchpad es pot beneficiar de:

  • control de versions
  • SVN (subversion): qui vulgui es pot descarregar el codi més nou d'un projecte.
  • gestió de bugs/incidències
  • fòrums, estadístiques.

Què té a veure això amb la pràctica actual? Doncs que els repositoris i paquets han d'estar ben certificats. Si jo em descarrego un paquet, he de tenir la garantia que em descarrego el paquet que vull i no cap altre que l'hagi suplantat.

Aquesta és la sortida per pantalla quan afegeixo el repositori d'Autostatic (Jeremy Jongepier) d'Ubuntu:

$ sudo add-apt-repository ppa:autostatic/ppa
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /etc/apt/secring.gpg --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver keyserver.ubuntu.com --recv 396D45EF7CF7522705D16A338FC08CE7A1BCC7B0
gpg: requesting key A1BCC7B0 from hkp server keyserver.ubuntu.com
gpg: key A1BCC7B0: public key "Launchpad AutoStatic's PPA" imported
gpg: Nombre total processat: 1
gpg:               importades: 1  (RSA: 1)

Un cop afegit el repositori, per tal que estigui disponible:

$ sudo apt-get update

i ara ja puc instal.lar un paquet que estigui en el repositori:

$ sudo apt-get install recordmydesktop

Veiem que Ubuntu té el seu servidor de claus (keyserver.ubuntu.com), i que el PPA d'Autostatic té la clau pública A1BCC7B0. Entre aquesta clau pública (que coneix tothom) i la clau secreta que s'ha generat s'estableix una relació de confiança.

Més informació a:

Your PPA's key

Launchpad generates a unique key for each PPA and uses it to sign any packages built in that PPA.

This means that people downloading/installing packages from your PPA can verify their source. After you've activated your PPA, uploading its first package causes Launchpad to start generating your key, which can take up to a couple of hours to complete.

Your key, and instructions for adding it to Ubuntu, are shown on the PPA's overview page. 

En aquest cas s'ha instal.lat el paquet recordmydesktop compilat amb compatibilitat per a JACK (el paquet recordmydesktop existeix en els repositoris generals però sense compatibilitat per a JACK. recordmydesktop serveix per fer videos (screencasts) de la pantalla, i que tingui compatibilitat per a JACK vol dir que l'audio es pot redirigir a un client de JACK (JACK és un servidor d'audio).

Feina a realitzar

Seguiràs pas a pas la pràctica per tal de practicar el xifratge GPG (xifratge i signatura), tant en mode comanda (gpg) com en mode gràfic (seahorse, Nautilus).

La pràctica la pots fer tu sol (crees dues claus GPG corresponents a dos usuaris, no cal intercanviar les claus públiques doncs resideixen en la mateixa màquina,...); o bé més interessant treballes per parelles i amb el teu company us intercanvieu les claus públiques i us envieu per mail els missatges xifrats.

Recordem:

Aquells documents codificats amb una clau privada necessiten la clau pública corresponent per poder descodificar-los. I el mateix passa al revés: els documents codificats amb una clau pública només es poden descodificar amb una clau privada. La clau privada només la pot conèixer el propietari, mentre que la clau pública es pot donar a conèixer obertament.

Quan l'usuari A i l'usuari B intercanvien les seves claus públiques, la pràctica que es pot fer és doble:

1) l'usuari A aplica la clau pública de B a un missatge, i per tant només l'usuari B pot obrir aquest missatge amb la seva clau privada.

2) l'usuari A aplica la seva clau privada a un missatge, i l'usuari B pot obrir aquest missatge aplicant la clau pública de A.

Entrega

Entrega al Schoology la documentació generada i els fitxers generats, i un fitxer README on fiquis les teves anotacioins. També m'envies el resultat de:

$ gpg --list-keys
$ gpg --list-public-keys
$ gpg --list-secret-keys
$ gpg --list-sigs
$ gpg --fingerprint

obligatori, per entregar al professor.: Enviar un missatge xifrat al professor. Per fer-ho, en un primer mail enviaràs la clau pública. En el segon mail enviaràs un missatge xifrat. Aquest missatge serà una pregunta prou fàcil com perquè el professor la pugui contestar (per ex, quina és la capital d'Estats Units?). El professor haurà de respondre la pregunta, senyal de què ha rebut el missatge i l'ha pogut desxifrar. normativa per entregar les pràctiques al Moodle: ASIX-M11-SAD#Normativa_d.27entrega_de_les_pr.C3.A0ctiques_al_Moodle

Aclaratori per enviar la pregunta encriptada al professor (novembre 2013)

Per generar la clau pública:

$ gpg -a -o claupublica_pep.asc --export -r pep@gmail.com

L'alumne escriu en un fitxer la seva pregunta (posa si us plau el teu nom en el fitxer):

$ gpg -a -s pregunta_pep.txt

Aquesta comanda genera la pregunta encriptada amb extensió asc (fitxer de text): pregunta_pep.txt.asc

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.12 (GNU/Linux)
...

Si no utilitzes l'opció -a genera la pregunta encriptada amb extensió gpg (que és un binari): pregunta.txt.gpg

$ gpg -s pregunta_pep.txt

Envies els dos fitxers generats (la clau pública i la pregunta encriptada), al professor (joanqc@gmail.com).

El professor, per desencriptar, farà:

$ gpg -d pregunta_pep.txt.asc
o bé
$ gpg -d pregunta_pep.txt.gpg

mostra la pregunta per la consola. Si vols generar el fitxer:

$ gpg -o pregunta_pep.txt -d aaa.txt.asc
o bé 
$ gpg -o pregunta_pep.txt -d aaa.txt.gpg

I el professor ja pot contestar la pregunta del Pep.


creat per Joan Quintana Compte, setembre 2011