Table of Contents

Criptografía para las masas

Enviar un documento cifrado entre un origen y un destino es mucho más sencillo de lo que nos quieren hacer creer. Los manuales sobre GnuPG parecen más interesados en cifrar una clave que en enviar un mensaje cifrado. Aquí van unas notas sobre el tema.

Guia rápida para impacientes

Vamos a suponer que “Emisor” –que he denotado con la letra “E”– tiene que enviar un mensaje secreto a “Receptor” –que he denotado con la letra “R”–, y es la primera vez que usan GnuPg.

Enviar un fichero cifrado de "Emisor" a "Receptor"

Instalar el programa gpg

Seguir las instrucciones de instalación y descarga de GNUPG.

Cosas que hace el Receptor

Receptor

Crear una clave (si no se tiene una ya)

Lo primero que tiene que hacer Receptor es crear una clave si no dispone de ninguna:

gpg --gen-key

Exportar la clave pública

A continuación exportaremos la clave pública al fichero “clave_publica”. Aquí la vamos a exportar en ascii, para que se pueda enviar fácilmente por correo, o en otro documento.

gpg -a -o clave_publica --export 

Enviar la clave pública al emisor del fichero cifrado

Se envía el fichero “clave_publica” al emisor del fichero cifrado.

Cosas que hace el Emisor

Emisor

Importar la clave pública

Importamos la clave pública del Receptor:

gpg --import clave_publica

Ciframos el fichero utilizando la clave pública del receptor. Para ello usamos el siguiente comando:

gpg -e -r Receptor fichero_a_cifrar.doc

En el código de ejemplo “receptor” es el nombre del usuario cuya clave hemos importado. gpg es bastante flexible en ésto; por ejemplo si el usuario se llama “Fulano de Tal”, podemos poner el siguiente comando:

gpg --encrypt --recipient Fulano fichero_a_cifrar

o si su dirección de correo electrónico es yo@fulano.com:

gpg --encrypt --recipient yo@fulano.com fichero_a_cifrar

Enviamos el fichero cifrado a Receptor

Pues eso, el fichero, que ahora se llama “fichero_a_cifrar.gpg”, se puede enviar tranquilamente a Receptor, porque ya está cifrado.

Cosas que hace el Receptor

Receptor

Descifrar el fichero recibido

El receptor podrá descrifrar el fichero recibido fácilmente:

gpg -o fichero_ya_descifrado --decrypt fichero_recibido_cifrado

En “fichero_recibido_cifrado” habremos de poner el fichero con extensión *.gpg que hemos recibido del emisor.

Uso rutinario de GnuPG

En el ejemplo anterior hemos descrito muchos pasos que se hacen sólo una vez. Vamos a suponer que ahora “Emisor” y “Receptor” tienen que enviar un segundo mensaje:

Cosas que hace el Receptor

Receptor

No hace nada, porque el Emisor ya tiene su clave pública.

Cosas que hace el Emisor

Emisor

Ciframos el fichero utilizando la clave pública del receptor. Para ello usamos el siguiente comando:

gpg -e -r Receptor fichero_a_cifrar.doc

En el código de ejemplo “receptor” es el nombre del usuario cuya clave hemos importado. gpg es bastante flexible en ésto; por ejemplo si el usuario se llama “Fulano de Tal”, podemos poner el siguiente comando:

gpg -e -r Fulano fichero_a_cifrar

o si su dirección de correo electrónico es yo@fulano.com:

gpg -e -r yo@fulano.com fichero_a_cifrar

Enviamos el fichero cifrado a Receptor

Pues eso, el fichero, que ahora se llama “fichero_a_cifrar.gpg”, se puede enviar tranquilamente a Receptor, porque ya está cifrado.

Cosas que hace el Receptor

Receptor

Descifrar el fichero recibido

El receptor podrá descrifrar el fichero recibido fácilmente:

gpg -o fichero_ya_descifrado --decrypt fichero_recibido_cifrado

En “fichero_recibido_cifrado” habremos de poner el fichero con extensión *.gpg que hemos recibido del emisor.

Firma digital: cifrar y garantizar el origen

Un paso más enrevesado consiste en firmar un documento; es decir, garantizar que el documento lo hemos emitido nosotros. En realidad, es como poner nuestra firma sobre un documento físico: garantizamos que los emisores somos nosotros, y que no se ha cambiado durante el transporte.

rluna@plasticman:~> gpg --output documento_original.firmado 
-u rlunaro@prueba.com --sign documento_original.doc

Si queremos firmar un documento que está en texto en claro, y queremos que quede en texto en claro:

rluna@plasticman:~> gpg --output documento_original.firmado 
-u rlunaro@prueba.com --clearsign documento_original

El documento firmado será algo así:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Soy el documento original 


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)

iD8DBQFHp5hvf0CJQ529nVERAvR7AKCLoB4CDfxXDo/hhhD310Tnrdgg8QCgtOQ4
cAotMrEH3MZ5SkF7SWZNWf0=
=QGZD
-----END PGP SIGNATURE-----

La firma la comprobaremos con:

rluna@plasticman:~> gpg --verify 1006954.license.firmado
gpg: Firmado el lun 99 feb 99999 23:57:51 CET usando clave DSA ID 9999999
gpg: Firma correcta de "Raul Luna Rodriguez (plasticman) <rlunaro@otro.com>"
gpg:                 alias "Raul Luna Rodriguez (rlunaro) <rlunaro@prueba.com>"

Ampliando nuestros conocimientos sobre GnuPG

Conceptos Básicos

La mejor comparativa que puede hacerse de la criptografía de clave pública es con una caja fuerte. Imaginemos que el receptor de un mensaje pone a nuestra disposición una caja fuerte abierta.

Nosotros dejamos un documento en esa caja fuerte, giramos la ruleta y sólo quien sepa la combinación puede abrirla.

Pues bien, la “caja fuerte” es la clave pública y la “combinación” es la clave privada: ni que decir tiene que la “combinación”, nuestra clave privada no hay que comunicarla a terceros ni perderla, porque las consecuencias son obvias; quien tuviera la clave privada/ combinación podría leer los mensajes dirigidos a nosotros y si la perdiéramos no podríamos descifrar los mensajes que nos dirigen.

Gestionando nuestras claves

Las posibilidades de gestión para nuestras claves en GnuPG son bastante amplias, y el manual abunda precisamente en todas ellas, lo cual crea más y más confusión.

Crear una clave privada

Lo primero que tiene que hacer Receptor es crear una clave si no dispone de ninguna:

gpg --gen-key

Nos hará una serie de preguntas que deberemos responder.

Borrar una clave privada

Si la clave es tuya; es decir, es una clave secreta:

gpg --delete-secret-keys nombre_usuario

OJO!!! Una vez que borremos la clave secreta no será posible restaurar ficheros que nos envíen cifrados con esa clave.

Exportar nuestra clave privada

En el primer ejemplo indicamos que lo primero que tiene que hacer alguien que quiera recibir un mensaje secreto es crearse una clave, que está compuesta por una clave privada y una pública.

Pues bien, una cosa habitual es hacer copia de esa clave en un cd, diskette, pen drive o lo que queramos para evitar su destrucción en caso de que el ordenador se vaya al carajo.

Ejecutando este comando:

rluna@plasticman:~> gpg -a -o secret.key --export-secret-key direccion@de_correo.com

Exportaremos la clave privada identificada por “direccion@de_correo.com” 1).

Importar la clave privada

Es el comando complementario al anterior, y nos servirá para restaurar nuestra clave en otro ordenador, o tras reinstalar el mismo:

rluna@plasticman:~> gpg --import secret.key

Exportar nuestra clave pública

