Cifra tus archivos fácilmente con GPG

GNU Privacy Guard o más conocido como GPG es una herramienta de software libre para cifrado y firmas digitales.GPG usa una combinación de criptografía de claves simétricas y criptografía de claves públicas

Criptografía de clave simétrica

La criptografía de clave simétrica consiste en utilizar la misma clave para cifrar y descifrar los mensajes. En una primera aproximación parece que no hay ningún problema con este enfoque pero tiene dos problema que no están relacionados directamente con su seguridad, pero si que son de gran importancia:

  1. No podemos garantizar que se pueda transmitir la clave de forma segura.La cuestión es, ¿es el canal de comunicación seguro? Me explico; imaginaos que dejásemos la clave por escrito, que se enviara por email, que se dijera en voz alta, o a través de una llamada telefónica si hubiera alguien escuchando o interceptando la comunicación podría obtener también acceso a los archivos.
  2. El numero de claves que se necesitan: Para comunicarse n personas entre sí, necesitaremos n/2 claves diferentes, cosa que a gran escala se vuelve insostenible.

Pero eh no saquéis conclusiones precipitadas, esto no quiere decir que sea inseguro o que no haya que usarala, hay usos bastante interesante que le podemos dar a la criptografía de clave simétrica, como es el que abordaremos en este post para cifrar nuestros propios archivos.

Podemos cifrar de forma simétrica con gpg con los siguientes flags:

gpg -c --symmetric archivo.txt
-c: cifrar
--symmetric: usa cifrado simétrico

Y descifrar el fichero con el comando:

gpg -d archivo.txt

Ahora que ya sabemos como cifrar y descifrar archivos, pero como tengamos que hacer esto para cifrar todos los archivos de un USB con más de 1000 archivos, echamos la tarde entera, así que lo mejor seria montar un script que nos cifre y descifre un directorio recursivamente.

Automatizando el cifrado de nuestros archivos

Para la parte del cifrado vamos a hacer dos funciones una principal que busque recursivamente todos los archivos para el path dado ( cosa que podemos fácilemente implementar utilizando la herramienta de find) y llame a la segunda función que se ejecutara por cada archivo, cifrandolo y borrando el archivo en claro.

cipher(){
    FILE_NAME="$(basename "${entry}")"
    DIR="$(dirname "${entry}")"
    NAME="${FILE_NAME%.}" EXT="${FILE_NAME##.}"
    printf "[+]Encripting $FILE_NAME \n"
    gpg --symmetric --batch --passphrase $password $DIR/$FILE_NAME
    rm $DIR/$FILE_NAME
}

reccipher(){
    for entry in $(find $ruta); do
    if [ -f "$entry" ]; then
        cipher
    fi
    done
}

El flag –batch nos sirve para indicar que va a ser un procesamiento por lotes y con el flag –passphrase le indicamos la contraseña

Para el descifrado usaremos una estructura similar a la usada en la parte anterior:

decipher(){
   FILE_NAME="$(basename "${entry}")"
   DIR="$(dirname "${entry}")"
   NAME="${FILE_NAME%.}" EXT="${FILE_NAME##.}"
   printf "[+]Decripting $FILE_NAME \n"
   gpg -d --output $DIR/$NAME --batch --passphrase $password $DIR/$FILE_NAME
   if [ "$?" -eq "0" ]; then
      rm $DIR/$FILE_NAME
   fi
}

recdecipher(){
    for entry in $(find $ruta -name *.gpg); do
        if [ -f "$entry" ]; then 
            decipher
        fi
    done
}

Por si os lo preguntáis y no sabéis lo que es el «$?», devuelve el código de error retornado por la ultima instrucción ejecutada, si este es igual a 0, es que se ha ejecutado correctamente.

Para el main del script solicitamos la contraseña y comprobando los argumentos que se le han pasado:

ruta=$2
option=$1
read -p "Introduce la clave de cifrado: " password
if [ "$password" = "" ];then
    echo "[!]Clave no valida"
    exit 0;
fi
if [[ "$1" = "-c" || "$1" = "-C" ]]; then
    reccipher
elif [[ "$1" = "-d" || "$1" = "-D" ]]; then
    recdecipher
fi

Vale ahora que ya tenemos todas las piezas veamos el resultado del script:

Como veis funciona perfectamente aunque a modo de consejo utilizad una contraseña más compleja que la del ejemplo, ya que toda la seguridad recae en la clave que utilicemos, como ya dice el principio de Kerchohoff.

El principio de Kerchohoff dice que la fortaleza de un sistema o algoritmo de cifrado debe recaer en la clave y no en el algoritmo que si es conocido.

Para solventar los problemas con el intercambio de claves nace la criptografía asimétrica.

Criptografía asimétrica

La criptografía asimétria o también llamada como criptografía de cable pública ,pretende garantizar un intercambio seguro entre dos partes , autentificandolas mutuamente. Para ello en vez de cifrar y descifrar con la misma clave en el emisor y el receptor, cada usuario del sistema criptográfico ha de poseer una pareja de claves: La clave privada y la clave publica.

  • La clave privada es de uso exclusivo del propietario y no la compartirá con nadie.
  • La clave pública, como su nombre indica sera de dominio publico.

Estas claves son complementarias lo que cifra una solo lo puede descifrar la otra y viceversa. Por lo que a la hora de enviar un archivo cifrado del usuario 1 al usuario 2, lo cifrariamos con la clave publica del usuario 2, de forma que solo se pueda descifrar con la clave privada del usuario 2 que solo el usuario 2 conoce.

El par de claves se basan en funciones hash de un solo sentido, lo que garantiza que pese a ser la clave pública una clave derivada de la privada, no sea posible determinar la clave privada a partir de su clave pública.

Pero no todo lo que reluce es oro, este método también tiene sus desventajas:

  • Para una misma longitud de clave y mensaje se necesita mayor tiempo de procesamiento.
  • Las claves deben ser de mayor tamaño que las simétricas.
  • El mensaje cifrado ocupa más espacio que el original.

Y hasta aquí la teoría pasemos a ver que podemos hacer con GPG.

Para generar nuestro par de claves usamos el comando:

gpg --gen-key.

Podemos ver la lista las claves públicas de la siguiente forma:

gpg --list-public-keys

Y lo mismo con la lista las claves privadas.

gpg –list-secret-keys

Okey, ya tengo mi par de claves pero ahora ¿Cómo las distribuyo? Para distribuir las claves, se puede hacer de dos formas:

1. Enviársela directamente al otro interlocutor, para ello podemos exportar la clave de la siguiente forma:

gpg --output publicKey.gpg --export namepublickey

2. La otra opción sería usar un servidor de claves público, como pueden ser:

  • keys.gnupg.net
  • pgp.rediris.es

Para subir la clave a un servidor de claves, lo podemos hacer sencillamente con la siguiente clave:

gpg --send-keys --keyserver keys.gnupg.net <ClaveID>

Y para descargar la clave solo necesitamos conocer su hash:

gpg --keyserver keys.gnupg.net --recv <ClaveID_destinatario>

Ahora que ya tenemos en nuestro equipo la clave publica del destinatario cifraremos el mensaje de la siguiente forma.

gpg --output <salida> --encrypt --recipient <correo_dest> <archivo>

El destinatario podrá descifrarlo utilizando su clave privada con la opción gpg -d

Y hasta aquí el post de hoy espero que os sea de utilidad, Bye.

Referencias:

https://academy.bit2me.com/que-es-criptografia-asimetrica/

Una respuesta a “Cifra tus archivos fácilmente con GPG

Add yours

Deja un comentario

Esta web funciona gracias a WordPress.com.

Subir ↑

Diseña un sitio como este con WordPress.com
Comenzar