GnuPG (GPG) en 10 minutos

PGP (Software propietario) y GnuPG (Software libre), son herramientas de encriptación asimétrica, es decir, hay 1 clave pública y otra privada. A la pública debe tener acceso todo el mundo de forma que cuando quieran enviarte algo encriptado, lo encriptaran usando esa llave, en cambio la privada solo la debe tener su propietario, esta clave permite desencriptar todo lo que le hayan enviado encriptado con la llave pública.

La encriptación no es la única utilidad, con tu llave privada puedes firmar mensajes de forma que quien lo recibe puede comprobar que el mensaje no ha sido alterado y que realmente procede de ti con tu clave pública.

Cualquier internatua debe ser consciente del hecho de que actualmente, cualquier mail que enviéis es susceptible de ser interceptado, bloqueado o incluso que falsifiquen fácilmente mails haciendo creer que lo ha enviado otra persona. Y aunque se utilicen protocolos seguros como POP3 + SSL el mensaje es susceptible de ser modificado, el propio administrador de la maquina donde se guarda el correo tiene dicho poder. Es ahí donde la encriptación y firma de mensajes aparece para soluciona dicho problema.

Para encriptar/firmar mensajes existen 2 programas que ya he nombrado: PGP un producto no libre o GnuPG libre 100% De ambos hay tanto versiones para entornos Windows como para entornos GNU/Linux, pero me centrare en GnuPG bajo GNU/Linux que es el que yo utilizo habitualmente aunque los comandos en general son válidos también para la plataforma Microsoft Windows.

