Cómo cifrar y descifrar archivos y directorios en Linux

Existen muchas maneras de cifrar un archivo o directorio en Linux, pero quizás la más común es usar GNU Privacy Guard (GnuPG o GPG), la implementación libre del estándar OpenPGP. Entre sus características destacan:

- Mejor funcionalidad que PGP y algunas mejoras de seguridad sobre PGP 2.
- Descifra y verifica los mensajes PGP 5, 6 y 7.
- Soporta ElGamal, DSA, RSA, AES, 3DES, Blowfish, Twofish, CAST5, MD5, SHA-1, RIPE-MD-160 y TIGER.
- Fácil implementación de nuevos algoritmos utilizando módulos de extensión.
- Soporta fechas de caducidad de claves y firmas.
- Soporta múltiples idiomas

Hoy vamos a ver algunos ejemplos para cifrar tanto ficheros como directorios con gpg, además de otras alternativas.

Cifrando archivos con una contraseña

En primer lugar para cifrar un fichero con gpg simplemente tendremos que escribir en nuestra consola:

gpg -c file.to.encrypt

Con la opción "-c" usaremos un cifrado simétrico usando una contraseña o passphrase. El cifrado simétrico por defecto es CAST5 pero podemos usar cualquiera de los disponibles con la opción -cipher-algo. Además, podemos combinar esta opción con -sign para firmar el mensaje, -encrypt para cifrar el mensaje mediante una passphrase o clave privada, o usar ambos simultáneamente.

Luego, para descifrar el fichero simplemente ejecutaremos:

gpg file.to.encrypt.gpg

Cifrando archivos con una clave privada

Antes de nada si queremos usar cifrado simétrico tendremos que crearnos un par de claves (privada/pública):

gpg --gen-key

root@server:/# gpg --gen-key
gpg (GnuPG) 1.4.20; Copyright (C) 2015 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.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 2y
Key expires at lun 10 dic 2018 06:36:08 CET
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: vmotos
Email address: hackplayers@ymail.com
Comment: poc
You selected this USER-ID:
    "vmotos (poc) <hackplayers@ymail.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

Repeat passphrase: 

Durante el proceso de creación de las claves es importante seleccionar una passphrase robusta, la cual se nos pedirá sólo cuando descifremos algo.

Una vez que haya suficientes bytes aleatorios disponibles, se generarán las claves. Pero la disponibilidad de suficientes bytes aleatorios no es una tarea fácil. Por lo que para tener rápidamente la suficiente entropía podemos ejecutar en otra consola:

ls -l /dev/urandom
rngd -r /dev/random

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 186 more bytes)
...........+++++
.........+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 82 more bytes)
...+++++

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 109 more bytes)
...+++++
gpg: /home/vmotos/.gnupg/trustdb.gpg: trustdb created
gpg: key 593G622F marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2018-12-10
pub   2048R/593F628F 2016-12-10 [expires: 2018-12-10]
      Key fingerprint = 1159 84C6 56E2 C9F8 C036  D545 395D AFD1 593F 628F
uid                  vmotos (poc) <hackplayers@ymail.com>
sub   2048R/B132791F 2016-12-10 [expires: 2018-12-10]

Una vez generado el par de claves, para exportar la clave pública ejecutaremos el siguiente comando:

gpg --armor --output public-key.txt --export 'vmotos'

cat public-key.txt
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

