Seguridad y criptografía

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

Poder compartir mensajes de forma segura, guardar secretos e identificar a las personas siempre ha sido importante para la humanidad. Hay constancia de que en Mesopotamia ya se usaba criptografía para proteger información hace más de 3500 años.

En tiempos de guerra estas habilidades resultan aún más importantes. Unos siglos antes de Cristo los espartanos ya usaban cifras de transposición y los militares romanos tenían un sistema de contraseñas. Los alemanes hicieron un uso intensivo de la criptografía durante la Segunda Guerra Mundial, lo que también impulsó muchos avances en criptoanálisis.

La seguridad y la privacidad están entre los temas que más me interesan, sobre todo en lo que tocan a las distintas áreas relacionadas con la criptografía, por ejemplo:

  • Informática: algoritmos de clave simétrica, algoritmos de clave pública, funciones hash, técnicas de criptoanálisis, deniable encryption esteganografía
  • Matemáticas: matemática discreta, álgebra lineal, teoría de grupos
  • Historia: cifras antiguas, uso militar de la criptografía en las guerras
  • Sociología: debates sociales, políticos y filosóficos que de vez en cuando levantan mucha polémica, y leyes como la RIPA del Reino Unido.

Como se ve, la criptografía es un campo muy amplio, así que no puedo entrar aquí en muchos detalles. El funcionamiento de los algoritmos, los benchmarks y otros análisis más a fondo se encuentran en libros y en otras webs. El objetivo de esta entrada es hablar solo de algunos métodos para cifrar mensajes y archivos con programas y algoritmos que uso y recomiendo.

Cifrado de archivos

Vim

