INTRODUCCIÓN A LA CRIPTOGRAFÍA
La palabra criptografía es un término genérico que describe todas las técnicas que permiten cifrar mensajes o
hacerlos ininteligibles sin recurrir a una acción específica. El verbo asociado es cifrar.
La criptografía se basa en la aritmética: En el caso de un texto, consiste en transformar las letras que conforman el
mensaje en una serie de números (en forma de bits ya que los equipos informáticos usan el sistema binario) y luego
realizar cálculos con estos números para:
Modificarlos y hacerlos incomprensibles. El resultado de esta modificación (el mensaje cifrado) se llama
texto cifrado, en contraste con el mensaje inicial, llamado texto plano.
Asegurarse de que el receptor pueda descifrarlos. El hecho de codificar un mensaje para que sea secreto se
llama cifrado. El método inverso, que consiste en recuperar el mensaje original, se llama descifrado.
En la jerga de la criptografía, la información original que debe protegerse se denomina texto plano. El cifrado es el
proceso de convertir el texto plano en un texto ilegible, denominado texto cifrado o criptograma. Por lo general, la
aplicación concreta del algoritmo de cifrado se basa en la existencia de una clave: información secreta que adapta el
algoritmo de cifrado para cada uso distinto.
Las dos técnicas más sencillas de cifrado, en la criptografía clásica, son la sustitución (que supone el cambio de
significado de los elementos básicos del mensaje (las letras, los dígitos o los símbolos) y la transposición (que
supone una reordenación de los mismos); la gran mayoría de las cifras clásicas son combinaciones de estas dos
operaciones básicas.
El descifrado es el proceso inverso que recupera el texto plano a partir del criptograma y la clave. El protocolo
criptográfico especifica los detalles de cómo se utilizan los algoritmos y las claves. El conjunto de protocolos,
algoritmos de cifrado, procesos de gestión de claves y actuaciones de los usuarios, es lo que constituyen en
conjunto un criptosistema, que es con lo que el usuario final trabaja e interactúa.
Criptografía moderna
Shannon
La era de la criptografía moderna comienza realmente con Claude Shannon, que podría decirse que es el padre de la
criptografía matemática. En 1949 publicó varios trabajos que establecieron una sólida base teórica para la
criptografía y el criptoanálisis. Y, a la vez, la criptografía desapareció de la escena para quedarse dentro de las
organizaciones gubernamentales secretas como la NSA. Muy pocos trabajos se hicieron públicos hasta mediados de
los 70, cuando todo cambió.
Claude Shannon (1916-2001)
Un estándar de cifrado
A mediados de los 70 se vivieron dos importantes avances públicos (es decir, no secretos). El primero fue la
publicación del borrador del Data Encryption Standard (DES) en el Registro Federal estadounidense el 17 de marzo
de 1975. La propuesta fue enviada por IBM, por invitación de la Oficina Nacional de Estándares (ahora NIST), en
un esfuerzo por desarrollar sistemas de comunicación electrónica segura para las empresas como los bancos y otras
organizaciones financieras grandes. El DES fue el primer cifrado accesible públicamente que fue avalado por una
agencia nacional como la NSA. La publicación de sus especificaciones por la NBS estimuló una explosión del
interés público y académico por la criptografía.
DES fue suplantado oficialmente por el Advanced Encryption Standard (AES) en 2001. Tras una competición
abierta, el NIST seleccionó el Rijndael, enviado por dos criptógrafos belgas, para convertirse en el AES. El DES, y
otras variantes más seguras (como el Triple DES), todavía se utilizan hoy en día, y se han incorporado en muchos
estándares nacionales y de organizaciones. Sin embargo, se ha demostrado que el tamaño de su clave, 56 bits, es
insuficiente ante ataques de fuerza bruta
Diffie-Hellman
El segundo desarrollo, en 1976, fue quizás más importante todavía, ya que cambió de manera fundamental la forma
en la que los criptosistemas pueden funcionar. Fue la publicación del artículo New Directions in Cryptography, de
Whitfield Diffie y Martin Hellman. Introdujo un método radicalmente nuevo para distribuir las claves
criptográficas, dando un gran paso adelante para resolver uno de los problemas fundamentales de la criptografía, la
distribución de claves, y ha terminado llamándose intercambio de claves Diffie-Hellman. El artículo también
estimuló el desarrollo público casi inmediato de un nuevo tipo de algoritmo de cifrado, los algoritmos de cifrado
asimétrico.
Principios de Kerckhoffs
Auguste Kerckhoffs publicó en 1883 seis principios relativos a las propiedades deseables de un sistema
criptográfico, los cuales son:
1. Si el sistema no es teóricamente irrompible, al menos debe serlo en la práctica.
2. La efectividad del sistema no debe depender de que su diseño permanezca en secreto.
3. La clave debe ser fácilmente memorizable de manera que no haya que recurrir a notas escritas.
4. Los criptogramas deberán dar resultados alfanuméricos.
5. El sistema debe ser operable por una única persona.
6. El sistema debe ser fácil de utilizar.
De estos seis, el segundo suele ser conocido como “Principio de Kerckhoff”.
ALGORITMOS DE HASH
Se refiere a una función o método para generar claves que representen de manera casi unívoca a un documento,
registro, archivo, etc. Un hash es el resultado de dicha función o algoritmo.
Estos algoritmos son unidireccionales, lo que quiere decir que es posible obtener, en base a un dato, su hash
resultante pero, en base a este hash, es imposible obtener el dato original. Esto los diferencia con respecto a los
algoritmos de cifrado, debido a que, lo que vemos en el hash, no es el contenido cifrado, sino el resultado de
cálculos matemáticos, que no representan a la información original, sino a una “firma” que identifica a la misma.
Un hash es, básicamente, como una huella dactilar. Nos permite identificar algo, pero no nos permite reconstruir la
información completa (en base a una huella dactilar, no podemos conocer los detalles de una persona, como su
color de pelo, ojos, altura, etc.).
Una propiedad fundamental del hashing es que si dos resultados de una misma función son diferentes, entonces las
dos entradas que generaron dichos resultados también lo son.
Es posible que existan claves resultantes iguales para objetos diferentes, ya que el rango de posibles claves es
mucho menor que el de posibles objetos a resumir (las claves suelen tener en torno al centenar de bits, pero los
ficheros no tienen un tamaño límite). A estos casos se los llama “colisiones”. Una buena función de hash debe
experimentar pocas colisiones.
Algunos de los algoritmos de Hash más utilizados son LM, NTLM, MD5 y SHA.
Abajo podemos ver los resultados de varias funciones de hash aplicadas a la palabra “cripto”:
MD5: ebea37120a7c6f155e0c50f9c92ce351
SHA1: 7dd5de71de03fc27ea218d0d0bd479c713a39fec
Almacenamiento de Contraseñas
En los sistemas informáticos, el almacenamiento seguro de la base de datos de usuarios y contraseñas suele ser un
gran desafío.
Imaginemos que debemos contar con una pequeña tabla, que tenga solamente dos campos: “usuario” y
“contraseña”, así:
UsuarioContraseña
Admin ADM123inistrador
Fabian pepe2020
Manuel emedemama
Esta base de datos debería estar almacenada en algún lugar lógico (un archivo de texto plano, una base de datos
relacional, etc).
En primer lugar, si almacenamos las contraseñas en texto claro, debemos saber que, si alguna persona pudiera leer
esta información, sería el poseedor de todas las credenciales de acceso al sistema. Es importante tener en cuenta
que leer los contenidos de un archivo suele ser una tarea relativamente sencilla y que, de una forma u otra, por lo
menos, un usuario va a tener que poder leerlos (el que sea el encargado del proceso de autenticación).
Por otro lado, los usuarios administradores del sistema van a poder (en la mayoría de los casos) leer todos los
archivos del mismo, por lo que conocerían absolutamente todas las claves de acceso. Esto les permitiría hacerse
pasar por cualquier usuario, sin que estos lo noten.
Una buena manera de evitar todos estos problemas, es utilizar funciones de hash, para almacenar los hashes
resultantes de las contraseñas, en lugar de las contraseñas mismas.
Podríamos formular una nueva tabla, que almacene los hashes, de la siguiente forma:
Usuario Contraseña
Admin 52e71b10074c9bfae5dee9652c86217d
Fabian cb13af1d5b72b5466608ee61e67a030a
Juan d052a70b81c33146b5b456f88bcb37c2
Manuel 65ce8c51bbd6e35527092146d9fbc7ca
(la tabla está almacenando los hashes producidos por el algoritmo MD5)
Podemos observar que, ahora, el hecho de poder leer la base de datos no nos permite conocer las contraseñas de
acceso.
También podemos notar que, si bien las contraseñas originales tenían diferentes longitudes, los hashes resultantes
poseen todos una longitud de 32 caracteres (que es lo que produce el algoritmo MD5).
Ataques Sobre Algoritmos de Hash
Una función de hash convierte una cadena de longitud variable en una cadena de longitud fija única e irreversible.
Si bien esta es una aseveración que podría darle un carácter de invulnerabilidad a las funciones hash no es así. Las
funciones de hash también tienen debilidades y son susceptibles a cierto ataques, a continuación los enseñaremos:
Fuerza bruta
Teniendo el hash de una contraseña una forma de obtener dicho password sería probar con todas las combinaciones
posibles, hasta dar con la correcta. A este método se le conoce como “fuerza bruta” porque se utiliza la fuerza en
lugar de la lógica.
La gran desventaja de este método, es el tiempo que lleva probar con absolutamente todas las contraseñas posibles.
Actualmente, la mayoría de los sistemas requieren, por lo menos, contraseñas de 8 caracteres.
Es de suma importancia el juego de caracteres que estemos utilizando para componer la contraseña, por ejemplo, si
utilizamos solamente letras minúsculas y números, tendremos un juego de 36 caracteres (26 letras + 10 números).
Si asumimos que la contraseña posee exactamente 8 caracteres, podemos obtener la cantidad de contraseñas
posibles realizando el siguiente cálculo:
36^8 = 2821109907456
Este cálculo (36 elevado a la 8va potencia), puede ser modificado para representar la cantidad de contraseñas,
reemplazando el primer valor (en este caso, 36) por la cantidad de caracteres disponibles y el segundo (en este caso,
8) por la cantidad de caracteres de la contraseña).
Por ejemplo, si fueran contraseñas de 10 caracteres, que pueden contener mayúsculas, minúsculas y números (62
caracteres diferentes):
62^10 = 839299365868340224
Como podemos observar, son muchísimos millones de posibles contraseñas. Esto hace que la fuerza bruta sea un
método muy poco efectivo, si la contraseña está compuesta por una buena cantidad de caracteres diferentes y posee
una buena longitud.
En la imagen podemos ver una representación del proceso de ataque por fuerza bruta.
Ataques de Diccionario
Este tipo de ataque es similar al de fuerza bruta pero, en lugar de tratar con todas las contraseñas posibles, se
buscan palabras dentro de un diccionario. Es un ataque mucho más rápido (porque se prueban muchísimas menos
combinaciones) aunque, si la contraseña es compleja, tiene muy pocas probabilidades de éxito.
Rainbow Tables
Las tablas Rainbow son tablas de consulta que ofrecen un compromiso entre tiempo y espacio para obtener claves
en texto simple a partir del resultado de una función de hash.
A continuación se explica mediante un ejemplo el funcionamiento de las Tablas Rainbow. El ejemplo consiste en
averiguar cuál es la contraseña que produce el hash re3xes
1. Lo primero consiste en aplicar la reducción (aplicar una función hash pero en sentido contrario) que se
utilizó por última vez en la tabla y comprobar si la contraseña obtenida aparece en la última columna de la
tabla (paso 1).
2. Si no resulta (en nuestro caso, rambo no aparece en la tabla) se vuelve a repetir el proceso, pero en este caso
con las dos últimas reducciones (paso 2).
3. Si en este proceso se falla de nuevo, se volvería a repetir el proceso pero aplicando 3 reducciones, después 4
reducciones y así hasta que se encontrase la contraseña. En el caso de no ser así, el ataque habrá fracasado.
4. Si el proceso ha sido positivo (paso 3, en este caso linux23 aparece en la tabla al final de la cadena), la
contraseña se recupera en el principio de la cadena que produce linux23. Aquí nos encontramos con passwd
al principio de la cadena almacenada en la tabla.
5. En este punto (paso 4) se genera una cadena y en cada iteración se compara el hash con el que queremos
obtener. En este caso nos encontramos con el hash re3xes en la cadena. Por tanto la contraseña actual
(cultura) genera este hash que es la que se busca.
Es importante saber que las tablas rainbow son creadas a partir de una función de hash específica, por ejemplo, para
romper los hashes de MD5 necesitaremos unas tablas rainbow basadas en hashes de MD5 y para SHA, tablas
rainbow SHA.
Esta técnica fue desarrollada por Philippe Oechslin como un método basado en el compromiso espacio-tiempo o
tiempo-memoria.
Los programas que utilizan las tablas rainbow siempre han de utilizarse como auditoría de tus contraseñas en lo que
se llama hacking ético.
Un ejemplo de herramienta que utiliza estas tablas es el programa Ophcrack, el cual permite crackear las
contraseñas de Windows. Para evitar que aplicaciones como esta no rompan contraseñas tan fácilmente, es
aconsejable utilizar Salts.
Salts
Se denomina salt (o 'sal', en español) a un fragmento aleatorio (caracteres, números...) que se le añade a un hash
dado para conseguir que si dos usuarios generan una misma contraseña, su hash no sea idéntico. Los datos con sal
complican los ataques de diccionario que cifran cada una de las entradas del mismo: cada bit de sal duplica la
cantidad de almacenamiento y computación requeridas. Las sales también ayudan contra las tablas rainbow ya que
extienden la longitud y con ello la complejidad de la contraseña.
Para mayor seguridad, el valor de sal se guarda en secreto, separado de la base de datos de contraseñas. Esto aporta
una gran ventaja cuando la base de datos es robada, pero la sal no. Para determinar una contraseña a partir de un
hash robado, el atacante no puede simplemente probar contraseñas comunes (como palabras del idioma inglés o
nombres), sino calcular los hashes de caracteres aleatorios (al menos la porción de la entrada que se sabe es la sal),
lo que es mucho más lento.
Por ejemplo, supongamos que la clave secreta (cifrada) de un usuario es robada, y se sabe que usa una de 200.000
palabras inglesas como contraseña. El sistema usa una sal de 32 bits. La clave salada es ahora la contraseña original
unida a una sal aleatoria de 32 bits. A causa de esto, los hashes precalculados del atacante carecen de valor. Deberá
calcular el hash de cada palabra junto con cada una de las 2 a la 32 (4,294,967,296) posibles combinaciones de
sales hasta que se encuentre una coincidencia. El número total de posibles entradas se puede obtener multiplicando
el número de palabras en el diccionario por el número de posibles sales:
2 a la 32 x 200000 = 8.58993459 x 10 a la 14
Para completar un ataque por fuerza bruta, el atacante deberá ahora computar cerca de 860 billones de hashes, en
lugar de sólo 200.000. Incluso cuando la contraseña en sí misma sea simple, la sal secreta hace que romper la
contraseña sea radicalmente más difícil.
CRIPTOGRAFÍA SIMÉTRICA
La criptografía simétrica es un método criptográfico en el cual se usa una misma clave para cifrar y descifrar
mensajes. Las dos partes que se comunican han de ponerse de acuerdo de antemano sobre la clave a usar. Una vez
ambas tienen acceso a esta clave, el remitente cifra un mensaje usándola, lo envía al destinatario, y éste lo descifra
con la misma.
Un buen sistema de cifrado pone toda la seguridad en la clave y ninguna en el algoritmo. En otras palabras, no
debería ser de ninguna ayuda para un atacante conocer el algoritmo que se está usando. Sólo si el atacante obtuviera
la clave, le serviría conocer el algoritmo. Los algoritmos de cifrado ampliamente utilizados tienen estas
propiedades. (El principio de Kerckhoff, comentado anteriormente)
Dado que toda la seguridad está en la clave, es importante que sea muy difícil adivinar el tipo de clave. Esto quiere
decir que el abanico de claves posibles, o sea, el espacio de posibilidades de claves, debe ser amplio.
Actualmente, las computadoras pueden descifrar claves con extrema rapidez, y ésta es la razón por la cual el
tamaño de la clave es importante en los criptosistemas modernos. El algoritmo de cifrado DES usa una clave de 56
bits, lo que significa que hay 2 elevado a 56 claves posibles (72.057.594.037.927.936 claves).
Esto representa un número muy alto de claves, pero un ordenador genérico puede comprobar el conjunto posible de
claves en cuestión de días. Una máquina especializada puede hacerlo en horas. Algoritmos de cifrado de diseño
más reciente como 3DES, Blowfish e IDEA usan claves de 128 bits, lo que significa que existen 2 elevado a 128
claves posibles. Esto equivale a muchísimas más claves, y aun en el caso de que todas las máquinas del planeta
estuvieran cooperando, tardarían más tiempo en encontrar la clave que la edad del universo.
Algoritmos Populares
Algunos de los algoritmos más populares de criptografía asimétrica son:
DES (Data Encryption Standard)
3DES (Triple-DES)
Blowfish
IDEA (International Data Encryption Algorithm)
RC4, RC5, y RC6
AES (Advanced Encryption Standard)
Inconvenientes
El principal problema con los sistemas de cifrado simétrico no está ligado a su seguridad, sino al intercambio de
claves. Una vez que el remitente y el destinatario hayan intercambiado las claves pueden usarlas para comunicarse
con seguridad, pero ¿qué canal de comunicación que sea seguro han usado para transmitirse las claves? Sería
mucho más fácil para un atacante intentar interceptar una clave que probar las posibles combinaciones del espacio
de claves.
Otro problema es el número de claves que se necesitan. Si tenemos un número n de personas que necesitan
comunicarse entre sí, se necesitan n/2 claves para cada pareja de personas que tengan que comunicarse de modo
privado. Esto puede funcionar con un grupo reducido de personas, pero sería imposible llevarlo a cabo con grupos
más grandes.
CIFRADO AL VUELO (OTFE)
On The Fly Encryption, es un método utilizado por algunas herramientas para, por ejemplo, cifrar el contenido de
unidades de almacenamiento. “Al vuelo” se refiere al hecho de que los datos son accesibles de forma inmediata,
luego de haber ingresado la correspondiente clave de descifrado. Habitualmente, el volúmen es montado como un
disco físico, haciendo que los archivos sean accesibles de forma transparente, como si no estuvieran cifrados.
Para que esto sea transparente para el usuario, habitualmente se utilizan controladores de disco, que hacen ver a la
unidad cifrada como una unidad más del sistema operativo, lo que permite copiar, borrar y editar estos datos de la
misma forma en la que se lo hace con datos no cifrados. El proceso de cifrado y descifrado ocurre de forma
totalmente transparente para el usuario.
La principal ventaja de esta técnica es que no es necesario cifrar y descifrar los archivos a mano y que, al apagar el
dispositivo utilizado (o desmontar el volumen cifrado) los datos se encuentran cifrados, por lo que no es posible
recuperar la información si no se cuenta con la clave correspondiente. Esto es de muchísima utilidad, por ejemplo,
en los dispositivos portátiles, como notebooks, que son robadas habitualmente.
VeraCrypt
VeraCrypt (https://veracrypt.codeplex.com/) es una herramienta que implementa el concepto de OTFE. Es software
de código abierto, y funciona tanto en Windows, como en GNU/Linux y Mac, por lo que es ideal para los entornos
heterogéneos.
A continuación, podemos ver imágenes de su interfaz y de los pasos para crear y montar volúmenes cifrados.
Creación del Volumen Cifrado
Utilización del Volumen Cifrado
BitLocker
BitLocker es la solución de OTFE desarrollada por Microsoft, y está disponible a partir de Windows Vista, para las
versiones Ultimate y Enterprise.
Cifrado de Unidades de Disco
Autor: Fabian Martinez Portantier
Colaboradores: Franco Vergara
Fuentes:
http://nlopezci.blogspot.com.ar