PGP era en un principio un conjunto de herramientas que hacían mas fácil el uso de cifrado simétrico y asimétrico. Pero luego se consumó como la solución «todo en uno» para el cifrado de archivos y mensajes.
Con el constante uso que hacemos del correo electrónico, y del envió de adjuntos, la pregunta que pocos se hacen, pero que debería estar en la mente de todos es: como sé que esto que recibí es real, y que la persona que lo envió es quien dice ser?
Empecemos por el comienzo, instalar el software y crear nuestras llaves, públicas y privadas.
En debian, ubuntu y linux mint (como root):
apt-get install gnupg
En RedHat, Fedora, Scientific (como root):
yum install gnupg
Una vez instalado el software, como usuario sin privilegios, en nuestra carpeta personal:
gpg --gen-key
Este comando nos solicitará información sobre nuestra identidad y la seguridad que requerimos para las llaves. Se observará algo como lo siguiente, y completa las preguntas con tus datos.
gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. gpg: /home/rodolfo/.gnupg: directorio creado gpg: creado un nuevo archivo de configuración `/home/rodolfo/.gnupg/gpg.conf' gpg: AVISO: las opciones en `/home/rodolfo/.gnupg/gpg.conf' no están aún activas en esta ejecución gpg: anillo «/home/rodolfo/.gnupg/secring.gpg» creado gpg: anillo «/home/rodolfo/.gnupg/pubring.gpg» creado Por favor seleccione tipo de clave deseado: (1) RSA y RSA (predeterminado) (2) DSA y Elgamal (3) DSA (sólo firmar) (4) RSA (sólo firmar) ¿Su selección?: 1 <--------------------------- Elige el tipo de llave que requieres las claves RSA pueden tener entre 1024 y 4096 bits de longitud. ¿De qué tamaño quiere la clave? (2048) <------ Elige el tamaño de la llave El tamaño requerido es de 2048 bits Por favor, especifique el período de validez de la clave. 0 = la clave nunca caduca <n> = la clave caduca en n días <n>w = la clave caduca en n semanas <n>m = la clave caduca en n meses <n>y = la clave caduca en n años ¿Validez de la clave (0)? 0 <----------------- Elige el tiempo de duración de la llave La clave nunca caduca ¿Es correcto? (s/n) s <----------------------- Confirma tu seleccion de tiempo de duración Necesita un identificador de usuario para identificar su clave. El programa construye el identificador a partir del Nombre Real, Comentario y Dirección de Correo electrónico de esta forma: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" Nombre y apellidos: Rodolfo Arce <------------ Ingresa tu nombre y apellido Dirección de correo electrónico: info@rodolfoarce.com <--- Ingresa tu email Comentario: prueba <-------------------------- Ingresa un comentario o descripción Ha seleccionado este ID de usuario: «Rodolfo Arce (prueba) <info@rodolfoarce.com>» ¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir? v <--- Confirma lo ingresado Necesita una frase contraseña para proteger su clave secreta. Contraseña: <-------------------------------- Ingresa una contraseña para la clave Contraseña: <-------------------------------- Repite la contraseña para la clave Es necesario generar muchos bytes aleatorios. Es una buena idea realizar alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar la red y los discos) durante la generación de números primos. Esto da al generador de números aleatorios mayor oportunidad de recoger suficiente entropía. No hay suficientes bytes aleatorios disponibles. Por favor, haga algún otro trabajo para que el sistema pueda recolectar más entropía (se necesitan 284 bytes más). +++++ .+++++ Es necesario generar muchos bytes aleatorios. Es una buena idea realizar alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar la red y los discos) durante la generación de números primos. Esto da al generador de números aleatorios mayor oportunidad de recoger suficiente entropía. ..+++++ No hay suficientes bytes aleatorios disponibles. Por favor, haga algún otro trabajo para que el sistema pueda recolectar más entropía (se necesitan 56 bytes más). ......+++++ gpg: /home/rodolfo/.gnupg/trustdb.gpg: se ha creado base de datos de confianza gpg: clave 94FB78EE marcada como de confianza absoluta claves pública y secreta creadas y firmadas. gpg: comprobando base de datos de confianza gpg: 3 dudosa(s) necesarias, 1 completa(s) necesarias, modelo de confianza PGP gpg: nivel: 0 validez: 1 firmada: 0 confianza: 0-, 0q, 0n, 0m, 0f, 1u pub 2048R/94FB78EE 2012-07-14 Huella de clave = B49D 129F 2697 69C5 FE2B 2A2A 981E E6FF 94FB 78EE uid Rodolfo Arce (prueba) <info@rodolfoarce.com> sub 2048R/F6838953 2012-07-14
Una vez creadas las llaves, podemos empezar a usarlas para las tareas del día a día. En este caso, el codigo de referencia de nuestra llave es: 94FB78EE
Una explicación teórica del uso de la llaves, la llave pública debe ser disponibilizada, es la que usan los demás para hacernos llegar información y para corroborar nuestras firmas. Una persona usa NUESTRA llave PUBLICA para ocultar un texto, pero solo NUESTRA llave PRIVADA puede mostrar el texto. La firma digital de un documento usa NUESTRA llave PRIVADA para firmar, pero la firma se corrobora solo con NUESTRA llave pública. En general usan funciones matemáticas que de un sentido, es decir se puede hacer con el dato, pero NO se pueden deshacer con el mismo dato, se puede deshacer con OTRO dato relacionado pero no idéntico.
Por estas razones, la clave pública debe ser disponibilizada para todos, por todos los medios posibles. La llave privada debe ser protegida al máximo, y en caso de perdida o comprometida debe ser publicado su certificado de revocación, con el cual decimos a todos que ya dejó de ser vigente y que no debería de confiarse en ella.
Para generar nuestra llave pública, lo hacemos con el siguiente comando:
gpg --armor --output llave_publica.asc --export 94FB78EE
El contenido del archivo llave_publica.asc es legible, esta en formato ASCII, el contenido lo deben enviar a un servidor de llaves, por ejemplo pgp.mit.edu
Lo siguiente es crear el certificado de revocación para poder deshabilitarla nuestra llave si algo lo ameritara.
gpg --output cert_revocacion.asc --gen-revoke 94FB78EE
Le solicitará información de porque desean revocar la llave, y también la contraseña de la llave. Este archivo cert_revocacion.asc deberemos guardarlo en algún lugar seguro.
A continuación hice un resumen de las acciones mas comunes con mis llaves publicas.
Llaves públicas
- Importar una llave PUBLICA desde un archivo binario
gpg --import public.key
- Recibir llave pública desde servidor sabiendo el código de referencia de la llave (Esto se aplica para recibir la llave de otra persona
gpg --keyserver x-hkp://pgp.mit.edu --recv-keys "Codigo de llave de alguien mas" wget -q -O - 'http://pgp.mit.edu:11371/pks/lookup?op=get&search="Codigo de la llave"' | gpg --import
- Exportar mis llaves PUBLICAS (binario). En el ejemplo exporto mi propia llave
gpg --export "Codigo de mi llave " > public.keygpg --export 94FB78EE > public.key
- Exportar mis llaves PUBLICAS (ASCII). En el ejemplo exporto mi propia llave
gpg --armor --output archivo.asc --export "Codigo de mi llave" gpg --armor --output rodolfo_arce.asc --export 94FB78EE
Llaves privadas
- Importar una llave PRIVADA de encriptación, esto seria equivalente a agregar una nueva llave para nuestro uso
gpg --allow-secret-key-import --import private.key
- Exportar llave PRIVADA de encriptación (para guardar en lugar seguro). Potencialmente peligroso. En el ejemplo exporto mi propia llave
gpg --export-secret-key -a "Codigo de llave" > private.key gpg --export-secret-key -a 94FB78EE > rodolfo_arce.key
- Firmar una llave publica con mi llave privada, esta es la forma de decir que confiamos en la clave publica de otra persona. En el ejemplo yo firmo la llave pública de Linus Torvalds
gpg --default-key "Codigo de mi llave privada" --sign-key "Codigo de llave publica del amigo" gpg --default-key 94FB78EE --sign-key 00411886
- Una vez firmada la llave de nuestro amigo, la enviamos al servidor, en el ejemplo yo firmo y envio la llave de Linus Torvalds
gpg --keyserver x-hkp://pgp.mit.edu --send-keys "Codigo de llave nuestro amigo" gpg --keyserver x-hkp://pgp.mit.edu --send-keys 00411886
Trabajar con archivos
- Generar firma de un documento
gpg --output archivo.doc.sig --sign archivo.doc
- Corroborar la firma de un archivo y desencriptarlo
gpg --output archivo.doc --decrypt doc.sig
- Cifrar un archivo con mi llave privada para un amigo. Genera archivo.doc.gpg, en ejemplo, yo cifrado un documento para Linus Torvalds
gpg -e -u "Mi llave privada" -r "Llave publica del amigo" archivo.doc gpg -e -u 94FB78EE -r 00411886 archivo.doc
- Descifrar un archivo, debió ser cifrado usando nuestra llave publica (pero nosotros usamos nuestra llave privada) y debemos tener la llave publica de la persona que lo creo (el utilizo su llave privada)
gpg -d archivo.doc.gpg
De la misma forma que usamos las llaves privadas y públicas para firmas archivos, los clientes de correo utilizan las llaves para firmar mensajes en correos electrónicos. Para esto se usan extensiones de clientes para firmar y corroborar firmas de correo. Yo personalmente uso el cliente de correo Thunderbird, con la extensión Enigmail.
De esta forma podemos asegurar nuestras comunicaciones y nuestra identidad en los correos electrónicos que enviamos