Seguridad y Criptografía

jul. 9, 2012·
Julio Batista Silva
Julio Batista Silva
· 10 min de lectura

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:

  1. 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-M
    
  2. Usando el parámetro -x por terminal

    julio@acer ~> vim -x segredo.txt
    

    Vim 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 data
    
    julio@acer ~> cat segredo.txt
    VimCrypt~01!xOî4QLÉ
    ©è¢i¶@h@$[¾M%
    
  3. :X

    Tiene 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=zip
    
  • Blowfish

    Algoritmo 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.

  1. Genere su clave privada

    julio@acer ~> gpg --gen-key
    

    RSA 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/

  2. Genere una versión ASCII de su clave pública

    julio@acer ~> gpg --armor --output juliopub.asc --export julio@juliobs.com
    

    --armor garantiza 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:

  1. Usas más de un ordenador y quieres poder descifrar mensajes en todos ellos
  2. Reinstalaste el sistema y quieres importar la clave privada de la que hiciste copia de seguridad
  3. 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

  1. Usando el algoritmo por defecto AES128 (antes era CAST-128)

    julio@acer ~> gpg --symmetric lol.tt
    
  2. Usando 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

  1. Instale Mcrypt

    julio@acer ~> sudo pacman -S mcrypt
    
  2. Cifre 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.
    
  3. 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

Julio Batista Silva
Autores
Senior Cloud Developer
comments powered by Disqus