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"
Seguir las instrucciones de instalación y descarga de GNUPG.
Cosas que hace el 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
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
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
Cosas que hace el 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
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
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: