lunes, 1 de enero de 2018

Criptografía (LXXXIII): Solución Reto 10

El  enunciado del décimo reto que puse en este post era el siguiente: "Sospechamos que un empleado de nuestra compañía está sacando información confidencial para pasársela a la competencia. Tras diversas investigaciones creemos que para ello puede estar utilizando el pendrive que le ha proporcionado la empresa. Con la excusa de grabar en él cierta documentación conseguimos que nos lo deje y tras su análisis conseguimos recuperar diversos archivos borrados. Todos ellos están protegidos por contraseña, menos un archivo con una imagen (se asocian al reto este último y uno de los recuperados). En la imagen se oculta la contraseña del resto de archivos recuperados: ¿me puedes decir cuál es?".

Este reto es de esteganografía y su solución es:

1.- Descargamos los dos archivo asociados al reto (Reto 10_Imagen.bmp y Reto 10_Archivo recuperado 1.zip) y abrimos el segundo de ellos. Este archivo contiene un archivo comprimido (Documento 1.txt) protegido por contraseña.

En el enunciado del reto ya se nos dice que en la imagen se oculta la contraseña del archivo anterior y del resto de archivos recuperados. Abrimos el primero de los archivos asociados al reto (Reto 10_Imagen.bmp) con un editor hexadecimal,

El tamaño de archivo que se indica en su cabecera coincide con el que realmente tiene:
Por tanto, podemos descartar los métodos esteganográficos que incrementan el tamaño del archivo portador, tales como: EOF y el de ampliación de la cabecera para ocultar información adicional en ella.

Otro de los métodos más sencillos para ocultar información en un archivo de imagen bmp consiste en utilizar los Bytes de relleno de cada línea de la imagen. Es decir, en un archivo bmp los valores correspondientes a cada línea de la imagen se disponen de izquierda a derecha con una longitud de línea múltiplo de 4 Bytes, agregándose en caso necesario los Bytes con valor 0 que se precisen hasta completar la longitud múltiplo de 4. Estos Bytes de relleno se ignoran a la hora de visualizar la imagen, por lo que su utilización para ocultar información adicional no afecta a su visualización.

En nuestro reto, tal y como se puede observar en la figura siguiente, la imagen bmp tiene 523 píxeles de ancho:
En la figura anterior en la que se muestra la cabecera del archivo bmp, vemos que se utilizan 24 bits (3 Bytes) por píxel ("0018" en hexadecimal, 24 en decimal), por lo que cada línea de la imagen tendrá (523 píxeles x 3 Bytes/píxel) + 3 Bytes = 1.569 Bytes + 3 Bytes = 1.572 Bytes. Es decir, 1.569 no es múltiplo de 4 y, por tanto, se añaden 3 Bytes de relleno en cada línea hasta que su longitud sea igual al siguiente múltiplo de 4, hasta 1.572. Además, para conocer cuanta información podemos ocultar como máximo en esta imagen utilizando los Bytes de relleno de todas las líneas de la imagen basta con multiplicar el alto de la imagen (que tal y como se observa en la figura anterior es 412 píxeles) por el número de Bytes de relleno de cada línea, es decir, en nuestro caso: 412 líneas x 3 Bytes/línea = 1.236 Bytes.

Con el editor hexadecimal vamos a la posición que ocupa el primer carácter de relleno correspondiente a la primera línea de la imagen (en hexadecimal: 36 + 621 = 657):
Los tres caracteres de relleno de la primera línea contienen los valores en hexadecimal "4B 65 79", que se corresponden en ASCII con los caracteres "Key", por lo que parece que, efectivamente, se han utilizado los Bytes de relleno de algunas líneas para ocultar la contraseña que nos pide el reto.

Vamos a la posición que ocupa el primer carácter de relleno correspondiente a la segunda línea de la imagen (en hexadecimal: 657 + 3 + 621 = C7B):
Los tres caracteres de relleno de la segunda línea contienen los valores en hexadecimal "2F 30 38", que se corresponden en ASCII con los caracteres "/08".

Vamos a la posición que ocupa el primer carácter de relleno correspondiente a la tercera línea de la imagen (en hexadecimal: C7B + 3 + 621 = 129F):
Los tres caracteres de relleno de la tercera línea contienen los valores en hexadecimal "2D 30 33", que se corresponden en ASCII con los caracteres "-03".