A continuación exportaremos la clave pública al fichero “clave_publica”. Aquí la vamos a exportar en ascii, para que se pueda enviar fácilmente por correo, o en otro documento.

gpg -a -o clave_publica_raul -u rlunaro@prueba.com --export 

Importar una clave pública de terceros

Importamos la clave pública del fichero clave_publica:

gpg --import clave_publica

Añadiendo otra identidad

Es bastante habitual que queramos tener una identidad para el trabajo y otra para casa. En la del trabajo puede aparecer nuestro nombre y apellidos completo, correo electrónico del trabajo, incluso nuestro departamento, mientras que la personal puede ser más informal. E incluso porqué no, tener otra para la comunicarnos con la familia.

Es muy fácil gestionar estas identidades asociadas a la misma clave. Para ello usaremos el comando adduid:

gpg --edit-key rlunaro@pruebas.com
Orden> adduid
Nombre y apellidos: Raul Luna Rodriguez
Dirección de correo electrónico: rlunaro@pruebas.com
Comentario: Capitán General
Ha seleccionado este ID de usuario:
    "Raul Luna Rodriguez (Capitán General) <rlunaro@pruebas.com>"

¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir? V

Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "Raul Luna Rodriguez (Clave personal de Ra£l Luna) <rlunaro@personal.com>"
clave DSA de 1024 bits, ID XXXXXXX, creada el 9999-01-31


pub  1024D/41D5CC12  creado: 9999-01-31  caduca: nunca       uso: CSA
                     confianza: absoluta      validez: absoluta
sub  2048g/4211058C  creado: 9999-01-31  caduca: nunca       uso: E
[  absoluta ] (1)  Raul Luna Rodriguez (Clave personal de Ra£l Luna) <rlunaro@otro.com>
[desconocida] (2). Raul Luna Rodriguez (Capitán General) <rlunaro@pruebas.com>

Cambiar el correo electrónico de una clave privada

A veces nos ocurre que cambiamos de correo electrónico, y claro, queremos cambiar nuestra firma digital. Hacerlo es sencillo:

Lo primero que haremos es editar la identidad que tiene nuestro correo:

gpg --edit-key correo.antiguo@antiguo.es

Nos sale un prompt Command> y a continuación añadiremos otra identidad, con el correo correcto:

Command> adduid
Real name: Raul Luna Rodriguez
Email address: XXXXXXXXXXXXXXXX
Comment: Clave personal
You selected this USER-ID:
    "Raul Luna Rodriguez (Clave personal) <correo.nuevo@nuevo.es>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

You need a passphrase to unlock the secret key for
user: "Raul Luna Rodriguez (Clave personal de Ra£l Luna) <correo.nuevo@nuevo.es>"
1024-bit DSA key, ID 41D5CC12, created 2008-01-31


pub  1024D/41D5CC12  created: 2008-01-31  expires: never       usage: SCA
                     trust: ultimate      validity: ultimate
sub  2048g/4211058C  created: 2008-01-31  expires: never       usage: E
[ultimate] (1)  Raul Luna Rodriguez (Clave personal de Ra£l Luna) <correo.antiguo@antiguo.es>
[ unknown] (2)  Raul Luna Rodriguez (Clave personal) <correo.nuevo@nuevo.es>

Después de eso podemos ya borrar la identidad vieja. Para ello primero hay que seleccionarla con el comando uid y luego borrarla con deluid:

Command> uid 1

pub  1024D/41D5CC12  created: 2008-01-31  expires: never       usage: SCA
                     trust: ultimate      validity: ultimate
sub  2048g/4211058C  created: 2008-01-31  expires: never       usage: E
[ultimate] (1)* Raul Luna Rodriguez (Clave personal de Ra£l Luna) <correo.antiguo@antiguo.es>
[ unknown] (3). Raul Luna Rodriguez (Clave personal) <correo.nuevo@nuevo.es>

Command> deluid
Really remove this user ID? (y/N) y

