Este artículo explica cómo cifrar archivos con criptografía simétrica (sin necesidad de claves públicas) utilizando GnuPG. De esta forma es posible proteger archivos que contienen información confidencial a través de una contraseña.
GnuPG (GPG) es una implementación completa del estándar OpenPGP definido en la RFC4880 (PGP). Permite encriptar y firmar datos y comunicaciones, a través de un sistema de gestión de claves públicas (criptografía asimétrica). Sin embargo también permite utilizar criptografía simétrica (AES) para cifrar archivos. La herramienta de línea de comandos gpg
se utiliza para acceder a todas las características de GnuPG, permite cifrar, descifrar y firmar datos y comunicaciones, y gestionar las claves.
Es posible conocer la configuración y algoritmos soportados recurriendo a la ayuda de gpg
:
emi@hal9000:~ % gpg -h | head -n 15 gpg (GnuPG) 2.1.16 libgcrypt 1.7.5 Copyright (C) 2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Home: /home/emi/.gnupg Supported algorithms: Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256 Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224 Compression: Uncompressed, ZIP, ZLIB, BZIP2
Veamos cómo se utiliza GnuPG para cifrar un archivo utilizando un ejemplo. Para ello, crear un archivo de prueba:
emi@hal9000:~ % echo "Prueba de cifrado" > prueba.txt emi@hal9000:~ % cat prueba.txt Prueba de cifrado
Para cifrar un archivo utilizando criptografía simétrica, se debe recurrir a la opción -c
:
gpg -c ARCHIVO
Por ejemplo:
emi@hal9000:~ % gpg -c prueba.txt Enter passphrase Passphrase: Please re-enter this passphrase Passphrase:
Este comando solicita que se ingrese la clave o contraseña (password) de cifrado. Esta contraseña deberá ser conocida por quien desee descifrar luego el archivo.
Al finalizar se crea un nuevo archivo de igual nombre pero agregando la extensión .gpg
:
emi@hal9000:~ % file prueba.txt* prueba.txt: ASCII text prueba.txt.gpg: GPG symmetrically encrypted data (AES cipher) emi@hal9000:~ % ls -lh prueba.txt* -rw-r--r-- 1 emi wheel 18B Jan 30 09:53 prueba.txt -rw-r--r-- 1 emi wheel 95B Jan 30 09:53 prueba.txt.gpg
Es posible comprobar que el contenido del nuevo archivo es indescifrable si no se desencripta con la contraseña ingresada previamente:
emi@hal9000:~ % hexdump -C prueba.txt 00000000 50 72 75 65 62 61 20 64 65 20 63 69 66 72 61 64 |Prueba de cifrad| 00000010 6f 0a |o.| 00000012 emi@hal9000:~ % hexdump -C prueba.txt.gpg 00000000 8c 0d 04 07 03 02 5d e9 09 e4 b4 bc 19 4d 60 d2 |......]......M`.| 00000010 4e 01 d0 b8 21 3c 4f 0a c9 98 d9 30 fe 05 e4 8c |N...!<O....0....| 00000020 c9 93 d7 9a 10 96 df 35 3f 1c 4c 77 36 d1 3d 4a |.......5?.Lw6.=J| 00000030 10 87 3b b3 da c1 a8 c9 db 58 67 03 43 96 98 2d |..;......Xg.C..-| 00000040 3c 3e fe d5 b6 d1 62 76 3f ab 55 b8 46 b2 47 74 |<>....bv?.U.F.Gt| 00000050 85 48 db 65 87 fc d1 3f a0 22 db 1f d5 02 81 |.H.e...?.".....| 0000005f
Luego es deseable borrar el archivo original, para que la información contenida dentro del mismo sea sólo accesible a través de la contraseña secreta:
emi@hal9000:~ % rm prueba.txt emi@hal9000:~ % ls -lh prueba.txt* -rw-r--r-- 1 emi wheel 95B Jan 30 09:53 prueba.txt.gpg
Para descifrar el archivo, se utiliza el siguiente comando:
gpg ARCHIVO.gpg
Por ejemplo:
emi@hal9000:~ % gpg prueba.txt.gpg gpg: AES encrypted data gpg: encrypted with 1 passphrase
Al finalizar se crea con éxito el archivo prueba.txt
y su contenido es consistente e inalterado:
emi@hal9000:~ % ls -lh prueba.txt* -rw-r--r-- 1 emi wheel 18B Jan 30 09:54 prueba.txt -rw-r--r-- 1 emi wheel 95B Jan 30 09:53 prueba.txt.gpg emi@hal9000:~ % cat prueba.txt Prueba de cifrado
Notar que GnuPG no ha solicitado la contraseña al momento de desencriptar. Esto sucede porque se ha desencriptado el archivo en el mismo sistema y bajo el mismo usuario. GnuPG almacena las claves del usuario en un repositorio dentro del directorio ~/.gnupg/
. Es indispensable para la seguridad proteger el acceso a dicho directorio:
emi@hal9000:~ % ls -ld ~/.gnupg/ drwx------ 3 emi wheel 512 Jan 30 09:55 /home/emi/.gnupg/
Al desencriptar el mismo archivo en otro sistema, solicita la contraseña, con lo cual queda protegido correctamente:
root@linuxito:~# gpg prueba.txt.gpg gpg: directory `/root/.gnupg' created gpg: new configuration file `/root/.gnupg/gpg.conf' created gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run gpg: keyring `/root/.gnupg/secring.gpg' created gpg: keyring `/root/.gnupg/pubring.gpg' created gpg: AES encrypted data gpg: encrypted with 1 passphrase root@linuxito:~# cat prueba.txt Prueba de cifrado
Referencias
man gnupg
The GNU Privacy Guard Manual (version 2.1.18, January 2017)