====== 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" ====
**[[gnupg#Instalar el programa gpg|Instalar el programa gpg]]**
Seguir las instrucciones de instalación y descarga de GNUPG.
=== Cosas que hace el Receptor ===
{{seguridad:recibir.jpg?50|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 ===
{{seguridad:enviar.jpg?50|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 ===
{{seguridad:recibir.jpg?50|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 ===
{{seguridad:recibir.jpg?50|Receptor}}
No hace nada, porque el Emisor ya tiene su clave pública.
=== Cosas que hace el Emisor ===
{{seguridad:enviar.jpg?50|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 ===
{{seguridad:recibir.jpg?50|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) "
gpg: alias "Raul Luna Rodriguez (rlunaro) "
===== 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" ((se pueden tener varias claves privadas a la vez)).
=== 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) "
¿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) "
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)
[desconocida] (2). Raul Luna Rodriguez (Capitán General)
=== 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) "
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) "
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)
[ unknown] (2) Raul Luna Rodriguez (Clave personal)
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)
[ unknown] (3). Raul Luna Rodriguez (Clave personal)
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)
=== 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)
[desconocida] (2). Raul Luna Rodriguez (plasticman)
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)
[desconocida] (2). Raul Luna Rodriguez (plasticman)
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)
==== 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.
[[http://www.dewinter.com/gnupg_howto/spanish/gpgminicomo.html|Mini-howto de gpg (en español)]]
Aquí hay un manual bastante completito del tema:
[[http://gnupg.org/documentation/guides.en.html]]