Cifrado y descifrado de ficheros con GPG en Linux

GnuPG (GPG) es una herramienta de seguridad para el cifrado de información la cual utiliza criptografía de clave pública para que los usuarios puedan comunicarse de un modo seguro. En un sistema de claves públicas cada usuario posee un par de claves, compuesto por una clave privada y una clave pública. Cada usuario debe mantener su clave privada secreta; no debe ser revelada nunca. La clave pública se puede entregar a cualquier persona con la que el usuario desee comunicarse

Realizando una analogía es como si cada usuario tuviese un par de llaves, la publica con la cual se cierra cajas fuertes con ‘X’ información secreta

y la privada con la cual abre las cajas fuertes. El usuario deja a los receptores una copia de la llave publica para que puedan cerrar cajas fuertes con el contenido que le enviaran a él y posteriormente él con su llave privada podrá abrir estas cajas fuertes y tomar la información de su interior.

Entonces para empezar debemos generar el par de claves (llaves, publica y privada) y lo haremos con la opción –gen-key del comando gpg:

$gpg --gen-key

Cuando se ejecuta el comando anterior este solicita el tipo de protocolo de cifrado que se utilizará para generar el par de llaves.

GnuPG es capaz de crear varios tipos diferentes de pares de claves, pero debe existir una clave primaria capaz de generar firmas. Por lo tanto, existen sólo tres opciones. La opción 1 genera dos pares de claves. Un par de claves DSA que es el par de claves primario que se usará sólo para firmar. Un par de claves subordinadas ElGamal que se usará para el cifrado. La opción 2 es parecida a la anterior, pero sólo genera un par de claves DSA. La opción 4 genera un único par de claves ElGamal, que se usará tanto para firmar como para cifrar. En todos los casos existe la posibilidad de añadir subclaves adicionales para cifrar y firmar «a posteriori». La mayoría de los usuarios tienen suficiente con la opción por definición.

También hay que escoger un tamaño para la clave. El tamaño de una clave DSA debe estar entre los 512 y 1024 bits, y una clave ElGamal puede ser de cualquier tamaño. Sin embargo, GnuPG requiere que las claves no sean menores de 768 bits. Por tanto, si se escogió la opción 1 y también un tamaño de claves mayor de 1024 bits, la clave ElGamal tendrá el tamaño deseado pero la DSA se limitará a 1024 bits

Entre más grande sea la clave, será menos propensa a ser rota por ataques de fuerza bruta, pero cuando se tenga que cifrar algún contenido con ella, el proceso será más lento

Y posteriormente se tendrá que seleccionar una fecha de caducidad, que si se deja por defecto, hara que el par de claves no tengan caducidad, lo que para usuarios comunes sería bastante correcto.

Además de los parámetros de la clave, el usuario debe dar un identificador. El identificador de usuario se usa para asociar la clave que se está creando con un usuario real.

Sólo se creará un identificador de usuario al generar una clave, pero es posible crear identificadores adicionales si se desea usar la clave en dos o más contextos. GnuPG necesita una contraseña con el fin de proteger las claves privadas, primarias y secundarias, que posea el usuario.

No hay límite para la longitud de una contraseña, y ésta debe ser escogida con sumo cuidado. Desde un punto de vista de seguridad, la contraseña que desbloquea la clave privada es uno de los puntos más débiles en GnuPG (y en otros sistemas de cifrado de clave pública), ya que es la única protección que tiene el usuario si alguien se apoderara de su clave privada. Para una contraseña lo ideal es que no se usen palabras de un diccionario, y que se mezclen mayúsculas y minúsculas, dígitos, y otros caracteres. Una buena contraseña es crucial para el uso seguro de GnuPG.

CIFRAR UN FICHERO

Para cifrar un fichero con GPG debemos seguir los siguientes pasos:

Primeramente como vemos tenemos un fichero normal que he creado básicamente con cat

$ls -l
 -rw-rw-r-- 1 david david  28 oct 23 22:19 fichero.original
$cat fichero.original
 fichero original sin cifrar

Si visualizamos su contenido veremos lo siguiente

Entonces con el comando gpg cifraremos el fichero, primero le indicamos con –output el nombre que obtendrá el fichero una vez cifrado, con –encrypt le indicamos que nos disponemos a cifrar, con –recipient le indicamos con que clave pública deberá cifrar el fichero, para ello tenemos que poner un identificador de la clave pública, para ello podremos ejecutar $gpg –list-keys y observar nuestro ‘anillo’ de claves, y finalmente le damos el nombre del fichero a cifrar:

$gpg --output fichero.cifrado.gpg --encrypt --recipient david fichero.original

A continuación podemos observar haciendo un simple ls -l, que el tamaño del fichero cifrado, es muchísimo más grande a pesar de que su contenido era muy escaso.

$ls -l
 -rw-rw-r-- 1 david david 624 oct 23 22:24 fichero.cifrado.gpg
 -rw-rw-r-- 1 david david  28 oct 23 22:19 fichero.original

