Conceptos básicos de criptografía: cifrado simétrico

Hace ya bastante tiempo, por la década de los 1990, la web apenas comenzaba y solía suceder que un programa podía tener una vida feliz sin tener ninguna función de criptografía.

Pero hoy cualquier programa medianamente complejo necesita en algún momento comenzar a utilizar el cifrado para proteger los datos del usuario en su almacenamiento o transmisión en la red, sin embargo es un tópico que sigue siendo confuso para muchos programadores cuando lo enfrentan por primera vez.

Cifrado César

Un algoritmo de cifrado simétrico usa la misma clave para cifrar y descifrar los datos. Uno de los primeros algoritmos conocidos fue el Cifrado César, llamado así porque fue usado por el mismísimo Julio César hace más de dos mil años en comunicaciones militares. Para ello, sustituía cada letra del alfabeto con la letra tres lugares más adelante. Al llegar a la Z, volvía a comenzar por la letra A, igual que las agujas de un reloj, en lo que se llama aritmética modular. Un ejemplo de este cifrado es el siguiente:

Original: Z A P A T O
Cifrado:  C D S D W R
Clave:    3

Aparentemente el Cifrado César tuvo éxito en su momento, ocultando los mensajes de los espías enemigos. Hoy no es más que un juego de niños, aunque increíblemente hay criminales con pocas luces que sigen cayendo por usarlo.

Vigenère

Una mejora al cifrado César fue el cifrado Vigenère, atribuido a Blaise Vigenère pero que realmente fue inventado por Giovan Battista Bellaso en 1553. En vez de sustituir todas las letras por un número fijo, se usa una palabra como clave que indica cuántos lugares se mueve cada letra. Si el mensaje es más largo que la clave, ésta se repite. Por ejemplo utilizando la clave “ABCD” que indica mover cada letra 1, 2, 3 y 4 lugares:

Original: Z A P A T O
Clave:    A B C D A B
          1 2 3 4 1 2
Cifrado:  A C S E U Q

En el ejemplo de cifrado César vimos que la letra D se repetía dos veces, proporcionándonos la información de que se trata de una letra frecuentemente usada en el idioma de mensaje, posiblemente una vocal. Eso sumado a las pocas combinaciones posibles de claves hace trivial su descifrado.

El cifrado Vigenère oculta mucho mejor la información del mensaje original, representó un reto durante siglos y su dificultad aparente le ganó el apodo de le chiffre indéchiffrable. Pero ya para el siglo 19 comenzó a ser roto rutinariamente, y una computadora moderna lo puede romper en milisegundos.

One-time pad

¿Qué pasa si en vez de usar una palabra repetida, usamos letras al azar? Por ejemplo:

Original: Z A P A T O
Clave:    K M W B T P
Cifrado:  K N M C N E

Este pequeño cambio, aunque parezca increíble, ha vuelto nuestro mensaje inviolable. ¿Por qué? Porque si cada letra de la clave es aleatoria, y todas las letras de la clave son aleatorias, el texto cifrado también es completamente aleatorio, independientemente de cual haya sido el mensaje original.

De hecho, podemos probar todas las claves posibles de 6 letras y “descifrar” las palabras ZAPATO, CONEJO, PIEDRA, PELOTA, o cualquier otra combinación posible de 6 letras, y ninguna tiene mayor posibilidad que otra de ser la correcta. Sólo la combinación del texto cifrado y la clave correcta permiten dilucidar el mensaje original.

Más aún, ni siquiera conocer parte del mensaje original permite descifrar las partes faltantes, porque el resto del texto cifrado sigue siendo completamente aleatorio. Si a esto añadimos la posibilidad de paddings o mensajes falsos, entonces se vuelve imposible determinar la longitud exacta del mensaje original o si existe siquiera un mensaje real.

Este tipo de cifrado se llama One-time pad, y fue Claude Shannon el primero en demostrar su seguridad perfecta, invulnerable a las computadoras más poderosas aunque se disponga de tiempo infinito.