Vamos a la posición que ocupa el primer carácter de relleno correspondiente a la cuarta línea de la imagen (en hexadecimal: 129F + 3 + 621 = 18C3):
Los tres caracteres de relleno de la tercera línea contienen los valores en hexadecimal "00 00 00".

Por tanto, vamos a realizar la primera prueba con la contraseña = "Key/08-03", y, efectivamente, es la clave correcta. El archivo Documento 1.txt que contiene el archivo zip tiene el siguiente contenido:
Por tanto, la solución al reto 10 es: Key/08-03.

******** PRÓXIMO RETO
Reto 11:   Por publicar.

viernes, 29 de diciembre de 2017

Criptografía (LXXXII): Solución Reto 9

El  enunciado del noveno reto que puse en este post era el siguiente: "Como todos los años por estas fechas suelo enviar una felicitación de navidad a un amigo con el que comparto la afición por el ajedrez. Este año le he enviado un correo electrónico en el que figura como asunto el título de este reto y en el que le adjunto la imagen asociada al mismo. No, no me he equivocado de imagen. Supón que interceptas o tienes acceso a ese e-mail, ¿puedes ver la felicitación de navidad que le he enviado a mi amigo?".

Este reto combina la esteganografía con la criptografía y su solución es:

1.- Descargamos el archivo asociado al reto (Reto 9_Navidad 2017.bmp) y lo abrimos con un editor hexadecimal.

Lo primero que nos llama la atención son los caracteres alfanuméricos, "LyQW2FDMTlR4", que se encuentran a partir de la posición "36" en hexadecimal (54 en decimal):
Tal y como indique en este post, la cabecera de un archivo de imagen bmp tiene un tamaño de 54 bytes, lo que se indica en 4 Bytes a partir de la posición "0A" en hexadecimal (10 en decimal) con el valor "36 00 00 00" (recordar que los Bytes se disponen de izquierda a derecha del menos significativo al más significativo, es decir, hay que leerlos de derecha a izquierda: "00 00 00 36" en hexadecimal, 54 en decimal), pero tal y como se observa en la figura en este caso tiene un tamaño de "00 00 00 42" en hexadecimal (66 en decimal), lo que indica que se ha ampliado en 12 Bytes, que es justo el número de caracteres alfanuméricos que hemos observado. Es decir, se ha ampliado el tamaño de la cabecera para incluir en ella dichos caracteres sin afectar a la visualización de la imagen.

2.- Lo siguiente que nos llama la atención es que el tamaño que realmente tiene el archivo no coincide con el que debería tener tras la ampliación realizada en la cabecera:
Es decir, debería tener 373.734 Bytes + 12 Bytes = 373.746 Bytes, y realmente tiene 466.396 Bytes:
Vamos a la posición "05B3F1" (373.745 en decimal) que es en la que, conforme al tamaño del archivo que se indica en la cabecera más la ampliación realizada a la misma, se encontraría el último Byte del archivo bmp, y reconocemos justo detrás de ella (a partir de la posición "05B3F2") la cabecera de una archivo zip (empieza con los valores en haxadecimal "50 4B", que se corresponden en ASCII con los caracteres "PK").
Además, tal y como se observa en la figura anterior, este archivo zip parece contener un archivo comprimido llamado Navidad2017.jpg, y que es posible que contenga la felicitación que estamos buscando.

Sin hacer mayores comprobaciones, extraemos el contenido del archivo bmp a partir de la posición "05 B3 F2" y hasta el final, y generamos con esa información un archivo nuevo que grabamos con el nombre de Reto 9_Navidad2017.zip.
El tamaño del archivo así generado es de 92.650 Bytes, lo que ya cuadra con el tamaño que tiene realmente el archivo bmp, es decir: 373.734 Bytes (indicado en su cabecera) + 12 Bytes (ampliación cabecera) + 92.650 Bytes (tamaño archivo zip) = 466.396 Bytes (tamaño archivo bmp).

Abrimos este nuevo archivo zip y, efectivamente, contiene un único archivo comprimido de nombre Navidad2017.jpg, pero está protegido con contraseña.

3.- Para intentar averiguar la contraseña del archivo zip nos centramos en los caracteres alfanuméricos que hemos observado en la cabecera, es decir: "LyQW2FDMTlR4" y probamos a ver si ésta es la contraseña. No lo es.

Fijándonos un poco más en esos caracteres vemos que es posible que sean el resultado de codificar la contraseña en Base64. Acudimos a un codificador/decodificador Base64 online pero no obtenemos un resultado coherente.

¿Podría tratarse de un criptograma?. Pues sí, pero, en ese caso, ¿qué criptosistema se ha empleado para cifrar el texto en claro?. Considerando lo anterior, es decir, que parece código Base64, es probable que se haya utilizado uno de transposición para, simplemente, cambiar de orden los caracteres, pero tras utilizar diversos métodos de cifrado de transposición para ir probando los resultados que se van obteniendo como posibles claves y, además, acudir al codificador/decodificador Base64 para intentar obtener la clave, no se obtiene la clave correcta del archivo zip.

Posteriormente, nos fijamos en la imagen que contiene el archivo asociado al reto (Reto 9_Navidad2017.bmp) por si ésta nos puede dar alguna pista para resolverlo. Un tablero de ajedrez recuerda a una rejilla: ¿puede haberse empleado algún método de cifrado de rejilla?. En ese caso la posición de las piezas en el tablero podrían indicar los huecos perforados en la rejilla (ver este post donde explico uno de estos métodos: las rejillas de Fleissner).

Probando con el criptosistema indicado en el párrafo anterior la rejilla para nuestro reto sería:
Y ahora ponemos esta rejilla sobre un papel en blanco y vamos rellenando los huecos perforados con los caracteres del criptograma. Como éste tiene 12 caracteres sólo utilizamos los huecos de la primera fila y los de la mitad de la segunda fila, de la siguiente manera:

Criptograma: LyQW2FDMTlR4
Cuando se nos acaban los huecos de la primera fila y los de la mitad de la segunda fila, rotamos 90º la rejilla y seguimos completando dichos huecos con los siguientes caracteres del criptograma:
Cuando se nos acaban los huecos de la primera fila y los de la mitad de la segunda fila, volvemos a rotar 90º la rejilla y seguimos completando los huecos que se muestran ahora con los siguientes caracteres del criptograma:
Cuando se nos acaban los huecos de la primera fila y los de la mitad de la segunda fila, volvemos a rotar por última vez 90º la rejilla y seguimos completando los huecos que se muestran ahora con los siguientes caracteres del criptograma:
Finalmente, quitamos la rejilla y leemos sobre el papel el texto en claro.
Texto en claro: TWlLR2FyQDM4

Comprobamos si ésta es la contraseñe del archivo zip. Tampoco. Seguidamente comprobamos si al decodificar este posible código Base64 obtenemos la clave correcta:
Probamos con contraseña: MiKGar@38 y, efectivamente, vemos que es la clave del archivo zip. Este último contiene la siguiente imagen (Navidad2017.jpg):
la solución al reto 9 consistía en conseguir ver la imagen anterior.

******** PRÓXIMO RETO
Reto 10:   "¿Dónde está la llave?".

miércoles, 27 de diciembre de 2017

Criptografía (LXXXI): Las rejillas de Fleissner

En este post otro sistema criptográfico clásico, las rejillas de Fleissner, que implementa un método de transposición para cifrar el texto en claro.

Este criptosistema debe su nombre a su inventor, Edouard Fleissner von Wostrowitz, y también se le conoce como de rejillas giratorias.

En éste método una rejilla es un cuadrado con un número par de celdas en la que éstas se dividen en cuatro cuadrantes con el mismo número de celdas, y como primer paso se numeran las celdas del primer cuadrante con números consecutivos.

Por ejemplo:
El segundo paso consiste en numerar las celdas del segundo cuadrante con el número que le corresponde a cada una de ellas tras la rotación de 90º de la rejilla.

En nuestro ejemplo:
El tercer paso consiste en numerar las celdas del tercer cuadrante con el número que le corresponde a cada una de ellas tras rotar nuevamente la rejilla otros 90º.

En nuestro ejemplo:
El cuarto paso consiste en numerar las celdas del cuarto cuadrante con el número que le  corresponde a cada una de ellas tras rotar nuevamente la rejilla otros 90º.

En nuestro ejemplo:
Y, finalmente, el último paso para tener preparada la rejilla consiste en perforar una y sólo una celda de cada número.

