Cómo utilizar «GPG» para cifrar y firmar mensajes
Cifrado asimétrico «GPG»
En este artículo vamos a ver cómo utilizar GPG para cifrar y firmar mensajes. GNU Privacy Guard «GPG», es una implementación de criptografía asimétrica o de clave pública. Con GPG podremos cifrar cualquier tipo de fichero, conseguir una transmisión segura de información entre las partes que intervienen y la verificación de que el origen de un mensaje es genuino, de quien dice ser.
El uso correcto de GPG nos ayudará a proteger nuestras comunicaciones con diferentes personas. No cabe duda de su utilidad, tanto cuando se trate de información confidencial, como cuando se trate de mensajes regulares y cotidianos.
Debido a la forma en que los programas de monitoreo pueden «marcar» ciertas comunicaciones cifradas, es recomendable usar el cifrado para todo, no solo para los datos «sensibles». Con ello conseguiremos que sea más difícil, para extraños, saber cuándo estamos enviando datos importantes o simplemente una nota intranscendente.
Sumario
- Cómo funciona el cifrado de clave pública
- Servidores de claves públicas
- Instalar y configurar claves GPG
- Crear pareja de claves
- Cómo exportar e importar claves públicas.
- Publicar una clave pública en un servidor de claves. Alta disponibilidad.
- Importar una clave pública desde un servidor de claves
- Verificar la identidad de la otra persona
- Firmar con tu clave ficheros y claves
- Cifrar y descifrar mensajes con GPG
- Cifrar mensajes
- Descifrar mensajes
Cómo funciona el cifrado de clave pública
En las comunicaciones diarias nos encontramos con la necesidad de que estas sean seguras, y de que haya que validar la identidad de nuestra contraparte. En algunos casos se hace uso de una contraseña que se transmite, previamente a la comunicación, por un medio inseguro.
Los dos puntos principales de este asunto son, asegurarnos de que solo la persona destinataria pueda leer el mensaje, y verificar la identidad del remitente.
Para asegurarnos de que solo la persona destinataria pueda leer el mensaje, GPG maneja un concepto de seguridad conocido como cifrado de clave púbica, sistema consistente en la creación de dos partes diferentes para el cifrado y descifrado de la transmisión, la clave privada y clave pública. Esto es «Cifrado asimétrico». Así podemos distribuir la clave pública para el cifrado y mantener la privada para desencriptar.
Con ello conseguimos una transferencia de mensajes unidireccional que puede ser creada y encriptada por cualquiera, con nuestra clave pública, pero solo nosotros la podemos desencriptar con nuestra clave privada. Si ambos intervinientes crean parejas de claves pública/privada y comparten sus claves públicas de cifrado, ambos pueden cifrar y descifrar mensajes entre sí. En este caso, cada parte tiene su propia clave privada y la clave pública del otro usuario.
El segundo punto es la validación de la identidad del remitente. GPG nos ofrece la posibilidad de «firmar» el mensaje con nuestra clave privada, y el receptor, con la clave pública nuestra, que posee, podrá verificar la firma y garantizar que está siendo enviada por el usuario que dice ser.
Servidores de claves públicas
Existen unos servidores de claves PGP «Pretty Good Privacy», la versión «no open source», totalmente compatibles con la versión GPG «GNU Privacy Guard», que estamos viendo. Un ejemplo lo tienes en RedIRIS con su servidor «pgp.rediris.es», o el del MIT «Massachusetts Institute of Technology» con la dirección de servidor «pgp.mit.edu». Los servidores más importantes están sincronizados de modo que es posible elegir un servidor de claves cercano a nosotros en Internet, y usarlo de forma regular para enviar y recibir claves.
Luego veremos como publicar e importar las claves de un servidor de este tipo.
Instalar y configurar claves GPG
En la mayoría de las distribuciones GNU/Linux está instalado por defecto o disponible en los repositorios. Si no tienes GPG instalado, en sistemas Debian o derivados, lo puedes hacer sencillamente.
sudo apt update sudo apt install gnupg
En RHEL y derivados como CentOS, AlmaLinux, RockyLinux…
sudo yum install gnupg2
También lo puedes descargar de su página oficial. Encontraras versiones para MS Windows, OS X, Debian, RPM para diferentes S.O., Android, VMS y RISC OS.
Crear pareja de claves
Lo primero que tenemos que hacer, para comenzar a usar GPG y cifrar asimétricamente nuestras comunicaciones, es crear una pareja de claves. Lo hacemos ejecutando
gpg --gen-key
Nos pedirá : Nombre y apellidos, Dirección de correo-e, y luego nos permite modificar estos parámetros con: N cambiar nombre, D cambiar dirección y con V «Vale», salimos.
Como apreciamos en la captura anterior, nos genera una clave de confianza absoluta y crea un directorio en «/home/usuario/.gnupg/openpgp-revocs.d» donde guarda un certificado para poder revocar la clave. Nos crea y firma las claves púbica y privada.
Añadimos «Frase de contraseña»
Nos indica que se ha creado. El ID será la dirección de correo-e. Si ejecutas «gpg –full-generate-key», te hará el siguiente cuestionario para configurar las claves y modificar algunos parámetros.
- Seleccione qué tipo de clave desea: (1) RSA y RSA (predeterminado)
- ¿Qué tamaño de clave quieres? 4096
- ¿La clave es válida para? 1 año (expira después de 1 año. Si solo estás probando, es posible que desees crear una clave de corta duración la primera vez utilizando un número como «3» en su lugar).
- ¿Es esto correcto? y
- Nombre real: tu nombre real aquí
- Dirección de correo electrónico: tu_email@dominio.com
- Comentario: comentario opcional que será visible en tu firma
- ¿Cambiar (N)nombre, ©comentario, (E)mail o (O)bien/(Q)salir? O
- Ingrese la frase de contraseña: ingresa una frase de contraseña segura aquí (mayúsculas y minúsculas, dígitos, símbolos)
Tras generar las claves podemos verlas con el comando «gpg -k», que nos muestra nuestro par de claves. Lo importante de este paso es que veremos la identificación de cada una, necesaria para poder exportar y enviar la clave pública, como veremos más adelante.
gpg -k
Cómo exportar e importar claves públicas
Para que PGP tenga la funcionalidad que esperamos, el sistema tiene que tener la capacidad de aceptar y almacenar las claves públicas de las personas con las que deseamos comunicarnos.
Podemos importar la clave pública de otra persona, que nos haya enviado esta en un fichero de texto, o desde un servidor de claves. Si recibimos una clave pública de alguna persona la podemos importar ejecutando el siguiente comando
gpg --import nombre_del_fichero_recibido.gpg
También podemos exportar nuestra clave pública, la pública, nunca la privada. Vamos a distribuir nuestro fichero de clave pública para que otras persona puedan utilizarlo para comunicarse con nosotros de manera segura, pero, en el intercambio de claves, es fundamental asegurarnos de que la clave pertenece a quien creemos que pertenece durante la transmisión inicial de la clave pública.
El objetivo de esta pareja de claves es que cualquiera nos pueda mandar un fichero cifrado, con nuestra clave pública, que solo seremos capaces nosotros de descifrar con nuestra clave privada.
Para exportar nuestra clave pública a un fichero usaremos el comando con la siguiente sintaxis,
gpg -output [ficheroExportar.gpg] --export [ID_de_la_clave_pública]
Vemos que se ha creado el fichero
Puedes enviar a cualquier persona tu clave pública solicitándola desde el sistema GPG
gpg --output ~/MiClavePub.key --armor --export [email@dominio.com]
Publicar una clave pública en un servidor de claves
Alta disponibilidad
Tal y como esta diseñado el cifrado de clave púbica, no representa ningún problema que otras personas tengan nuestra clave pública, solo podrán cifrar con ella y solo se podrá descifrar con nuestra clave privada.
Por ello, puede ser interesante hacer que nuestra clave pública esté disponible públicamente, y favorecer que las personas puedan encontrar nuestra información, para enviarnos mensajes de forma segura desde la primera interacción.
Los servidores de claves públicas, son de acceso libre, ya que no es problema que se conozca tu clave pública, y para dar publicidad se usa precisamente. Para publicar una clave pública en el servidor del MIT (pgp.mit.edu) ejecutamos el comando gpg con la siguiente sintaxis
gpg --send-keys --keyserver [Dirección del servidor] [ID de la clave pública]
Importar una clave pública desde un servidor de claves
Para poder usar la clave pública, para cifrar o comprobar la identidad del remitente, tenemos que importar previamente la clave y, después ejecutar el comando gpg con el fichero que la contiene.
gpg --import [Fichero_de_clave_pública.gpg]
O directamente del servidor ejecutando
gpg --keyserver [Dirección_del_servidor] --recv-keys [ID_de_la_clave]
Verificar la identidad de la otra persona
Para saber, que quién te da su clave pública, es quien dice ser, en alguna ocasión puede resultar sencillo, si por ejemplo, estamos compartiendo mesa físicamente. Pero en la mayoría de los casos esto será imposible. Quizá no conozcamos personalmente a la otra parte o estemos alejados geográficamente. Si nunca deseamos comunicarnos a través de canales inseguros, la verificación de la clave pública podría ser un problema.
Pero en vez de verificar todas las claves públicas de ambos extremos, podemos comparar la «huella digital» (fingerprint) derivada de estas claves. Esto nos dará una seguridad razonable de que ambos estamos utilizando la misma información de clave pública.
Obtenemos la «huella digital» (fingerprint) de una clave pública, ejecutando
gpg --fingerprint tu_email@dominio.com
Esto producirá una cadena de números mucho más manejable para comparar. Podemos comparar esta cadena con la persona misma o con otra persona que tenga acceso a esa otra parte.
Firmar con tu clave ficheros y claves
Cualquier fichero lo podemos cifrar y firmar. Para ello ejecutamos, introduciendo la contraseña de la clave privada.
gpg -u [ID_de_la_clave_privada] --output [FicheroFinal.txt.gpg] --sign [Fichero_a_firmar]
Nos pedirá la contraseña
Y vemos que tenemos el fichero encriptado y firmado «ficheroGPG.txt.gpg»
Para asegurarnos la confidencialidad del documento, ahora que esta firmado por nosotros, tendremos que cifrárlo con la clave pública del destinatario, antes de mandarlo.
Al firmar una clave, le decimos al software que confiamos en la clave que se le ha proporcionado, y que se ha verificado que está asociada con la persona determinada. Para firmar una clave que hemos importado, ejecutamos
gpg --sign-key email@dominio.com
Cuando firmamos la clave, indicamos que confiamos en que la persona es quien dice ser, lo que puede ayudar a otras personas a decidir si confiar en esa persona también.
Deberemos permitir que la persona, cuya clave estamos firmando, aproveche la relación de confianza enviándonos la clave firmada. Puedes hacer esto ejecutando
gpg --output ~/signed.key --export --armor email@dominio.com
Nos pedirá nuestra contraseña y posteriormente se mostrará la clave pública firmada por nosotros.
Cuando reciban esta nueva clave firmada, podrán importarla y agregar la información de firma que hemos generado en su base de datos GPG. Podemos hacer esto ejecutando
gpg --import ~/signed.key
De este modo ahora podemos demostrar a otras personas, que confiamos en que su identidad es correcta.
Recuerda que para consultar nuestra ID de clave, puedes ejecutar
gpg --list-keys email@dominio.com
En la fila que comienza con «pub», la encontrarás. Es una forma sencilla de hacer referencia a la clave del software interno.
Cifrar y descifrar mensajes con GPG
Podemos cifrar y descifrar mensajes fácilmente tras haber compartido nuestras claves con la otra parte.
Cifrar mensajes
Para encriptar mensajes tenemos que usar el indicador «–encrypt» para GPG, con la siguiente sintaxis
gpg --encrypt --sign --armor -r persona@email.com nombre_del_fichero
Con el comando anterior, encriptamos el mensaje utilizando la clave pública del destinatario, lo firma con nuestra propia clave privada para garantizar que somos el origen, y genera el mensaje en formato de texto, en lugar de bytes sin formato. El nombre del fichero será el mismo que el nombre del fichero original añadiendo la extensión «.asc».
Deberemos incluirnos como un segundo destinatario con la opción «-r» con nuestra propia dirección de correo electrónico, si deseamos poder leer el mensaje cifrado, ya que el mensaje se cifrará con la clave pública de cada persona y solo se podrá descifrar con la clave privada asociada.
Si solo estuviera encriptado con la clave pública de la otra parte, no podríamos volver a ver el mensaje, a menos que de obtuviéramos la clave privada de la otra parte. Agregarse a uno mismo, como segundo destinatario, cifra el mensaje dos veces por separado, una para cada destinatario.
Descifrar mensajes
Al recibir un mensaje solo tenemos que llamar a GPG y añadir como argumento el fichero del mensaje
gpg -d [fichero.gpg]
Lo podemos verificar con
gpg --verify [fichero.gpg]
Y el resultado es la información del remitente, que puedes comprobar con este fichero y con la clave pública de los pasos anteriores.
Si en vez de un fichero, recibimos el mensaje como una secuencia de texto sin procesar, podemos copiarlo y pegarlo, después de llamar a GPG, sin ningún argumento. GPG lo descifrará por nosotros, para indicar el final del mensaje tenemos que presionar «CTRL-D».
Puedes consultar más opciones, para el uso de GPG con Gnome, en la página «Gnome-Help».
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en el pie de la página o desde aquí mismo.