Seguridad y Criptografía

La capacidad de compartir mensajes de forma segura, guardar secretos e identificar personas siempre han sido importantes para la humanidad. Existen registros de uso de criptografía en Mesopotamia para proteger información hace más de 3500 años.
En periodos de guerra, tales habilidades se vuelven aún más importantes. Algunos siglos antes de Cristo, los espartanos ya usaban cifras de transposición y militares romanos ya poseían un sistema de contraseñas. Los alemanes hicieron uso intensivo de criptografía durante la Segunda Guerra, lo que impulsó muchos avances en el área de criptoanálisis.
La seguridad y la privacidad están entre los temas que más me interesan, especialmente las partes ligadas a diversas áreas relacionadas con la criptografía, como por ejemplo:
- Computación: algoritmos de clave simétrica, algoritmos de clave pública, funciones hash, técnicas de criptoanálisis, cifrado negable, esteganografía
- Matemáticas: matemática discreta, álgebra lineal, teoría de grupos
- Historia: cifras antiguas, uso militar de criptografía en guerras
- Sociología: discusiones sociales, políticas y filosóficas (a veces polémicas), leyes como la RIPA del Reino Unido.
Como es fácil de notar, la criptografía es un área bastante amplia, lo que no me permite entrar en muchos detalles aquí. Detalles sobre el funcionamiento de los algoritmos, benchmarks y otros análisis más profundos se encuentran en libros y otros sitios. El objetivo de este post es hablar solamente de algunos métodos de cifrado de mensajes y archivos utilizando programas y algoritmos que uso y recomiendo.
Criptografía de archivos
Vim
¡No es un cifrado seguro! (ver: https://dgl.cx/2014/10/vim-blowfish)
Cifrar archivos
Es posible cifrar archivos (textos, imágenes, etc.) directamente desde Vim de las siguientes maneras:
ROT13
Un secreto poco conocido de Vim es el comando
g?[movimiento], que aplica el ROT13 al trecho entre el inicio y el fin del movimiento.ROT13 es una cifra de César con paso 13, lo que hace que el proceso de codificación sea igual al de decodificación.
Este tipo de cifrado es demasiado débil para proteger un documento, pero tiene algunas utilidades divertidas.
Ejemplo: Digamos que aplicaste ROT13 solo a la segunda línea de un texto, que contiene la respuesta a la adivinanza (en portugués):
P: Por que tem uma cama elástica no polo norte? E: Cnen b hefb CBYNE!Para leer la respuesta basta aplicar ROT13 nuevamente (
2Gg?$o:2 norm! g?$):P: Por que tem uma cama elástica no polo norte? R: Para o urso POLAR!Si quieres cifrar un archivo entero o te encontraste algún mensaje ofuscado en internet, probablemente tr sea una alternativa mejor que Vim, pues no hace falta abrir el archivo: basta redirigir stdin a
tr a-zA-Z n-za-mN-ZA-M.Como ejemplo, prueba el siguiente comando, un homenaje a Bruce Schneier, creador de Blowfish y uno de los criptógrafos más importantes de la actualidad. Retirado de schneierfacts.com
julio@acer ~> echo "Vs lbh nfxrq Oehpr Fpuarvre gb qrpelcg guvf, \ ur'q pehfu lbhe fxhyy jvgu uvf ynhtu." | tr a-zA-Z n-za-mN-ZA-MUsando el parámetro -x por terminal
julio@acer ~> vim -x segredo.txtVim pedirá una contraseña para usarla como clave de cifrado del archivo.
Esto vale tanto para archivos nuevos como para archivos ya existentes.
Ahora tendrás que proporcionar la contraseña cada vez que edites el archivo.
Al escribir una contraseña inválida verás algo como
q,§Â²îu]2©^D!¸¡á^?%°ç]^[.julio@acer ~> file segredo.txt segredo.txt: Vim encrypted file datajulio@acer ~> cat segredo.txt VimCrypt~01!xOî4QLÉ ©è¢i¶@h@$[¾M%:XTiene el mismo efecto que la opción anterior: Vim pedirá escribir una contraseña dos veces y cifrará el archivo usando la clave introducida.
Cambiar la contraseña
Para cambiar la contraseña basta usar el parámetro +X en el terminal, digitar la contraseña antigua y luego la nueva las dos veces que Vim lo pida.
julio@acer ~> vim +X segredo.txt
Quitar la contraseña
Para quitar la contraseña, abre el archivo con Vim y borra la opción key.
:set key=
Cambiar el algoritmo de cifrado
Vim posee dos algoritmos de clave simétrica:
pkzip
No lo uses; es débil y fácil de romper.
:setlocal cryptmethod=zipAlgoritmo fuerte. Recomendado.
:setlocal cm=blowfish
Observa que cm es solo una abreviatura de cryptmethod.
Gnu Privacy Guard (GPG)
Una desventaja de Vim es que solo permite utilizar dos algoritmos (Pkzip y Blowfish), relativamente débiles en algunas situaciones y ambos de clave simétrica; es decir, el remitente (Alice) debe compartir la clave previamente con el destinatario (Bob).
Si Alice no posee ningún medio de comunicación seguro con Bob, ¿cómo pasar la contraseña del archivo cifrado de forma segura? Para eso existen algoritmos asimétricos. Alice puede simplemente enviar la contraseña cifrada usando la clave pública de Bob.
GPG es ideal para casos como ese, pues posee 3 algoritmos asimétricos y varios otros simétricos, incluido Blowfish y otros aún más fuertes. Además de algoritmos de cifrado, GPG también posee algunos para hash y compresión.
Una lista de algoritmos disponibles puede obtenerse con el siguiente comando:
julio@acer ~> gpg --version
Supported algorithms:
Pubkey: RSA, ELG, DSA
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,
CAMELLIA192, CAMELLIA256
Hash: <del>MD5</del>, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
Criptografía asimétrica
Genere su par de claves privada y pública
Un par de claves es necesario para cifrar/descifrar, firmar y verificar.
Las personas usarán tu clave pública para cifrar mensajes destinados a ti y tú usarás tu clave privada correspondiente para descifrarlos. Por lo tanto, la clave pública puede distribuirse libremente, pero la clave privada debe guardarse en secreto en un lugar seguro.
Genere su clave privada
julio@acer ~> gpg --gen-keyRSA 2048 debería ser suficiente (puede ir hasta 4096), siempre que uses una passphrase segura y no contraseñas susceptibles a ataques de diccionario o fuerza bruta simples.
Es decir, nada de contraseñas cortas, numéricas, el nombre de tu chihuahua o palabras comunes.
La passphrase
_EsteSitioEsMuyGenial!_es mucho mejor que_banana1_, y tan fuerte como_$%Sh4x0rq56lohap[3é-!_, pero mucho más fácil de recordar.Tira obligatoria en este tipo de post: https://xkcd.com/936/
Genere una versión ASCII de su clave pública
julio@acer ~> gpg --armor --output juliopub.asc --export julio@juliobs.com--armorgarantiza que la salida será ASCII (Base64).
Compartir claves públicas
Después de generar un archivo ASCII con tu clave pública, puedes compartirlo con otras personas.
Ellas necesitarán importarla usando gpg --import y tú tendrás que hacer lo mismo para
responderles:
julio@acer ~> gpg --import < alice.asc
Una forma de verificar la autenticidad de la clave pública de Alice es comparar el fingerprint que
te informe con la salida de gpg --fingerprint.
Importar una clave privada
Importar claves privadas puede ser útil en 3 casos:
- Usas más de un ordenador y quieres poder descifrar mensajes en todos ellos
- Reinstalaste el sistema y quieres importar la clave privada de la que hiciste copia de seguridad
- Formas parte de un grupo que comparte una misma clave
Para todos esos casos, el comando es:
julio@acer ~> gpg --allow-secret-key-import --import private_key.asc
Cifre un archivo
julio@acer ~> gpg --encrypt --recipient julio@juliobs.com segredo.txt
julio@acer ~> gpg --encrypt --armor --recipient julio@juliobs.com segredo.txt
El primer comando genera un archivo binario llamado segredo.txt.gpg y el segundo un archivo de
texto llamado segredo.txt.asc. Si necesitas pegar el mensaje cifrado en un email, usa el segundo
(con --armor); de lo contrario, el primero es preferible por generar un archivo menor:
julio@acer ~> file segredo.txt*; ls -lh segredo.txt*
segredo.txt: UTF-8 Unicode text
segredo.txt.asc: PGP message
segredo.txt.gpg: GPG encrypted data
-rw-r--r-- 1 julio users 163 Jun 10 20:58 segredo.txt
-rw-r--r-- 1 julio users 1.1K Jun 10 21:01 segredo.txt.asc
-rw-r--r-- 1 julio users 740 Jun 10 20:59 segredo.txt.gpg
Criptografía simétrica
Usando el algoritmo por defecto AES128 (antes era CAST-128)
julio@acer ~> gpg --symmetric lol.ttUsando AES-256 (Rijndael)
AES-256 es de los algoritmos más fuertes, utilizado actualmente por el gobierno estadounidense para cifrar archivos Top Secret
julio@acer ~> gpg --cipher-algo AES256 --symmetric segredo.txt
Criptografía híbrida
Descifre un archivo
julio@acer ~> gpg --output archivo_descifrado.txt --decrypt segredo.txt.gpg
Escribe tu contraseña cuando se solicite y el archivo secreto será descifrado y guardado como
archivo_descifrado.txt.
Interfaz gráfica
Seahorse
Seahorse es un programa que facilita la gestión de tus claves. También puede usarse para crear claves PGP, Secure Shell y almacenar contraseñas.
Se instala con el siguiente comando:
julio@acer ~> sudo pacman -S seahorse
Kgpg
Kgpg es una interfaz gráfica para GPG.
Instale el plugin gnupg para Vim
Para instalarlo, copia el plugin a ~/.vim/plugin o, si usas Vundle para gestionar tus plugins,
solo agrega Bundle 'git://gitorious.org/vim-gnupg/vim-gnupg.git' al .vimrc y ejecuta
:BundleInstall!
Ahora puedes abrir archivos .gpg sin tener que teclear gpg --decrypt; Vim pedirá tu contraseña.
Mi clave pública (generada en el paso 1.2)
OpenSSL
También podemos usar OpenSSL para cifrar archivos.
julio@acer ~> openssl aes-256-cbc -salt -in segredo.txt -out segredo.aes
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
julio@acer ~> cat segredo.aes
Salted_Ø$5ÝGa$´³1äÄõýÓË
julio@acer ~> openssl aes-256-cbc -d -salt -in segredo.aes -out segredo.txt
enter aes-256-cbc decryption password:
julio@acer ~> cat segredo.txt
Este arquivo é secreto!
Mcrypt
Instale Mcrypt
julio@acer ~> sudo pacman -S mcryptCifre un archivo
julio@acer ~> mcrypt -a rijndael-128 segredo.txt Enter the passphrase (maximum of 512 characters) Please use a combination of upper and lower case letters and numbers. Enter passphrase: Enter passphrase: File segredo.txt was encrypted.Descifre un archivo
julio@acer ~> mcrypt -d segredo.txt.nc Enter passphrase: File segredo.txt.nc was decrypted.
7zip
7zip también permite cifrar archivos con AES-256
julio@acer ~> 7z a -p -mem=AES256 -tzip segredo.7z segredo.txt
7-Zip [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
Scanning
Creating archive segredo.7z
Enter password (will not be echoed) :
Verify password (will not be echoed) :
Compressing segredo.txt
Everything is Ok
julio@acer ~> 7z l -slt segredo.7z | grep Method
Method = AES-256 Deflate
Observa que, a pesar de que los algoritmos sean los mismos, hay diferencias de implementación, lo que hace que un archivo cifrado con OpenSSL no sea descifrable con GPG, por ejemplo.
Ataque de contraseñas
Existen programas para descubrir la contraseña de archivos usando ataques de diccionario o fuerza bruta.
Recomiendo John the Ripper y Ophcrack.
Ya olvidé (más de una vez) la contraseña de archivos cifrados, pero por suerte sabía más o menos cuál era el patrón y pude crear diccionarios para intentar romperlos.
Uno de esos casos fue una imagen de disco sparsebundle de macOS.
Primero necesité extraer el hash de forma que John the Ripper pudiera atacarlo:
$ dmg2john segredo.sparseimage > segredo.txt
Después necesitaba crear un diccionario. Yo sabía que:
- Si la contraseña empieza con un número, es 5, 7, 123 o 321
- Palabra1, Palabra2 o Palabra3 aparecen en la contraseña
- El final es siempre -A, -B o -C
Una forma simple de crear un diccionario con todas las posibilidades de contraseñas que obedecen a esos criterios es usando Perl:
perl -lwe "print for glob '{5,7,123,321,}{Palavra1,Palavra2,Palavra3}-{A,B,C}'" > wordlist.txt
Luego basta dejar a JTR hacer el ataque de diccionario:
john --fork=4 --wordlist=wordlist.txt segredo.txt
Y verificar si consiguió descubrir la contraseña:
$ john --show segredo.txt
segredo.sparseimage:123Palavra2-C::::segredo.sparseimage
1 password hash cracked, 0 left
VeraCrypt
(Sección añadida el 26 de enero de 2019)
VeraCrypt es un fork del descontinuado TrueCrypt y es mi herramienta favorita para cifrar discos a los que necesito acceder desde Linux, Windows y macOS.
Puede cifrar una partición entera o crear, en un único archivo, un contenedor cifrado con un sistema de archivos dentro.
Es posible elegir entre AES, Serpent, Twofish, Camellia, Kuznyechik o una combinación de
estos algoritmos. También cuenta con varias funciones hash como SHA-256, SHA-512, Streebog y
Whirlpool.
Otra característica interesante de VeraCrypt son los hidden volumes, es decir, volúmenes ocultos al
final de otros volúmenes.
Todo volumen posee espacio para dos cabeceras. Si la contraseña introducida es la del primero, se
descifra el volumen externo; si la contraseña es la del segundo, se descifra el volumen oculto.
Esto permite la llamada negación plausible, pues es imposible probar la existencia de un volumen
oculto.
Crear un nuevo volumen es bastante intuitivo.
Mi recomendación es usar NTFS si el disco se utilizará en Windows, pues NTFS es el único sistema
de archivos soportado que posee journaling. Si no necesitas journaling, recomiendo exFAT.
Para montar un volumen cifrado en macOS:
/Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --text --keyfiles="" --pim="0" --protect-hidden="no" /dev/disk3s5 /Volumes/Dev
Para desmontar:
$ /Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --dismount /dev/disk3s5
Enlaces
- http://arstechnica.com/security/2012/08/passwords-under-assault/
- http://irtfweb.ifa.hawaii.edu/~lockhart/gpg/gpg-cs.html
- http://sleepyhead.de/howto/?href=crypt
- http://vim.wikia.com/wiki/Encryption
- http://www.activism.net/cypherpunk/manifesto.html
- http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto.html
- http://www.gnupg.org/gph/en/manual.html
- http://www.lockdown.co.uk/?pg=combi
- http://www.madboa.com/geek/gpg-quickstart/
- http://www.philzimmermann.com/EN/essays/WhyIWrotePGP.html
- http://www.theregister.co.uk/2009/11/24/ripa_jfl/
- http://www.theregister.co.uk/2010/06/28/brazil_banker_crypto_lock_out/
- http://www.wired.com/gadgetlab/2012/11/ff-mat-honan-password-hacker
- http://www.wirelessbrasil.org/wirelessbr/colaboradores/leonardo_vilela/tutorial_pgp.html
- https://en.wikipedia.org/wiki/Password
- https://wiki.archlinux.org/index.php/System_Encryption_with_LUKS_for_dm-crypt
- https://wiki.archlinux.org/index.php/Truecrypt
- Defcon: http://youtu.be/0WPny7wk960