martes, 1 de octubre de 2013

Guía básica de cifrado con GPG (I)



En alguna ocasión he mencionado que existe la "firma criptográfica", que es una forma de asegurarnos que los datos que recibimos son efectivamente de quien se supone que son; por ejemplo, es lo que se usa para verificar el origen de los repositorios Debian, como ya sabréis. La gran noticia es que el proyecto GNU ha puesto el cifrado seguro al alcance de todo el mundo con su famoso GnuPG (GPG), la implementación libre del protocolo Pretty Good Privacy (PGP). Estos días, en /etc/cron.d, enseñaremos a utilizarlo para que todos podáis aprovecharos del poder de la criptografía para asegurar vuestras comunicaciones.

El protocolo PGP es un protocolo de cifrado asimétrico; es decir, se utiliza una clave para cifrar y otra para descifrar. Una de ellas es privada y no debe ser compartida con absolutamente nadie, porque es la que garantiza nuestra identidad (firma) y nuestra privacidad (descifrado). La pública, en cambio, es la que permite la comunicación con otras personas, ya que se usa para comprobar nuestra firma o para que puedan cifrar datos destinados solo para nosotros. Como veis, es un sistema criptográfico enfocado a la transmisión de datos y no tanto, por ejemplo, al cifrado de datos en un disco duro, donde lo más sensato es usar un sistema simétrico.

Afortunadamente, GPG gestiona todas las claves, cifra y firma sin mucha más interacción que introducir un par de órdenes. Lo primero, por supuesto, sería crear nuestro par de claves. Para ello, hacemos esto:

usuario@localhost:~$ gpg --gen-key
GPG nos preguntará qué algoritmo querremos usar para generar nuestra clave. Hay unas cuantas opciones, pero solo dos sirven tanto para cifrado como para firmar: RSA/RSA y DSA/ElGamal. Las diferencias son bastante técnicas, así que simplemente usaremos RSA/RSA porque es la predeterminada. En todo caso, elegir una u otra opción no restringe en absoluto nuestra capacidad de comunicación, sino que simplemente la forma y ciertas propiedades del par de claves (por ejemplo, DSA/ElGamal es más rápido firmando y genera firmas algo más pequeñas). 

Le damos a Intro y el segundo paso será definir la longitud de la clave. A mayor longitud, mayor protección contra un ataque de fuerza bruta; es decir, ataques basados en adivinar la clave y no en debilidades del algoritmo. La longitud predeterminada es 2048 (bits). Una clave de esa longitud tomaría más tiempo de adivinar que la edad del universo y ni hablar de una longitud de 4096 bits. Aún así, usaremos esta última longitud porque mientras más corta sea una clave, más rápido pueden ser factorizadas (las claves RSA se basan en la búsqueda de números primos, si se puede factorizar en primos podemos recrear la clave privada sabiendo la pública). De hecho, la longitud 1024 se considera poco segura porque se sospecha que los servicios de inteligencia pueden factorizarla en un tiempo relativamente corto.

Una vez que hayamos elegido la longitud, nos toca establecer la caducidad de la clave. Esto es una característica fundamental, porque reduce el daño que pudiera ocurrir si alguien encontrara nuestras claves o si, por alguna razón, dejamos de usar alguna y nos olvidamos de borrarla. Un par de claves caducadas, simplemente, no deja cifrar ni descifrar ni comprobar firmas ni nada. Por supuesto, la fecha de caducidad está encriptada en la misma clave, por lo que no puede manipularse para extenderla artificialmente.

Finalmente, GPG nos pedirá nuestro nombre y correo electrónico, que irán asociados a la clave (aunque el correo es opcional) y, como último paso, nos obligará a proteger nuestra clave pública con una contraseña, para que no baste con copiar el fichero con la clave para poder utilizarla.

Entonces, GPG generará nuestra clave. Veréis que os pedirá que se genere "entropía"; si sois buenos lectores de este blog, os sonará de la entrada de RDRAND. Lo que quiere decir esto es que, para generar aleatoriamente los números primos, será necesario captar actividad del hardware del ordenador, porque se supone que no es predecible (yo estoy ahora escribiendo esta entrada, mientras tengo un lector de noticias abierto, que supone uso de red, etc.). Cuando se haya recogido la suficiente entropía, GPG logrará terminar de generar las claves y acabará el proceso dándonos un resumen de la generación. No, no es necesario copiar nada a mano, porque GPG también gestiona todas las claves que tengamos en el sistema. Para verlas, basta usar esto para ver nuestras claves públicas. Por ejemplo, está la mía propia y una de una tal "Mary Long" (mentira, acabo de generarla yo mismo, pero podría haberla importado de alguien):