Una vez tenemos el programa instalado (lo podeis bajar de http://www.gnupg.org/, o en la mayoria de ocasiones ya viene en nuestra distribución GNU/Linux), debemos crear una clave publica y una privada para nuestro uso:

gpg --gen-key

Nos aparecerán 3 tipos de algoritmos a usar para nuestras claves:

(1) DSA y ElGamal (por defecto)
(2) DSA (Sólo firmar)
(3) RSA (Sólo firmar)

De las 3 opciones posibles elegiremos la primera. A continuación debemos elegir el tamaño de las claves, actualmente lo normal es que sean de 1024 bits, pero entre más alto sea mayor seguridad obtendremos aunque también más coste de CPU para firmar/cifrar.

A continuación especificamos el periodo de validez de la clave, lo más habitual para uso personal es que no caduque nunca. Nos pedirá confirmación y acto seguido debemos indicar nuestro nombre y apellidos (los que figuren en nuestros mails normalmente), la dirección de correo y un comentario que podemos dejar en blanco, hay personas que lo usan para especificar sus pseudónimos de internet o nicks. Aceptamos los datos introducidos y introducimos una contraseña, esta contraseña se utilizara para cifrar nuestra clave privada, así en el caso de que nos la roben no podrán usarla si no saben el password. Finalmente se generara la clave.

Para listar las claves de las que disponéis:

gpg --list-keys

A continuación expongo un resultado de ejemplo inventado con sus finger print (huellas):

pub 1024D/861A470D 2003-05-26 pepe lopez
Huella de clave = 440A 1523 1564 DC21 7CD8 4572 CED1 C82B 861A 470D
sub 1024g/1BC32440 2003-05-26

El ID de esta clave es 861A470D y su huella es la que se indica (440A 1523 1564 DC21 7CD8 4572 CED1 C82B 861A 470D). El ID sirve para buscar claves, podriamos indicar el ID de nuestra clave en nuestros mails o nuestra web y asi a quien le interese puede buscarla en los servidores de claves (veremos más adelante como utilizarlos), habitualmente se añade un "0x" al ID para indicar que esta en hexadecimal: 0x861A470D. El finger key (huella) sirve para comprobar que la clave es correcta, por ejemplo, le enviamos nuestra clave pública por correo a alguien, el la importa en su gpg y a continuación por telefono o otro medio fiable le indico cual es mi finger print. De esta forma puede comprobar que los finger prints son identicos y que la clave no ha sido alterada por el camino. Para consultar únicamente el finger print de una clave:

gpg --fingerprint 0x[ID de la clave]

Una vez tenemos nuestra clave generada, lo mejor es enviarlo a algún servidor de claves para que cualquier persona pueda acceder a nuestra clave publica (así podrá comprobar los mails que firmamos y enviarnos mails encriptados que solo nosotros podremos desencriptar). Para ello utilizaremos:

gpg --keyserver pgp.rediris.es --send-keys [ID de la clave, eg 861A470D]

Si en un futuro hiciesemos cambios a nuestra clave y tuviesemos que actualizar la del servidor, bastará con volver a ejecutar el comando anterior.

Personalmente utilizo siempre el servidor de claves de rediris, pero es posible utilizar cualquier otro. En los mails o en nuestras webs podriamos indicar además del id, el servidor donde la pueden buscar, como es en mi caso pgp.rediris.es.

Veamos como se importan claves de terceros desde un servidor de claves, en concreto buscaremos mi clave:

gpg --keyserver pgp.rediris.es --search-keys 0x0ED2CF9D

Saldrá como resultado:

(1) Sergio Blanco Cuaresma (Marble)
1024 bit DSA key 0ED2CF9D, created 2002-05-03
(2) Sergio Blanco Cuaresma (Marble)
1024 bit DSA key 0ED2CF9D, created 2002-05-03

Seleccionando uno, se importaran las 2 ya que mi clave esta asociada a 2 mails. Ahora ya tenemos mi clave pública en vuestro gpg y ya podéis enviarme mensajes cifrados o comprobar las firmas de mis mensajes. Como he dicho, mi clave esta asociada a 2 cuentas pues normalmente uso 1 de esas 2 para escribir mails, si es también vuestro caso a continuación muestro como añadir otra dirección de correo a nuestra clave:

gpg --edit-key 0x[vuestro ID]
adduid
[Introducis los datos]
save

Cuando estáis dentro de esa shell podéis ejecutar "help" y veréis que hay un montón de opciones más.

Es posible que nos interese exportar nuestra clave pública a un fichero para pasarselo a un conocido sin usar el servidor de claves o colgarla en vuestra web, estas exportaciones se pueden realizar a ficheros binarios con:

gpg --export 0x[vuestro ID] > miclave.pub

O a ficheros en formato texto claro (Esta es la opción más habitual):

gpg -a --export 0x[vuestro ID] > miclave.asc.pub

La persona que recibe la clave con estos métodos (sin usar el servidor de claves) la importara usando:

gpg --import miclave.pub

Toda la configuración, las claves publicas y vuestra clave privada se guarda en vuestro directorio personal $HOME/.gnupg/. Es importante no perder las claves y que nadie más tenga acceso a vuestras claves privadas. En ese directorio también tenéis el archivo options o gpg.conf (dependiendo de la versión de vuestro gpg), el cual podéis editar y especificar ciertas cosas como el servidor que uséis habitualmente, así evitareis estar escribiendo siempre --keyserver [servidor].

Vuestras claves, si han sido robadas las podéis revocar y enviar al servidor para que se actualice, eso quiere decir que vuestra clave pasa a ser inválida. Para poder hacer esto es necesario un certificado de revocación, este puede ser generado en el momento que creamos las claves, asi en un futuro si es necesario revocarlas no hará falta que recordemos las claves. Esto también supone un riesgo, ya que si alguien tuviese acceso al certificado podria revocar nuestras claves sin nuestro permiso, por esa razón hay personas que se decantan por generar el certificado el dia que realmente vayan a revocar su clave.

Para generar el fichero de revocacion "revocacion.asc":

gpg -o revocacion.asc --gen-revoke 0x[vuestro ID]

Durante el proceso de creación de la revocacion se nos preguntará el motivo:

0 = No se dio ninguna razón
1 = La clave ha sido comprometida
2 = La clave ha sido reemplazada.
3 = La clave ya no está en uso

A continuación será necesario una descripción del porque de la revocación. El fichero resultante (revocacion.asc) debe ser guardado en un lugar seguro para evitar que otra persona pueda acceder a el y revocar la clave por nosotros.

Para revocar nuestra clave utilizando nuestro certificado de revocación generado anteriormente:

ATENCIÓN Nuestra clave dejara de ser válida con esta acción

gpg --import revocacion.asc

A continuación es necesario actualizar la clave en los servidores donde la hayamos subido.

gpg --keyserver pgp.rediris.es --send-keys [ID de la clave, e.g. 861A470D]

Para finalizar, simplemente indicar que las claves estas suelen estar basadas en confianzas, es decir, yo por ejemplo podría firmar la clave de un amigo de forma que aseguro que esa clave le pertenece a el, de forma que la gente que confía en mi clave confiar también en las claves que yo he firmado (y por tanto la de mi amigo). Sólo se debe firmar una clave cuando hayamos comprobado que la identidad de la persona corresponde con la de su clave, no basta solo con comprobar el finger print. Para firmar una clave:

gpg --edit-key 0x[ID de la clave]
sign

Para mantener la información de nuestro gpg es necesario realizar a menudo actualizaciones los niveles de confianza con:

gpg --check-trustdb

Y ademas ir actualizando las claves desde los servidores por si sus dueños han realizado alguna modificación:

gpg --refresh-keys

Finalmente para poder utilizar nuestras claves con nuestro correos electrónicos será necesario utilizar un cliente de correo que soporte el uso de GnuPG, en mi caso utilizo Evolution para GNU/Linux. Con el puedo firmar todos mis mensajes y enviar mails encriptados a aquellas personas que tengo su clave pública. Existen otros clientes de mail que también lo soportan, por ejemplo Mozilla Mail con el plugin Enigmail o con Thunderbird (ambos ejecutables tanto en entornos GNU/Linux como Microsoft Windows).