¡No es un cifrado seguro! (ver: https://dgl.cx/2014/10/vim-blowfish)

Cifrar archivos

Se pueden cifrar archivos (textos, imágenes, etc.) directamente desde Vim de estas formas:

  1. ROT13

    Un secreto poco conocido de Vim es el comando g?[movimiento], que aplica ROT13 al fragmento que va del inicio al final del movimiento.

    ROT13 es un cifrado César con paso 13, de modo que el proceso de codificación es igual que el de decodificación.

    Este tipo de cifrado es demasiado débil para proteger un documento, pero tiene algunos usos divertidos.

    Ejemplo: supongamos que has aplicado ROT13 solo a la segunda línea de un texto, la 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 con aplicar ROT13 otra vez (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 has encontrado algún mensaje ofuscado por internet, seguramente tr sea mejor alternativa que Vim, porque no hace falta abrir el archivo: basta con redirigir stdin a tr a-zA-Z n-za-mN-ZA-M.

    Como ejemplo te dejo probar este comando, un homenaje a Bruce Schneier, creador de Blowfish y uno de los criptógrafos más importantes de la actualidad. Sacado 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 en el 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.

    A partir de ahora tendrás que dar la contraseña cada vez que edites el archivo.

    Si escribes una contraseña incorrecta 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 te pedirá la contraseña dos veces y cifrará el archivo con la clave escrita.

Cambiar la contraseña

Para cambiar la contraseña basta con usar el parámetro +X en el terminal, escribir la contraseña antigua y luego la nueva las dos veces que Vim la pida.

julio@acer ~> vim +X segredo.txt

Quitar la contraseña

Para quitar la contraseña basta con abrir el archivo con vim y borrar la opción key.

:set key=

Cambiar el algoritmo de cifrado

Vim tiene dos algoritmos de clave simétrica:

  • pkzip

    No lo uses: es un algoritmo débil y fácil de romper.

    :setlocal cryptmethod=zip
    
  • Blowfish

    Algoritmo fuerte. Recomendado.

    :setlocal cm=blowfish
    

Ten en cuenta que cm es solo una abreviatura de cryptmethod.

Gnu Privacy Guard (GPG)

Una pega de Vim es que solo permite usar dos algoritmos (Pkzip y Blowfish), relativamente débiles en algunas situaciones y ambos únicamente de clave simétrica; es decir, la remitente (Alice) tiene que compartir la clave de antemano con el destinatario (Bob).

Si Alice no tiene ningún canal seguro con Bob, ¿cómo le pasa la contraseña del archivo cifrado de forma segura? Para eso existen los algoritmos asimétricos: Alice puede sencillamente enviar la contraseña cifrada con la clave pública de Bob.

GPG es ideal para casos así, porque tiene 3 algoritmos asimétricos y varios simétricos, entre ellos Blowfish y otros aún más fuertes. Además de algoritmos de cifrado, GPG también trae algunos de hash y de compresión.

La lista de algoritmos disponibles se obtiene con este 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

Genera tu par de claves privada y pública

Hace falta un par de claves para cifrar, descifrar, firmar y verificar.

La gente usará tu clave pública para cifrar los mensajes que te envíe y tú usarás tu clave privada correspondiente para descifrarlos. Por eso la clave pública se puede distribuir libremente, pero la privada debe mantenerse en secreto en un lugar seguro.

  1. Genera tu clave privada

    julio@acer ~> gpg --gen-key
    

    RSA 2048 debería bastar (puedes llegar a 4096), siempre que uses una passphrase segura y no contraseñas vulnerables a ataques de diccionario o a fuerza bruta simple.

    Es decir, nada de contraseñas cortas, numéricas, el nombre de tu chihuahua ni palabras comunes.

    La passphrase _EstaEs1WebMuyChula!_ es mucho mejor que _banana1_, y tan fuerte como _$%Sh4x0rq56lohap[3é-!_, pero bastante más fácil de recordar.

    Viñeta obligatoria en este tipo de entradas: https://xkcd.com/936/

  2. Genera una versión ASCII de tu 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 tendrán que importar tu public key con gpg --import y tú tendrás que hacer lo mismo para responder:

julio@acer ~> gpg --import < alice.asc

Una forma de comprobar la autenticidad de la clave pública de Alice es comparar la huella que ella te dé con la salida de gpg --fingerprint.

Importar una clave privada

Importar claves privadas puede servir en 3 casos:

  1. Usas más de un ordenador y quieres poder descifrar mensajes en todos ellos
  2. Has formateado el disco y quieres importar la clave privada de la que hiciste copia
  3. Formas parte de un grupo de personas que comparte una misma clave

En todos estos casos el comando es:

julio@acer ~> gpg --allow-secret-key-import --import private_key.asc

Cifra 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 correo usa el segundo (con --armor); si no, es preferible el primero, porque genera un archivo más pequeño:

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. Con el algoritmo por defecto AES128 (antes era CAST-128)

    julio@acer ~> gpg --symmetric lol.tt
    
  2. Con AES-256 (Rijndael)

    AES-256 es uno de los algoritmos más fuertes; lo usa actualmente el gobierno estadounidense para cifrar archivos Top Secret

    julio@acer ~> gpg --cipher-algo AES256 --symmetric segredo.txt
    

Criptografía híbrida

Descifra un archivo

julio@acer ~> gpg --output archivo_descifrado.txt --decrypt segredo.txt.gpg

Escribe tu contraseña cuando te la pida y el archivo secreto se descifrará y se guardará como archivo_descifrado.txt.

Interfaz gráfica

Seahorse

Seahorse es un programa que facilita gestionar tus claves. También sirve para crear claves PGP y de Secure Shell y para guardar contraseñas.

Se instala con este comando:

julio@acer ~> sudo pacman -S seahorse

Kgpg

Kgpg es una interfaz gráfica sobre GPG.

Instala el plugin gnupg para Vim

Para instalarlo basta con copiar el plugin a ~/.vim/plugin o, si usas Vundle para gestionar tus plugins, añadir Bundle 'git://gitorious.org/vim-gnupg/vim-gnupg.git' al .vimrc y ejecutar :BundleInstall!

Ahora puedes abrir archivos .gpg sin tener que escribir gpg --decrypt: Vim te pedirá la 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 archivo es secreto!

Mcrypt

  1. Instala Mcrypt

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

Fíjate en que, aunque los algoritmos son los mismos, hay diferencias entre las implementaciones, de modo que un archivo cifrado con OpenSSL no se podrá descifrar con GPG, por ejemplo.

Romper contraseñas

Hay algunos programas para averiguar la contraseña de un archivo mediante ataques de diccionario o fuerza bruta.

Puedo recomendar John the Ripper y Ophcrack.

Ya he olvidado (más de una vez) la contraseña de archivos cifrados, pero por suerte sabía más o menos qué patrón seguían y pude crear diccionarios para intentar romperlas.

Uno de esos casos fue una imagen de disco sparsebundle de macOS.

Primero tuve que extraer el hash de forma que John the Ripper pudiera atacarlo:

$ dmg2john segredo.sparseimage > segredo.txt

Después había que crear un diccionario. Yo sabía que:

  • Si la contraseña empieza por un número, es 5, 7, 123 o 321
  • Palavra1, Palavra2 o Palavra3 aparecen en la contraseña
  • El final es siempre -A, -B o -C

Una forma sencilla de crear un diccionario con todas las contraseñas posibles que cumplen esos criterios es usar Perl:

perl -lwe "print for glob '{5,7,123,321,}{Palavra1,Palavra2,Palavra3}-{A,B,C}'" > wordlist.txt

Luego basta con dejar que JTR haga el ataque de diccionario:

john --fork=4 --wordlist=wordlist.txt segredo.txt

Y comprobar si ha conseguido averiguar la contraseña:

$ john --show segredo.txt
  segredo.sparseimage:123Palavra2-C::::segredo.sparseimage

  1 password hash cracked, 0 left

VeraCrypt

(Fragmento añadido el 26 de enero de 2019)

VeraCrypt es un fork del descontinuado TrueCrypt y es mi herramienta favorita para cifrar discos que necesito abrir 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.

Puedes elegir entre AES, Serpent, Twofish, Camellia, Kuznyechik o una combinación de esos algoritmos. También cuenta con varias funciones hash como SHA-256, SHA-512, Streebog y Whirlpool.

Otra función interesante de VeraCrypt son los hidden volumes, es decir, volúmenes ocultos al final de otros volúmenes.
Todo volumen tiene espacio para dos cabeceras. Si la contraseña introducida es la de la primera, se descifra el volumen externo; si es la de la segunda, se descifra el volumen oculto.
Eso permite la llamada negación plausible, porque es imposible demostrar que existe un volumen oculto.

Crear un volumen nuevo es bastante intuitivo.
Mi recomendación es usar NTFS si el disco se va a usar en Windows, porque NTFS es el único sistema de archivos admitido que tiene 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 desmontarlo:

$ /Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --dismount /dev/disk3s5

Julio Batista Silva
Autores
Senior Cloud Developer

Soy un ingeniero informático brasileño radicado en Alemania, apasionado por la tecnología, la ciencia, la fotografía y los idiomas.

Llevo programando cerca de dos décadas, explorando desde apps móviles y desarrollo web hasta aprendizaje automático. Hoy me enfoco en SRE en la nube e ingeniería de datos.

Soy voluntario en las comunidades de open source y Python, ayudando a organizar PyCon DE y PyData Berlin, dando mentorías y contribuyendo con código y traducciones.

En mi blog comparto consejos de Linux, guías de configuración y notas personales que escribí como referencia futura. Espero que también sean útiles para otras personas. El contenido está disponible en varios idiomas.

Visita mi galería para ver algunas de mis fotografías.

Fuera del teclado, me encontrarás en conciertos, tocando el clarinete, en bicicleta, buceando o explorando nuevos lugares, culturas y cocinas.

¡Siempre feliz de conectar! 🙂

comments powered by Disqus