As a special case, this post is available in two languages. Click on the button to translate.
Como caso especial, este post está disponible en dos idiomas. Haz click en el botón para traducir.
Hace unas tres semanas, hablé de "El juego de la vida" de Conway en este post y también propuse un pequeño acertijo en este otro post. Todo aquello me dio la idea de crear un cifrado basado en esta simulación.
Recuerda que en "El juego de la vida", las células (representadas por casillas en una cuadrícula) van modificando su estado de vivas o muertas atendiendo a unas reglas que pueden condensarse en las siguientes líneas:
- Una célula viva que tenga 2 ó 3 vecinos vivos seguirá viva en el siguiente estado. De otro modo, morirá.
- Una célula muerta que tenga exactamente 3 vecinos vivos volverá a la vida en el siguiente estado. De otro modo, seguirá muerta.
Te recomiendo que, antes de proseguir con la lectura, te familiarices un poco con el juego usando la versión interactiva que hice en JavaScript en el primer post mencionado arriba.
¿Cómo podríamos diseñar un cifrado a partir de todo esto? En primer lugar, nuestro mensaje será algo gráfico: podemos dibujar letras, números o formas. Como primera tentativa, podríamos dibujar nuestro mensaje en la cuadrícula, pasar al siguiente estado y mandar el resultado. Por ejemplo, para cifrar una línea vertical de cuatro casillas, mandaríamos su siguiente estado, como en la imagen:
Lo que debería hacer el receptor es encontrar el estado anterior del patrón que recibe. ¿Funciona este método? Por desgracia, no. Considera la siguiente figura, que también se transforma en el mismo rectángulo al aplicar las reglas del juego:
El receptor no tendría modo alguno de determinar cuál esos dos patrones es el que nosotros elegimos al principio. Y, no sólo en esta situación: en general, cualquier patrón que se genere de esta manera tendrá varios estados anteriores posibles. Tendremos que pensar en otra cosa.
Podríamos hacerlo al revés: encontramos un estado anterior a nuestro mensaje (aunque existan varios, elegimos sólo uno de ellos), lo enviamos y es el receptor el que aplica las reglas de "El juego de la vida" para recuperar el mensaje original. El receptor siempre podrá recuperar correctamente el mensaje, ya que las reglas no admiten ningún camino alternativo.
Nos resta, pues, un único problema: ¿cómo, a partir de un patrón, logramos encontrar un estado anterior? Normalmente, a ese estado anterior se le llama "padre" porque genera el que ya tenemos.
Si indagamos un poco sobre "El juego de la vida", enseguida nos encontramos con un muro que parece infranqueable: los llamados "jardines del Edén". Un jardín del Edén es un patrón que no tiene ningún padre, es decir, nadie lo genera. ¿En qué nos afecta la existencia de los jardines del Edén? Simple, si nuestro mensaje resulta que es uno de estos patrones especiales, no podremos encontrar ningún estado anterior para que sea nuestro mensaje cifrado. En este punto, pensé "Bueno... si hay muy poquitos jardines del Edén, quizás nunca nos veamos en esta situación..." Pero la mala noticia es que cuanto más grande sea el patrón, más probable es que se trate de un jardín del Edén, es decir, hay muchísimos. ¡En menudo jardín nos hemos metido!
La conclusión es evidente: no podremos cifrar cualquier cosa, tan solo algunos patrones. Tendremos que ser muy cuidadosos...
Más o menos en este punto me encontraba, intentando encontrar padres a dibujos sencillos como las letras y los números, cuando, por una absoluta y brillante casualidad, encontré este curioso post en la página de Matthew Scroggs (link AQUÍ a la página principal). Es el creador de las cruzadas de Chalkdust Magazine, que ya sabes que tanto me gustan y de las que ya he hablado en alguna ocasión. En su post, proporciona patrones padres para versiones pequeñas de las letras del alfabeto. Por ejemplo, observa esta figura:
Al aplicar las reglas del juego, se genera:
Es decir, la letra K. Hemos encontrado una manera de cifrar letras: escribimos los padres de cada una de las que queramos cifrar, dejando espacio entre cada figura para que no se afecten unas a otras, y mandamos el patrón. Por ejemplo, para cifrar LOGICA, que se traduce en el siguiente dibujo,
enviaríamos el siguiente patrón, que es uno de sus padres:
Por supuesto, ésta no es la única manera, podríamos utilizar otros modelos de letras que nos gustasen más, más grandes, más estilizadas, añadir la Ñ, incluso,... Lo único que tendríamos que hacer, como ya sabes, es encontrar un padre apropiado. Por ejemplo, para conseguir este otro modelo de G:
lo único que tenemos que dibujar es este patrón que, curiosamente, también es otra G:
Otro ejemplo que he construido, este patrón:
genera el número 170:
Puedes ser tan creativo como quieras y dibujar tus propios diseños o usar los que Matthew Scroggs propone en su post. Una vez que hayas elegido el dibujo y encontrado el patrón padre adecuado, sólo tienes que mandarlo. Y esto lo puedes hacer de varias formas. Lo más sencillo es enviar directamente la imagen, pero también puedes "convertirla" en una lista de 0's y 1's (un 0 representa una casilla blanca y un 1, una negra). O incluso puedes usar este otro cifrado que tanto me gusta. Escojas en método que escojas, el receptor debería ser capaz de volver a dibujar el patrón para, a continuación, aplicar las reglas de "El juego de la vida" y obtener el mensaje original.
Como cifrado, es interesante, aunque no muy práctico (ya sabes que mis cifrados favoritos son más bonitos que útiles). Si siempre utilizas los mismos patrones, no se diferenciará de un cifrado de sustitución corriente, fácil de romper, pero sería buena idea investigar qué ocurriría si se van usando diferentes diseños, cómo afectaría a la seguridad (asumiendo que el atacante no sabe qué reglas estamos usando). Aún así, reconozco que encontrar un patrón padre es una tarea algo tediosa (y, como hemos comentado antes, a veces, imposible).
Espero que te haya gustado este cifrado y no dudes en compartir los diseños que encuentres. Si te apetece, puedes intentar resolver este criptograma. ¡Hasta el próximo cifrado!
Around three weeks ago, I talked about Conway's "Game of life" on this post and I also posed a little puzzle on this other post. All of this gave me the idea of creating a cipher based on this simulation.
Recall that, in the "Game of life", cells (represented on a grid) modify their alive-dead state according to some rules that could be condensed into the following lines:
- A live cell that has 2 or 3 live neighbours will remain alive in the next state. Otherwise, it will die.
- A dead cell that has exactly 3 live neighbours will come back to life in the next state. Otherwise, it will remain dead.
I advise you that, before continuing the reading, you become familiar with the game by playing around with the interactive version I made in JavaScript on the first post mentioned above.
Now, how could we design a cipher from all this? On the first place, our message is going to be something graphical: we may draw letters, numbers or shapes. As a first attempt, we could first draw our message on the grid, go to the next state and send the result. For instance, in order to cipher a 4-cell vertical line, we would send its next state, as shown in the image:
What the receiver should do is find the previous state to the one they get. Does this method work? Unfortunately, no. Consider the following figure, that also transforms into the same rectangle when aplying the rules of the game:
The receiver would have no means to determine which of these two patterns is the one we chose at the beginning. And, not only in this situation: in general, any pattern that gets generated may have several possible previous states. We have to take another route.
We could do it the other way around: we find a previous state to our message (even several may exist, we only choose one), we send it and it's then the receiver who applies the rules to retrieve the original message. The receiver will always be able to do this, since the rules do not admit alternative paths.
We are left, then, with one problem: how, from a given pattern, can we find a previous state? Usually, this previous state is called a "parent" because it generates the one that we have.
If we dig a little on the "Game of life", we quickly bump into a seemingly
impassable wall: the so-called "Gardens of Eden". A garden of Eden is a pattern that has no parent, i.e. no one generates it. How are we affected by the existence of such gardens? Simple, if our message turns out to be one of these special patterns, we won't be able to find any previous state so that it becomes the ciphered message. At this point, I thought "Well... if there are very little gardens of Eden, we may never find ourselves in this situation..." But the bad news are that the bigger the pattern, the more likely it is to be a garden of Eden, that is, there are quite a lot. We painted ourselves into a corner (Translation note: this is actually a joke, since the Spanish equivalent is "In what a garden we have entered")!
The conclusion is evident: we cannot cipher any random thing, just some patterns. We'll have to be careful...
I was more or less at this point, trying to construct parents to simple drawings such as letters or numbers, when, by an absolute and brilliant fortuity, I found this curious post on Matthew Scroggs' webpage (link HERE to the homepage). Matthew is the creator of Chalkdust Magazine's crossnumbers, that you know that I love and about which I have already talked in some ocassion. On his post, he provides parent patterns to small versions of the letters of the alphabet. For example, take a look at this picture:
When the rules of the game are applied, this is generated:
That is, the letter K. We just found a way to cipher letters: we draw the parent of each one that we want to cipher, leaving some space in between so that they do not affect each other, and send the pattern. For example, if we want to cipher LOGICA, which is translated as a picture as:
we would send the following pattern, which is one of its parents:
Of course, this is not the ONLY way, we could use different models for the letters, suitable to our taste, such as bigger, slimline,... or even add the letter Ñ. The only thing to do, as you already know, is to find an appropiate parent. For example, in order to get this other model for the letter G:
the only thing we need to do is draw this other pattern which, curiously, is another G:
Another example I constructed, this pattern:
generated the number 170:
You can be as creative as you want and draw your own designs, or use the one Matthew Scroggs proposes on his post. Once you have chosen the picture and found the right parent pattern, you just have to send it. And this, you can do in several ways. The simplest thing may be sending the picture directly as an image file, but you can also "convert" it into a list of 0's and 1's (a 0 represents a white cells and a 1, a black one). Or, even, you can use this cipher that I love. Despite of the method you choose, the receiver should be able to draw again the pattern so that they can apply the rules of the "Game of life" and obtain the original message.
As a cipher, it is interesting, although not very practical (you already know that my favourite ciphers are prettier than they are useful). I you always use the same patterns, it is no different from a regular substitution cipher (easy to break) but it may be a good idea to investigate what happens when the designs keep changing, how security would be affected (assuming the attacker does not know which rules are being used). Yet, I recognize that finding a parent patter can be a tedious task (and, as mentioned before, sometimes impossible).
I hope that you liked this cipher and do not hesitate to share the designs that you find. If you want, you can try to solve this cryptogram. See you in the next cipher!
No hay comentarios:
Publicar un comentario