mQENBFhLlMMBCACp239DyzlvfqOuzaOgZQfuXbCUPXcXuqjow8mrCLLjwN1v7R6c
H+XcH3gezTf4R8SNUZu1LFp39ErANiEiH8C67Yj6AyKIfxJdsQ1EYU3AhQvZgX+9
tSUNLl3+qZB0oA6KggOptrYepCjSemx9VIp2zbrMUN6YG9r0eRRCFqfWlTtkOE4f
3mzWBzxZA1znZb7j2JUhrdFKXn1X64qR3Gu2gs3lkZ1bVAVRubiUXvA/PxGuOxl0
OUNguSGInYHKy3OiHVKkW7GPeNhbKDhhC6V29AnsYp24owVAf1A/qngqPeWk8x7Q
SuUD6Qs6iaD1wNM2wdh/PACho0vByUZf47RJABEBAAG0JHZtb3RvcyAocG9jKSA8
aGFja3BsYXllcnNAeW1haWwuY29tPokBPgQTAQIAKAUCWEuUwwIbAwUJA8JnAAYL
CQgHAwIGFQgCCQoLCBYCAwECHgECF4AACgkQOV2v0Vk/Yo/aqwf/VO/6gz3mcbv8
9k+ggI11ThehvC3W5wG4/jaD2YIlkXNeAyOw8L9ZkflQO4D4OziBJo9j1IUGiIjy
EOgPiwzFcVk6y5cCtT/ItgCT4Wyz30Osr+w52GyEx2hh82d6aGqfqlYYXz5X3LID
NNxuSfgr4DrkAaAlw1uBtLjF671lSm1fYHsSjRaf6YDltDFsJdSbDHt1ZXt2m9F7
TwhShfwq7mxTuVtaPyGXofHWq+kxAeBUz4u/QXlDmXGZ6zoymE4zaqLBwzEHeTzF
CMm7IXKqcU28iCTAghT/EAUjzDlN5u8gSjl2PeOAkgHIIcj+owJMeWO7CGqg2Dy6
DRccAIAjXLkBDQRYS5TDAQgAvRQ78ytZrqrmos+Ics6OCMweZ7UrVIcFsoz3SV6P
j3wn85UOlkCluVbiBySUTw0cpoW13JXbvhY/VBmtdpVdagllKxTkaGdr/njegwtB
QuwceC0Avq2BT233C8OuH2n8z62co3H2oSzI87TcSb5+bLtoZyHrgIYTexNAo9Zp
kGJPix7jwFSC8Hu+hP3UWuJo3gXi/EYksWGlCFJrxVQkNXpXoMnQycCC6nqPRMne
F/HOyS9U5+FdtaVIooalOj7vVzmS9UL5y0Eoc4Yjma36YU9IqDNPprcMdRlbIbwl
9EhQiikX1Wdxvmf47oyua7+1LqjgcCaer+ZBXo3a02n9WwARAQABiQElBBgBAgAP
BQJYS5TDAhsMBQkDwmcAAAoJEDldr9FZP2KP730H/A+TLCD2tNq2gHA9r9SNOitQ
K/5ASdZ2gAsWrWS6FKDHzk3vsfUCJubAd80R/7zxGT9ihy4xKwpQapVhI1pqxNGT
E/upsryMnYw5/yUZbEWTVlD/XvxvsqYCJRyxW3BwTtU47zSMuOJHTqfOY1DGFHga
ixednhfjBCHiTgL1etJ29NioRBtsMadY9D34y9B9k789ZR2jh0ImwxEGW2RmxHLI
9nPuzyyGfQVjnkQos8/s4WM5zBuQx9FxUyCERK2QAt63vie229IQMuWFPpH7nN3G
o46X0BSBsuD0B2qIduSpjVEfPztw5sdclXU/lf05cfZRR+GJrmB7TnPhSCCJoG0=
=SvAM
-----END PGP PUBLIC KEY BLOCK-----

Dicha clave pública tendrá que ser importada en sistema al que enviaremos el archivo cifrado:

gpg --import public-key.txt

gpg --list-keys
/home/vmotos/.gnupg/pubring.gpg
-------------------------------
pub   2048R/593F628F 2016-12-10 [expires: 2018-12-10]
uid                  vmotos (poc)
sub   2048R/B152791F 2016-12-10 [expires: 2018-12-10]


Finalmente, para cifrar el archivo con cifrado asimétrico escribiremos en la consola:

gpg --encrypt --recipient 'vmotos' archivo.txt

Y obtendremos el dichero archivo.txt.gpg cifrado para enviarlo al servidor donde previamente habíamos enviado e importado la clave pública.

Para descifrarlo:

gpg -d -o ~USERNAME/decrypted ~USERNAME/filename

Y por último, para cifrar múltiples archivos automáticamente podemos usar un sencillo script, como por ejemplo:

#!/bin/bash
line="/home/myself/Whatever/found.txt"
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Text read from file: $line"
    gpg2 -e -u mysecretkeyID -r mysecretkeyID "$line"
  done < "$1"


Cifrando directorios

Si queremos cifrar directorios podremos combinar este comando con tar, como se muestra en los siguientes casos:

tar zcvf - /tmp/directory | gpg -c > /tmp/directory.tar.gz.gpg
 

tar c project1.7z project2.7z | gpg --cipher-algo AES256 --compression-algo BZIP2 -co projects.gpg
 

tar -c foldername | gpg2 -e > folder.tar.gpg