Por ejemplo:
Lógicamente, tanto el emisor como el receptor del mensaje deben utilizar la misma rejilla para cifrarlo y descifrarlo, respectivamente.

Veamos un ejemplo con la rejilla que hemos construido:

Texto en claro: "ESTE ES UN EJEMPLO DE CIFRADO UTILIZANDO UNA REJILLA GIRATORIA".

Para cifrar, el emisor dispone los caracteres del texto en claro en una tabla con el mismo número de filas y columnas que la rejilla (si no completa todas las celdas, las que queden se rellenan con caracteres nulos) y sitúa encima la rejilla:
Y va anotando los caracteres que se muestran en los huecos perforados. El criptograma hasta el momento sería: "ENELOCRDUNAIGORX".

Cuando anota todos los caracteres de los huecos perforados gira la rejilla 90º:
Y sigue anotando los caracteres que se muestran ahora en los huecos perforados. El criptograma hasta el momento sería: "ENELOCRDUNAIGORXSSUJLIADJLRAXCJY".

Cuando anota todos los caracteres de los huecos perforados vuelve a girar la rejilla 90º:
Y continúa anotando los caracteres que se muestran ahora en los huecos perforados. El criptograma hasta el momento sería: "ENELOCRDUNAIGORXSSUJLIADJLRAXCJYMDEATZULAITIAZYQ".

Cuando anota todos los caracteres de los huecos perforados gira por última vez la rejilla 90º:
Y completa el criptograma anotando los caracteres que se muestran ahora en los huecos perforados.

Criptograma: ENELOCRDUNAIGORXSSUJLIADJLRAXCJYMDEATZULAITIAZYQETEPIFOIONREQTBZ

Para descifrar, el receptor pone la rejilla sobre un papel en blanco y va rellenando los huecos perforados con los caracteres del criptograma:
Cuando completa todos los huecos perforados gira la rejilla 90º y continúa completando los huecos perforados que se muestran ahora con los siguientes caracteres del criptograma:
Cuando completa todos los huecos perforados vuelve a girar la rejilla 90º y sigue completando los huecos perforados que se muestran ahora:
Cuando completa todos los huecos perforados vuelve a girar por última vez la rejilla 90º y continúa completando el texto en claro con los huecos perforados que se muestran ahora:
Finalmente, quita la rejilla y lee sobre el papel el texto en claro.

Texto en claro:
ESTEESUNEJEMPLODECIFRADOUTILIZANDOUNAREJILLAGIRATORIAXXQZYTBCQJZY

Es decir, desechando los caracteres nulos del final:

"ESTE ES UN EJEMPLO DE CIFRADO UTILIZANDO UNA REJILLA GIRATORIA".

lunes, 25 de diciembre de 2017

Criptografía (LXXX): Solución Reto 8

El  enunciado del octavo reto que puse en este post era el siguiente: "Hay aficiones que reúnen a la gente en el sentido que promueven que ésta se junte físicamente para realizar actividades propias de las mismas. En mi caso, yo comparto con un amigo la afición por el ajedrez y solemos enviarnos vía e-mail problemas para que el otro los resuelva. No obstante, aunque lo hacemos a distancia, en nuestro caso también nos sirve para juntarnos, ya que solemos aprovechar para mandarnos un mensaje oculto en el correo electrónico que indica la fecha, hora y lugar donde quedaremos para vernos la próxima vez. Supón que interceptas o tienes acceso al e-mail asociado al reto, ¿me puedes decir cuándo y dónde hemos quedado mi amigo y yo?".

Este reto es de esteganografía y su solución es:

1.-  Tras descargar los dos archivos asociados al reto, aquel con una posición de una partida de ajedrez y el que contiene el código QR que figura en la firma del correo electrónico, abro el primero de ellos con un editor hexadecimal y tras un primer análisis no detecto nada que me lleve a la conclusión de que en él se oculta información adicional.

Respecto al archivo que contiene el código QR lo primero que me llama la atención es que el lector que yo utilizo no lo reconoce, por lo que es posible que éste no esté bien formado, y, en cualquier caso, esto es un tanto raro y centra mis sospechas sobre este archivo.

