Introducción a GnuPG.

Autores: Gammexane y Joel Barios Dueñas
Sitio de Red: http://www.alcancelibre.org/

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2014 Gammexane y Joel Barios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro) c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

Introducción.

La existencia de este documento obedece a varias razones, pero principalmente para fomentar la conciencia respecto de la privacidad y seguridad. Aunque la gente a veces desconoce del tema o es indiferente, estamos en una época en la cuál cualquier «niño» de 12 años —o menos— con acceso a Internet puede aprovechar fácilmente los agujeros de seguridad, obtener información o documentos críticos o aprovecharse de descuidos de los usuarios. Sólo hay que hacer búsquedas por «visa.txt», «credit_card.doc» o «mastercard_list.xls» en las redes P2P como ejemplo.

Uno de los mejores métodos para solventar este tipo de problemas es usar criptografía.

Si bien la criptografía data de tiempos muy remotos, la gran revolución de ésta sucedió en 1975, cuando dos ingenieros electrónicos de la Universidad de Stanford, Whitfield Diffie y Martin Hellman, aportaron el primer concepto nuevo en criptografía desde el tiempo de los griegos: la criptografía de clave pública. La nueva idea consistía en algo aparentemente imposible: un criptosistema donde hubiera dos claves, una para cifrar y otra para descifrar. De esta forma, si los usuarios fulano y zutano quieren intercambiarse mensajes, cada uno crea su pareja de claves y hacen pública la clave de cifrado. Entonces fulano, usando la clave de cifrar de zutano, le envía un mensaje. Carece de relevancia si el mensaje es incidentalmente o intencionalmente interceptado: el único que puede recomponer el mensaje es zutano, quien posee la clave de descifrado. Zutano hará lo contrario para responder el mensaje a fulano: usará la clave pública de fulano para enviarle el mensaje.

La idea es sencilla. El problema estaba en encontrar una función matemática que la lleve a la práctica. Diffie y Hellman sugirieron que una manera de diseñar sistemas criptográficos seguros era utilizando problemas irresolubles desde el punto de vista computacional. Es decir, un escenario donde una computadora requerirá muchísimo tiempo —incluso millones de años— en encontrar la solución. La manera de construir un criptosistema de clave pública es la siguiente:

En la actualidad el método más utilizado es el llamado RSA, desarrollado en 1977 por Ronald Rivest, Adi Shamir y Leonard Adleman. Este sistema se basa sobre la inexistencia de un algoritmo suficientemente eficiente para factorizar grandes números que sean producto de dos números primos.

La ventaja de la criptografía moderna es que permite resolver dos de los problemas más importantes con los que se enfrenta el nuevo mundo digital que está emergiendo: la modificación del contenido de un mensaje por parte de un tercero y la identificación de quien envió el mensaje. La utilización tanto de la criptografía de clave secreta como de la pública permite obtener cierta certeza de que el mensaje carece de alteraciones, aunque sin la certeza absoluta. Por otro lado, la criptografía de clave pública ha permitido la aparición de la firma digital como sustitución de la firma manual.

Diffie y Hellman se propusieron en 1976 encontrar un método para que —siguiendo con nuestros amigos— fulano pudiera estar seguro de la procedencia del mensaje es de zutano y además pudiera convencer también a un juez en un proceso legal. Así, la firma digital debe ser única, imposible de falsificar, fácil de autenticar e irrevocable. Pero quizá lo más curioso de todo es que los sistemas de clave pública permiten lo que se llama 'el protocolo de la fe' o la demostración de conocimiento nulo: Fulano puede convencer a zutano que posee un secreto sin decirle de qué secreto se trata. Siguiendo un símil, fulano es incapaz de abrir una caja cerrada porque zutano posee la llave y zutano se compromete a jamás modificar su contenido una vez abierta. Este protocolo tiene una aplicación clara: permite decir quién eres sin decirlo, algo muy importante cuando se trata de contraseñas o números de identificación personal.

Hoy cualquiera puede hacerse con un criptosistema seguro —como PGP (Pretty Good Privacy). Y todo este preámbulo fue para llegar hasta aquí.

GnuPG es un reemplazo completo para PGP. Puede ser utilizado sin restricciones gracias a que prescinde del algoritmo patentado IDEA. GnuPG es una aplicación que cumple el RFC2440 (OpenPGP). La versión 1.0.0 fue lanzada el 7 de septiembre de 1999. GnuPG es Software Libre por lo que puede ser utilizado, modificado y distribuido libremente bajo los términos de la GNU/GPLv2. PGP —sobre el cual se basa OpenPGP— fue desarrollado originalmente por Philip Zimmermann a comienzos de la década de 1990.