Para comprobar el efecto tomado sobre el fichero, lo abrimos con gedit, un editor de texto de Gnome, aunque también se puede observar con cat, aunque muchas veces al visualizar este tipo de contenidos en un terminal tiene ciertos efectos extraños sobre el mismo, obligándonos a hacer un reset o a cerrarlo.

$gedit fichero.cifrado.gpg &

DESCIFRAR UN FICHERO

Para poder descifrar este fichero se necesitará la clave privada del usuario que hemos utilizado como recipiente, ya que este ha sido generado en mi propio PC poseemos la clave privada y lo descifraremos de la siguiente manera, escribimos el comando gpg, la opción –output especifica el nombre del fichero después de descifrarlo, la opción –decrypt indica que se va a descifrar el fichero nombrado a continuación.

$gpg --output fichero.sincifrar --decrypt fichero.cifrado.gpg
 Necesita una frase contraseña para desbloquear la clave secreta
 del usuario: "david (david) <email@msn.com>"
 clave ELG-E de 2048 bits, ID 834CBA3C, creada el 2014-10-23 (ID de clave primaria 44A02856)
 gpg: cifrado con clave ELG-E de 2048 bits, ID 834CBA3C, creada el 2014-10-23
 «david (david) <email@msn.com>»

Observamos el contenido del directorio:

$ls -l
 total 8
 -rw-rw-r-- 1 david david 624 oct 23 22:24 fichero.cifrado.gpg
 -rw-rw-r-- 1 david david  28 oct 23 22:48 fichero.sincifrar

y finalmente el contenido del fichero:

$cat fichero.sincifrar
 Fichero original sin cifrar

CIFRAR UN FICHERO PARA UN TERCER USUARIO

Si queremos cifrar un fichero para un tercer usuario, este debe exportar su certificado con su clave pública:

$ gpg --output usario3.cert.pgp --export usuario3

Seguidamente con otro usuario, por ejemplo el usuario 1, copiaremos su certificado a nuestro escritorio. El certificado se podría enviar también por correo o a través de otro medio.

$ cp /home/usuario3/Escritorio/usario3.cert.pgp ./

A continuación importamos el certificado del usuario3:

$ gpg --import usario3.cert.pgp
 gpg: clave 74C9177D: clave pública "usuario3 (usuario3) <usuario3@usuario3.com>" importada
 gpg: Cantidad total procesada: 1
 gpg:            importadas: 1

Y pasamos a editar el certificado para firmarlo:

$ gpg --edit-key usuario3
 gpg (GnuPG) 1.4.16; Copyright (C) 2013 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.

pub  2048D/74C9177D  creado: 2014-10-26  [caduca: 2014-10-27]  uso: SC  

                  confianza: desconocido   validez: desconocido

sub  2048g/A4215095  creado: 2014-10-26  [caduca: 2014-10-27]  uso: E   

desconocido (1). usuario3 (usuario3) <usuario3@usuario3.com>

gpg> sign
 pub  2048D/74C9177D  creado: 2014-10-26  [caduca: 2014-10-27]  uso: SC  

                  confianza: desconocido   validez: desconocido

 Huella de clave primaria: 5FC9 D7C5 2860 A760 A162  E226 2CF7 97CF 74C9 177D
 usuario3 (usuario3) <usuario3@usuario3.com>
 Esta clave expirará el 2014-10-27.
 ¿Está realmente seguro de querer firmar esta clave
 con su clave: "señor (lol) <email@msn.com>" (3667FB3F)?
 ¿Firmar de verdad? (s/N) s
 Necesita una frase contraseña para desbloquear la clave secreta
 del usuario: "señor (lol) <email@msn.com>"
 clave DSA de 2048 bits, ID 3667FB3F, creada el 2014-10-23

Una vez importado y firmado el certificado podremos cifrar un fichero con dicho certificado:

 $ gpg --output fichero.cifrado.gpg --encrypt --recipient usuario3 fichero.original

Y finalmente el usuario3 con su clave privada descifrará el fichero en cuestión:

$ gpg --output fichero.sincifrar --decrypt fichero.cifrado.gpg
 Necesita una frase contraseña para desbloquear la clave secreta
 del usuario: "usuario3 (usuario3) <usuario3@usuario3.com>"
 clave ELG-E de 2048 bits, ID A4215095, creada el 2014-10-26 (ID de clave primaria 74C9177D)
 gpg: el agente gpg no esta disponible en esta sesión
 gpg: cifrado con clave ELG-E de 2048 bits, ID A4215095, creada el 2014-10-26
   «usuario3 (usuario3) <usuario3@usuario3.com>»

Como podemos visualizar a continuación:

$ ls
 fichero.cifrado.gpg  fichero.sincifrar  usario3.cert.pgp
 $ cat fichero.sincifrar
 fichero sin cifrar$ ls
 fichero.cifrado.gpg  fichero.sincifrar  usario3.cert.pgp
 $ cat fichero.sincifrar
 fichero sin cifrar

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s