Ir al contenido principal

Criptografía (CCLXXI): El algoritmo 'Hill Climbing'

Tal y como nos cuenta wikipedia el algoritmo 'Hill Climbing', también llamado algoritmo de "ascenso de la colina" es un algoritmo iterativo que comienza con una solución arbitraria a un problema, un punto actual en un espacio de búsqueda, para luego intentar encontrar una mejor solución, un nuevo punto mejor en el espacio de búsqueda, variando incrementalmente un único elemento de la solución. Si el cambio produce una mejor solución, otro cambio incremental se realizará a la nueva solución, repitiendo este proceso hasta que no se puedan encontrar mejoras o se hayan alcanzado un número predefinido de iteraciones.

¿Podemos aplicar un algoritmo de este tipo para el criptoanálisis automatizado de criptogramas?

Pensemos en un cifrado de sustitución simple monoalfabética, en el que cada carácter del texto en claro o texto plano se sustituye siempre por un mismo carácter en el texto cifrado o criptograma.

En este tipo de cifrados, cuando el alfabeto de sustitución es aleatorio, tal y como dije en un post anterior, no es nada aconsejable realizar un ataque de fuerza bruta, ya que en el caso del alfabeto español con letras mayúsculas (27 caracteres) el tamaño del espacio de claves o alfabetos de sustitución posibles es de 27!, es decir, más de diez mil cuatrilllones, pero sí es posible realizar otro tipo de ataques.

Pues bien, sin conocer nada más que el criptograma, es decir, sin disponer de información adicional, como parte del texto claro ('cribs') o de otra clase, que podría posibilitar otro tipo de ataques, me propongo implementar un algoritmo de este tipo mediante la calificación o puntuación basada en las estadísticas de tetragramas de la aptitud ('fitness') de los textos que se vayan descifrando con las sucesivas claves a probar. Todo ello, con objeto de obtener la clave correcta empleada en el cifrado.

La calificación de la aptitud de un texto consiste en determinar si éste se asemeja más o menos a un texto escrito en el idioma al que queremos comprobar si corresponde o no. Un texto que obtenga una calificación o puntuación alta tendrá una buena aptitud (buen 'fitness'), lo que significará que se asemeja mucho a un texto escrito en el idioma para el que queremos calificar ese texto, mientras que si la puntuación es baja (mal 'fitness') significará que no se parece (ver esta entrada donde puse un script en python para calificar la aptitud de un texto).

La idea para implementar este algoritmo es la siguiente:

1.- Se genera la clave a probar en el descifrado del criptograma, se califica la aptitud ('fitness') del texto descifrado que se obtiene y se almacena esa puntuación.
2.- Se cambia una letra de la clave y se vuelve a calificar la aptitud ('fitness') del texto descifrado que se obtiene con la nueva clave.
3.- Si la puntuación obtenida con la nueva clave es mayor que la puntuación almacenada, entonces se sustituye la clave con la nueva clave y la puntuación almacenada con la nueva puntuación.
4. Si no se obtiene una mejor puntuación tras un número de iteraciones prestablecido el algoritmo finaliza, en caso contrario se vuelve al punto 2.

A medida que el algoritmo va realizando iteraciones, el texto que se va obtenido con las nuevas claves va obtenido una aptitud ('fitness') mayor y la clave se va ajustando a la clave empleada en el cifrado, aunque puede que no se encuentre la verdadera solución, ya que este algoritmo sólo garantiza encontrar un óptimo local, no el óptimo global (la verdadera solución), es decir, la solución que se va a alcanzar depende del punto de partida (la clave inicial) en el espacio de búsqueda y posteriores iteraciones, con lo que podría ser necesario reiniciar el algoritmo.

Lo dicho, en posteriores post desarrollaré este algoritmo para atacar cifrados de sustitución simple monoalfabética y pondré un script en python para ello.

No obstante lo dicho, el algoritmo 'Hill Climbing' puede ser utilizado para atacar otros tipos de cifrados clásicos, para lo que pondré otras entradas con el desarrollo y las implementaciones correspondientes, e incluso tiene aplicación en multitud de otras materias, entre otras en inteligencia artificial.

Quizás también te interese:

Comentarios

Entradas populares de este blog

Criptografía (I): cifrado Vigenère y criptoanálisis Kasiski

Hace unos días mi amigo Iñaki Regidor ( @Inaki_Regidor ), a quien dedico esta entrada :), compartió en las redes sociales un post titulado "Criptografía: el arte de esconder mensajes"  publicado en uno de los blogs de EiTB . En ese post se explican ciertos métodos clásicos para cifrar mensajes , entre ellos el cifrado de Vigenère , y , al final del mismo, se propone un reto consistente en descifrar un mensaje , lo que me ha animado a escribir este post sobre el método Kasiski  para atacar un cifrado polialfabético ( conociendo la clave descifrar el mensaje es muy fácil, pero lo que contaré en este post es la forma de hacerlo sin saberla ). El mensaje a descifrar es el siguiente: LNUDVMUYRMUDVLLPXAFZUEFAIOVWVMUOVMUEVMUEZCUDVSYWCIVCFGUCUNYCGALLGRCYTIJTRNNPJQOPJEMZITYLIAYYKRYEFDUDCAMAVRMZEAMBLEXPJCCQIEHPJTYXVNMLAEZTIMUOFRUFC Como ya he dicho el método de Vigenère es un sistema de sustitución polialfabético , lo que significa que, al contrario que en un sistema de

Criptografía (XXIII): cifrado de Hill (I)

En este post me propongo explicar de forma comprensible lo que he entendido sobre el cifrado de Hill , propuesto por el matemático Lester S. Hill , en 1929, y que se basa en emplear una matriz como clave  para cifrar un texto en claro y su inversa para descifrar el criptograma correspondiente . Hay tres cosas que me gustan de la criptografía clásica, además de que considero que ésta es muy didáctica a la hora de comprender los sistemas criptográficos modernos: la primera de ellas es que me "obliga" a repasar conceptos de matemáticas aprendidos hace mucho tiempo y, desgraciadamente, olvidados también hace demasiado tiempo, y, por consiguiente, que, como dice  Dani , amigo y coautor de este blog, me "obliga" a hacer "gimnasia mental"; la segunda es que, en la mayoría de las ocasiones, pueden cifrarse y descifrase los mensajes, e incluso realizarse el criptoanálisis de los criptogramas, sin más que un simple lápiz y papel, es decir, para mi es como un pasat

¿Qué significa el emblema de la profesión informática? (I)

Todas o muchas profesiones tienen un emblema que las representa simbólicamente y en el caso de la  informática: " es el establecido en la resolución de 11 de noviembre de 1977  para las titulaciones universitarias superiores de informática, y  está constituido por una figura representando en su parte central  un  núcleo toroidal de ferrita , atravesado por  hilos de lectura,  escritura e inhibición . El núcleo está rodeado por  dos ramas : una  de  laurel , como símbolo de recompensa, y la otra, de  olivo , como  símbolo de sabiduría. La  corona  será la  de la casa real  española,  y bajo el escudo se inscribirá el acrónimo de la organización. ". Veamos los diferentes elementos tomando como ejemplo el emblema del COIIE/EIIEO (Colegio Oficial de Ingenieros en Informática del País Vasco/ Euskadiko Informatikako Ingeniarien Elkargo Ofiziala ) . Pero no sólo el COIIE/EIIEO adopta el emblema establecido en dicha resolución, sino que éste se adopta también como im