GnuPG es una herramienta para el intérprete de mandatos y es muy «compleja» para utilizarla sin un conocimientos previos. Afortunadamente este documento tiene como intención facilitar su uso y además existen frentes gráficos que facilitan el trabajo para casi cualquier arquitectura. GnuPG es demás 100% compatible con las llaves PGP.

SeaHorse es el mejor frente de gnupg para el escritorio.

Equipamiento lógico necesario.

En ALDOS, CentOS, Fedora™ y Red Hat™ Enterprise Linux.

El paquete gnupg viene incluido en la instalación estándar. Ejecute los siguiente en caso de ser necesario:

yum -y install gnupg

Ejecute lo siguiente para instalar Seahorse:

yum -y install seahorse

En openSUSE™ y SUSE™ Enterprise Linux.

El paquete gnupg viene incluido en la instalación estándar de SUSE™ Linux Enterprise Server. Ejecute lo siguiente en caso de ser necesario:

yast -i gpg2

Ejecute lo siguiente para instalar Seahorse.

yast -i seahorse

Procedimientos.

Generando el par de llaves desde el intérprete de mandatos.

Ejecute la siguiente para generar el par de llaves:

gpg --gen-key

Lo anterior solicitará:

El proceso puede demorar varios minutos —incluso horas— dependiendo del tamaño de la firma. En máquinas virtuales en anfitriones sin instrucciones para virtualización en el CPU ésto puede demorar muchas horas e incluso días.

Ejecute lo siguiente para ver la lista de llaves.

gpg --list-keys

La salida sería similar a lo siguiente:

[fulano@localhost][~]$ gpg --list-secret-keys
/home/fulano/.gnupg/secring.gpg
----------------------------------
sec 4096D/F08846B8 2004-10-27 Fulano (Personal) .....
uid Fulano (Fulano de Tal) .....
[fulano@localhost][~]$

Conviene generar un certificado de revocación en caso de extraviar la frase de acceso o que la seguridad de las llaves se haya visto comprometida. En el siguiente ejemplo se crea el certificado de revocación para la llave con identidad F08846B8.

gpg --output revocacion.asc --gen-revoke F08846B8

Esta última llave se debe enviar a todos los contactos en caso de requerirse revocar la llave original.

Ejecute lo siguiente para exportar la firma en formato binario:

gpg --output fulano.gpg --export F08846B8

Ejecute lo siguiente para exportar la firma en formato legible:

gpg --output fulano.asc --armor --export F08846B8

Ejecute lo siguiente para importar la firma de otro usuario a partir de cualquiera de los dos tipos de archivo mencionados arriba:

gpg --import zutano.gpg

Generando el par de llaves con Seahorse.

Una vez instalado este programa, lo primero es generar el par de llaves (keys) pública y privada. Seahorse tiene un muy intuitivo asistente de configuración que guía paso a paso para generar el juego de llaves.

Las llaves pueden tener una longitud desde 1024 bits hasta 4096 bits, lo que significa que gnupg buscará dos números primos cuyo producto sea un número de la cantidad de bits (combinación de 1s y 0s) seleccionada cuando se genere la llave.

La cantidad de bits de la llave depende del grado de seguridad que necesite el usuario. Cuanto más grande sea la llave, más difícil será romperla pero también será más lento será el cifrado y decifrado de datos.

Estableciendo el anillo de confianza (KeyRing)

El objetivo de ésto es distribuir la llave pública y obtener las llaves públicas de amigos, conocidos o compañeros de trabajo y establecer así nuestro anillo de confianza. Una vez que alguien envía su llave pública se debe importar al anillo personal. Ejecute SeaHorse, vaya al menú Key/LlavesImport/Importar en ese momento le tenemos que especificar, la ruta a la llave pública de la persona en cuestión.

Una vez hecho esto hay que firmar la llave pública recientemente importada a fin de poder utilizarla. Seleccione la llave correspondiente y haga clic sobre el botón «Sign Key/Firmar llave», se preguntará que tan convencido estamos de que esa llave es de quién dice ser y posteriormente la contraseña y la llave será incluida en nuestro anillo de confianza.

Firma, cifrado y descifrado.

Para cifrar un mensaje se debe utilizar la llave pública de la persona receptora del mensaje/archivo o la llave pública si el cifrado es por motivos de seguridad.

Hoy en día casi cualquier cliente de correo electrónico tiene la opción de firmar/cifrar correo electrónico a través de complementos. Para mayor información consulte la documentación de cada cliente de correo electrónico.

Para descifrar un mensaje el emisor seguramente utilizó la llave pública, y se requiere la llave privada para descifrarlo.

Abra una terminal como usuario regular y genere un archivo para realizar pruebas:

ls -ail > ~/archivo.txt

Ejecute lo siguiente para crear un archivo firmado en formato binario:

gpg --sign archivo.txt