Analizando un poco más en profundidad el código QR se observa (ver figura siguiente) que los patrones de sincronización tienen los colores invertidos (deberían alternar negro y blanco comenzando en negro) respecto a los de posición y alineamiento, y a los de la zona tranquila, lo que indica que los colores de parte del código QR están invertidos respecto al código original.
En una primera prueba, utilizando Paint selecciono todo el código QR excepto la zona tranquila e invierto los colores:
Ahora voy seleccionando los patrones de posición y el de alineamiento e invirtiendo sus colores, obteniendo el siguiente código QR:
Y pruebo a ver si el lector lo reconoce ahora. Efectivamente, sí lo reconoce, se trata de un Código QR de geolocalización y muestra en el mapa la siguiente ubicación:
Con lo que ya sabemos dónde se producirá la cita.

Nos falta sólo saber cuándo y para intentar averiguarlo abro el archivo que contiene el código QR con un editor hexadecimal:
Tal y como se observa en la figura anterior, entre los metadatos parece que hay una fecha y una hora (19/12/2017 19:00), de lo que nos podríamos haber dado cuenta también sin más que mirar las propiedades del archivo:
Esto, unido a que en el enunciado del reto se dice que el correo se envió el 16/12/2017, me lleva a concluir sin ninguna duda que la cita tendrá lugar el día 19/12/2017 a las 19:00 horas.

Por tanto, la solución al reto 8 es: hemos quedado en la dirección (coordenadas de geolocalización) que contiene el código QR asociado al reto y en la fecha y hora que se indican en el metadato "Comentarios" del archivo de imagen que contiene dicho código. 

Por otra parte y ya que estamos, si alguien quiere resolver el problema de ajedrez (imagen puesta para despistar) puede ver la solución en este post.

******** PRÓXIMO RETO
Reto 9:     "¡Feliz Navidad!".

domingo, 24 de diciembre de 2017

Criptografía (LXXIX): Reto 10

En este post un reto fácil sobre esteganografía.

Como siempre, se admiten soluciones en forma de comentarios a esta entrada. Pasado un tiempo iré proporcionando pistas para su resolución, un máximo de tres, y posteriormente actualizaré este post con la solución.

Reto 10: "¿Dónde está la llave?".

Sospechamos que un empleado de nuestra compañía está sacando información confidencial para pasársela a la competencia. Tras diversas investigaciones creemos que para ello puede estar utilizando el pendrive que le ha proporcionado la empresa. Con la excusa de grabar en él cierta documentación conseguimos que nos lo deje y tras su análisis conseguimos recuperar diversos archivos borrados. Todos ellos están protegidos por contraseña, menos un archivo con una imagen (se asocian al reto este último y uno de los recuperados). En la imagen se oculta la contraseña del resto de archivos recuperados: ¿me puedes decir cuál es?.

Dificultad:
Tipo:          Esteganografía.

Recursos:  - Reto 10_Imagen.bmp
                  - Reto 10_Archivo recuperado 1.zip 

******** 27/12/2017
Pista 1:     El método empleado para ocultar la clave en el archivo bmp no ha incrementado su tamaño, por lo que se descartan los métodos EOF y el de ampliación de la cabecera para ocultar en ella información adicional. También te adelanto que el método utilizado no ha sido LSB. ¿Qué otros métodos conoces para ocultar fácilmente información en un archivo de imagen bmp?.

******** 29/12/2017
Pista 2:     Tal y como decía en este post, en un archivo bmp los valores correspondientes a cada línea de la imagen se disponen de izquierda a derecha con una longitud de línea múltiplo de 4 Bytes, agregándose en caso necesario los Bytes con valor 0 que se precisen hasta completar la longitud múltiplo de 4. Estos Bytes de relleno se ignoran a la hora de visualizar la imagen, por lo que su utilización para ocultar información adicional no afecta a su visualización.

******** 30/12/2017
Pista 3:     En el caso de la imagen bmp asociada al reto, como ésta tiene 523 píxeles de ancho, cada línea de la imagen tendrá 3 Bytes de relleno, siendo el tamaño de cada una de ellas de 1.572 Bytes. ¿Qué información contienen los tres Bytes de relleno correspondientes a la primera línea de la imagen (comienzan en la posición 657, en hexadecimal)?, y ¿los de la segunda?...

******** 01/01/2018
Solución.

******** PRÓXIMO RETO
Reto 11:   Por publicar.