usuario@localhost:~$ gpg --list-keys
/home/usuario/.gnupg/pubring.gpg
----------------------------
pub   4096R/6D2300C4 2013-06-17 [caduca: 2015-06-17]
uid                  Eugenio M. Vigo <xxxx@xxxx>
sub   4096R/E58D941B 2013-06-17 [caduca: 2015-06-17]
pub   4096R/98DBC18E 2013-09-30
uid                  Mary Long
sub   4096R/135BAC7B 2013-09-30
Para ver las claves privadas, se usa el comando que sigue, pero nunca, nunca compartáis ninguna información de las claves privadas, por mínima que sea.

usuario@localhost:~$ gpg --list-secret-keys
Cifremos, pues, nuestro primer texto. Esto es tan simple como ejecutar gpg -er [ID destinatario] fichero. Esto creará un fichero binario acabado en ".gpg" que contendrá la versión cifrada de nuestro original. Por supuesto, el único requisito para hacerlo es que tengamos la clave pública el destinatario. Imaginemos, pues, que le quiero enviar el fichero "texto" a Mary Long:

usuario@localhost:~$ cat texto
Hola!
usuario@localhost:~$ gpg -er "Mary Long" texto
El fichero "texto.gpg" será ilegible para cualquier editor de textos y eso es un problema si, por ejemplo, queremos enviar un correo electrónico que sea el texto cifrado. Sí, siempre podemos adjuntar el fichero ".gpg", pero lo que se suele hacer es crear una versión cifrada "con armadura ASCII" (ASCII-armored); es decir, formatear el cifrado de manera que sea legible por cualquier cosa que manipule textos. Para hacerlo, necesitamos usar la opción -a. El resultado se guarda en un fichero ".asc":

usuario@localhost:~$ gpg -a -er "Mary Long" texto
usuario@localhost:~$ cat texto.asc
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.14 (GNU/Linux)
hQIMA/Xd0L4TW6x7AQ//Zgq242qRZADgwYA4B/smV8Dk1fp0EbvdnOVyXPf+rMCY
quVohAwxZ2FWRhUDNquRtWzdfP2N+JMcMqnjoeMSalYtW8FdMywgJ4tmi57Aqaz9
JX/MU0AhBZMna6867My/bRUKtyObjpEOCe8aMypFgJr9pMPEtyckACt7eugtsx5o
qvZ4ohMRgdkFPlqdklKS5TyaxgIXGJhCPqFY0DgcNchtufc3K4aCAjHxLGWH08nH
l/oC93jOs2+a75zziXRSj+z/rkx3e8CKk/XYaCq6grTPw/VTj2Qh2fep4WmIjeuX
K6jkD6Ig9fEJZZWaEGuwlxD4fSVjzuzTmE2zvuOhYS0OWeIl3bcaZG15qK7MJH0W
D3XyEtFXAXbuUsT89J71RGEdq+ju0GmXVJOcyso4EU8nGbfSD0iogaIf0aBrgG/z
XaZkp1xpwPeW4XpnGNe1yMLg9svwIgj72U0aFRAqswnpSMj0HUfKr+RYze6IBIf7
1YCwC8eTzwFnB6scDS5mstFUOxu1fJAc0qMQ/R7+EtIvNeywIP8jEchFdEYbJUgV
BflFSyGCuJxKkAiwGLBsVKMXStn6XFPsvAr6f7BQmM1azk9VaEehagvC5j4+vNTh
BXskFAdfZDt1vycqM1VZ6DX8M4DicWhxDakwKvOZE+SdpwRClYNVo+k8pq0NAHPS
RgHIstzsONJHL2sXTekt/lMOSIk9ZU3JhHJSZobmfMgBW+q+Bgvrarno86jEv5VA
QAxgUtHtKtxZV/RsNbCN/8gpd/KLv8A=
=0Kjv
-----END PGP MESSAGE-----
Imaginemos ahora que somos Mary Long y recibimos ese mensaje ultrasecreto. Necesitaremos descifrarlo, obviamente, y para ello usamos nuestra clave privada, que solo conocemos nosotros. Para el descifrado tan solo usamos el comando gpg fichero, independientemente del formato en que nos llegue el fichero cifrado, si binario o "con armadura ASCII":

usuario@localhost:~$ gpg texto.asc
Al descifrar, GPG nos pedirá la clave que protege la clave privada, para evitar que alguien con acceso al ordenador pueda usarla indiscriminadamente. El fichero se descifra y se guarda con el mismo nombre que tenía originalmente ("texto", en este caso). Si queremos que el resultado no se guarde, sino que tan solo se muestre en la terminal, podemos usar la opción -o.

Hoy hemos aprendido a crear nuestras claves y a cifrar y a descifrar un fichero, así que ya podéis tener comunicaciones seguras entre vosotros si os interesa. La entrega siguiente tratará de cómo firmar un documento o fichero y de la importancia de firmar claves, que es un elemento importantísimo para asegurarnos de que las claves públicas realmente vengan de donde vengan. Mientras tanto, practicad y si tenéis alguna duda o problema, podéis comentarlo abajo.  

1 comentario:

  1. Muy bien explicado y muy claro.
    Felicidades por la entrada y por el blog.

    Saludos!

    ResponderEliminar