O podemos usar gpg-zip. Por ejemplo, ciframos los contenidos del directorio mydocs al fichero test1 con el usuario Bob:

gpg-zip --encrypt --output test1.gpg --gpg-args  -r Bob mydocs

Para listar los contenidos del archivo test1:

gpg-zip --list-archive test1.gpg

Y para descifrarlo:

gpg-zip -d test1.gpg

Otra alternativa bastante popular es ecryptfs. Para instalarlo en debian/ubuntu:

sudo apt-get install ecryptfs-utils

Después crearemos un directorio "Private" de tal manera que cualquier dato que pongamos en el mismo será automáticamente cifrado cuando cerremos sesión y descifrado cuando hagamos login:

ecryptfs-setup-private

Si queremos seleccionar un directorio diferente...

mkdir ~/secret
chmod 700 ~/secret


sudo mount -t ecryptfs ~your_user/secret ~your_user/secret

Ponemos nuestros datos en ~/secret

Para cifrar:

sudo umount ~your_user/secret

Para descifrar:

sudo mount ./secret ./secret -o key=passphrase,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,

ecryptfs_passthrough=no,ecryptfs_enable_filename_crypto=yes

Otras alternativas:

- openssl

Cifrar:

openssl des3 -salt -in unencrypted-data.tar -out encrypted-data.tar.des3

Descrifrar:

openssl des3 -d -salt -in encrypted-data.tar.des3 -out unencrypted-data.tar

Abrir un directorio cifrado:

openssl enc -aes-256-cbc -d -in ~/vault.tar.gz.dat | tar xz; thunar ~/vault

Bloqueando un directorio cifrado:

tar cz vault/ | openssl enc -aes-256-cbc -out ~/vault.tar.gz.dat; rm -r ~/vault

- Aescrypt

Cifrar:

aescrypt -e -p password  file.jpg

Descifrar:

aescrypt -d -p password file.jpg.aes

- mcrypt

Cifrar:

mcrypt "File"

Descifrar:

mcrypt -d "File"

- zip

Comprimir y cifrar:

zip file.zip file
zip -r directory.zip directory
zip --encrypt file.zip.enc file # prompt for password
zip --encrypt -r directory.zip.enc directory # prompt for password


Descomprimir y cifrar:

unzip directory.zip.enc #Beware if any directory is present with the same name as the zipped file, then it would be overwritten. Hence I normally send the contents to another directory.
unzip directory.zip.enc -d directory-new # prompts for password


- ccrypt

Combinándolo con tar:

tar cvvjf - /path/to/files | ccrypt > backup.tar.bz2.cpt

Único comando:

ccrypt backup.tar.bz2

Para automatización, también permite guardar la passkey en un fichero y usarla para cifrar:

ccrypt -k ~/.passkey backup.tar.bz2

- bcrypt
   
bcrypt ~/Desktop/Tecmint/tecmint.txt
bcrypt tecmint.txt.bfe


- 7-zip


$ 7za a -tzip -p -mem=AES256 tecmint.zip tecmint.txt tecmint1.txt
$ 7za e tecmint.zip


- nautilus

GUI



Fuentes:

- http://askubuntu.com/questions/98443/encrypting-files-and-folder-through-terminal
- http://unix.stackexchange.com/questions/43846/encrypt-multiple-files-at-once
- http://superuser.com/questions/249497/how-to-encrypt-a-file-or-directory-in-linux
- http://www.everything-linux-101.com/how-to/how-to-encrypt-and-decrypt-files-folders-in-linux-using-gnupg/
- https://www.cyberciti.biz/tips/linux-how-to-encrypt-and-decrypt-files-with-a-password.html
- http://superuser.com/questions/370389/how-do-i-password-protect-a-tgz-file-with-tar-in-unix
- http://statistics.berkeley.edu/computing/encrypt
- http://www.tecmint.com/linux-password-protect-files-with-encryption/

Comentarios

  1. Hola alguien me puede explicar mejor como es la parte de desencriptarlo.
    "Para descifrarlo:gpg -d -o ~USERNAME/decrypted ~USERNAME/filename"

    Gracias.

    ResponderEliminar
    Respuestas
    1. sencillo: -d descifrar, -o salida y ~USERNAME el directorio home donde están los archivos...

      Eliminar
    2. Ahora lo entiendo, muchas gracias.

      Eliminar

Publicar un comentario