pub  1024D/41D5CC12  created: 2008-01-31  expires: never       usage: SCA
                     trust: ultimate      validity: ultimate
sub  2048g/4211058C  created: 2008-01-31  expires: never       usage: E
[ unknown] (1)  Raul Luna Rodriguez (Clave personal) <correo.nuevo@nuevo.es>

Cambiar el nivel de confianza

Sorprendente, pero cierto.

A las claves les podemos otorgar un nivel de confianza, que nos servirá para saber si aceptamos como “buenas” claves que otros nos hayan entregado. El concepto es complejo.

Al caso. Nosotros indicaremos que confiamos plenamente en nuestras propias claves de la siguiente manera:

gpg --edit-key rlunaro@otro.com
Orden> trust rlunaro@otro.com
pub  xxxxx/99999999  creado: 9999-01-31  caduca: nunca       uso: CSA
                     confianza: absoluta      validez: absoluta
sub  xxxxx/99999999  creado: 9999-01-31  caduca: nunca       uso: E
[  absoluta ] (1)  Raul Luna Rodriguez (rlunaro) <rlunaro@pruebas.com>
[desconocida] (2). Raul Luna Rodriguez (plasticman) <rlunaro@otro.com>

Por favor, decida su nivel de confianza en que este usuario
verifique correctamente las claves de otros usuarios (mirando
pasaportes, comprobando huellas dactilares en diferentes fuentes...)


 1 = No lo sé o prefiero no decirlo
 2 = NO tengo confianza
 3 = Confío un poco
 4 = Confío totalmente
 5 = confío absolutamente
  m = volver al menú principal

¿Su decisión? 5
¿De verdad quiere asignar absoluta confianza a esta clave? (s/N) s

pub  9999D/99999999  creado: 2008-01-31  caduca: nunca       uso: CSA
                     confianza: absoluta      validez: absoluta
sub  9999g/9999999  creado: 2008-01-31  caduca: nunca       uso: E
[  absoluta ] (1)  Raul Luna Rodriguez (rlunaro) <rlunaro@pruebas.com>
[desconocida] (2). Raul Luna Rodriguez (plasticman) <rlunaro@otro.com>

Al salir y guardar el nuevo nivel de confianza será asignado. Se sale con el comando “exit” y contestando que “si” a los cambios realizados.

Listar las claves privadas que tenemos

Para ello ejecutaremos el siguiente comando:

gpg --edit-key rlunaro@pruebas.com
Orden> list

pub  9999D/99999999  creado: 9999-01-31  caduca: nunca       uso: CSA
                     confianza: absoluta      validez: absoluta
sub  9999g/99999999  creado: 9999-01-31  caduca: nunca       uso: E
[  absoluta ] (1). Raul Luna Rodriguez (Clave personal de Ra£l Luna) <rlunaro@pruebas.com>

Gestionando las claves de otros

Para usar GnuPG es fundamental utilizar las claves públicas de terceros. Aquí damos algunas pautas para manejarse:

Otra consecuencia del procedimiento anterior es que acabemos teniendo muchas claves. Si queremos avanzar un poco más en esto de la criptografía, lo ideal es que tengamos una única clave y ésta sea “auténtica”, es decir, que mediante el contacto físico con una persona ésta se haya certificado.

Listar las claves que tenemos

gpg --list-keys

Instalar el programa gpg

Descargar el programa

http://gnupg.org/download/index.en.html

Ejecutar el programa de instalación

Ejecutar el programa de instalación y seguir las instrucciones que se indican.

Debemos asegurarnos que el directorio de instalación queda en la ruta del programa.

Referencias

Una guía rápida para enviar un fichero cifrado entre un origen y un destino.

Mini-howto de gpg (en español)

Aquí hay un manual bastante completito del tema:

http://gnupg.org/documentation/guides.en.html

1)
se pueden tener varias claves privadas a la vez