Lo anterior solicitará la contraseña o frase de acceso y creará un archivo en formato binario denominado archivo.txt.sig.

Ejecute lo siguiente para crear un archivo firmado en texto legible:

gpg --clearsign archivo.txt

Lo anterior solicitará la contraseña o frase de acceso y creará un archivo en formato de texto simple denominado archivo.txt.asc.

Ejecute lo siguiente para verificar los archivos firmados en los 2 ejemplos de arriba:

gpg --verify archivo.txt.sig
gpg --verify archivo.txt.asc

Ejecute lo siguiente para generar un archivo de firma separado para un archivo.

gpg --output firma-archivo.txt.sig \
    --detach-sig archivo.txt

Lo anterior solicitará la contraseña o frase de acceso y creará el archivo en formato binario firma-archivo.txt.sig.

Ejecute lo siguiente para verificar la integridad de un archivo a partir del archivo de firma:

gpg --verify firma-archivo.txt.sig archivo.txt

Para cifrar un archivo se requiere definir el destinatario del mismo de entre la lista de identidades importadas al anillo personal. El remitente puede utilizar la cuenta de correo o la clave de identidad mostrada por gpg --list-keys que correspondiente al destinatario. Ejemplo:

gpg --output archivo-cifrado.txt.gpg \
    --encrypt --recipient alguien@algo.org \
    archivo.txt

Lo anterior solicitará la contraseña o frase de acceso.

El destinatario tendría que ejecutar lo siguiente para descifrar el archivo:

gpg --output archivo-descifrado.txt \
    --decrypt archivo-cifrado.txt.gpg

Lo anterior solicitará la contraseña o frase de acceso correspondiente a la llave del destinatario.

Ejecute lo siguiente para cifrar un documento de forma simétrica, es decir utilizando una contraseña o frase distinta a la utilizada para la llave privada:

gpg --output archivo-cifrado.txt.gpg \
    --symmetric archivo.txt

Ejecute lo siguiente para descifrar el archivo:

gpg --output archivo-descifrado.txt \
    --decrypt archivo-cifrado.txt.gpg

Lo anterior solicitará la contraseña o frase de acceso asignada al archivo.

Lo anterior solicitará ingresar una contraseña o frase de acceso con confirmación.

Diferencias entre cifrar y firmar.

Cifrar consiste en hacer ilegible un archivo o texto utilizando la llave pública del receptor del mismo quien será el único que pueda descifrar el archivo o texto utilizando su llave privada.

Firmar un archivo sólo permite asegurar al receptor de éste la identidad del creador. El autor utiliza la llave privada para firmar y el receptor la llave pública para validar la identidad del autor.

Respaldo de las llaves

Seahorse sólo permite hacer el respaldo de la llave pública. El respaldo de la llave privada sólo es posible utilizando gpg desde el intérprete de mandatos. Desde la pestaña denominada «Mis Claves personales» seleccione la llave y desde el menú contextual seleccione y haga clic sobre la opción «Export/Exportar» y se guarda el archivo como nombre.asc. Este es el archivo que se puede distribuir a cualquier persona que se quiera incluir al anillo personal.

Hay dos formas de respaldar el par de llaves. La más simple es crear un respaldo de todo el contenido de ~/.gnupg/secring.gpg (llave privada) y ~/.gnupg/pubring.gpg. El respaldo incluiría también otras llaves utilizadas y todas las llaves del anillo personal.

La forma de respaldo más confiable, precisa y segura es hacerlo utilizando gpg. Ejecute primero lo siguiente para conocer identidad de la llave:

gpg --list-secret-keys

La salida sería similar a lo siguiente:

[fulano@localhost][~]$ gpg --list-secret-keys
/home/fulano/.gnupg/secring.gpg
----------------------------------
sec 4096D/F08846B8 2004-10-27 Fulano (Personal) .....
uid Fulano (Fulano de Tal) .....
[fulano@localhost][~]$

En el ejemplo anterior: la identidad de la llave correspondería a F08846B8.

Ejecute lo siguiente para hacer respaldo de esta llave:

gpg --armor \
    -o Llave_Privada.key \
    --export-secret-keys F08846B8

El respaldo se almacenará en el archivo Llave_Privada.key.

Ejecute lo siguiente para proteger la llave privada con una contraseña o frase de acceso:

gpg --armor \
    --export-secret-keys F08846B8 \
    | gpg --armor --symmetric \
    -o Llave_Privada.key.gpg

Lo anterior solicitará una contraseña o frase de acceso con confirmación.

Ejecute lo siguiente para restaurar de la llave privada protegida con una frase de acceso:

gpg --decrypt Llave_Privada.key.gpg

Lo que solicitará la contraseña y el archivo resultante será un archivo *.key que se puede importar normalmente desde Seahorse.

Consejos Finales.