La administración de las claves

Entonces, ¿por qué no utilizamos todos el one-time pad? De hecho este sistema fue usado por la KGB durante la guerra fría. Y también fue violado.

Aunque es teóricamente perfecto, el One-time pad tiene severas limitaciones prácticas. Primero necesitas una clave aleatoria. Y golpear teclas “al azar” en tu teclado no es el “aleatorio” que estamos buscando, ya que si lo haces durante mucho tiempo inevitablemente empezarán a aparecer patrones repetidos debido a la forma de tu teclado y tus dedos, memoria muscular, etc. Varios One-time pad fueron descifrados debido a defectos en la fuente de aleatoriedad.

Además, la clave debe ser por lo menos tan larga como el mensaje, así que si cifras un mensaje de 1 GB, necesitas generar una clave de 1 GB que ahora tienes que mantener a salvo para que no caiga en las manos de un adversario o se pierda y con ella tus datos desaparezcan para siempre.

Finalmente, como las claves deben ser aleatorias, nunca se pueden reusar. La KGB proporcionaba a sus espías libros de claves en miniatura, que tenían que leer con una lupa. Como era tan inconveniente llevar cada vez más libros encima para cada mensaje, algunos se vieron tentados a reutilizarlos, y de esta forma sus mensajes pudieron ser descifrados.

Y de esto se desprende una lección muy importante: la administración de las claves es tan importante como el algoritmo en un esquema criptográfico. De nada vale tener el algoritmo más sofisticado si las password se almacenan o se transmiten sin cifrar, o si la password de tus usuarios es “12345” [Youtube], reusan la misma en cada sitio cuestionable, o la anotan en un papelito debajo del teclado (cosa que he visto personalmente). Además, siempre está el viejo método de la llave inglesa para “extraer” información.

AES

De esta forma llegamos a los algoritmos de cifrado modernos. Son algoritmos sofisticados que permiten usar un password en vez de un enorme número aleatorio y proveen de mucha más seguridad que un cifrado simple como el César o el Vigenère. Algunos de los más usados son RC4, 3DES, Twofish, Serpent, Blowfish, y finalmente AES, elegido en 2001 como estándar internacional.

El nivel de seguridad de estos algoritmos es enorme. Si se usó  una buena clave, romper por fuerza bruta un mensaje cifrado con AES llevaría millones de veces más tiempo que la edad actual de universo, lo que se denomina computacionalmente imposible.

Aquí podemos elaborar lo que llamaremos la regla de oro de la criptografía: a menos que seas un experto en criptografía de talla mundial y las redes de Feistel sean un tema de conversación diario con tus amigos, nunca implementes tu propio algoritmo de cifrado. Las agencias de inteligencia emplean a algunos de los matemáticos más brillantes del mundo, con acceso a las supercomputadoras más poderosas y fábricas de circuitos especializados. Romper algoritmos amateur es una de las cosas que los chicos de la NSA hacen para divertirse durante el almuerzo.

Crear un algoritmo de cifrado es un tema fuera del alcance del común de los mortales, e incluso los expertos tienen que enviar sus algoritmos a largos procesos de peer review para que otros expertos los analicen en búsqueda de vulnerabilidades, antes de que pasen a ser de uso general.

Y a menos que sepas realmente lo que estás haciendo, tampoco intentes programar tu propia implementación de un algoritmo conocido. Aunque esté perfecto, podría fallar en implementar contramedidas contra ataques de side-channel, el los que se emplea información como los patrones de uso del CPU o las emisiones electromagnéticas del sistema causadas por el algoritmo y que revelan información del mensaje o de la clave. Es el tipo de cosas para las que la NSA tiene presupuesto ilimitado.

En su lugar, usa siempre implementaciones de algoritmos como AES, que sean ampliamente conocidas, probadas y soportadas, prestando siempre atención al eslabón más débil de la cadena: el usuario.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s