Ir al contenido principal

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:   "En el fondo del mar".

Comentarios

  1. hola,
    muchas gracias por el reto, pero, de donde sale el valor 36 en la suma de

    "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):"

    de donde sale el 36!??
    ademas porque sumas +3 si ese 3 es el espacio sobrante donde se esconde la información.
    ya que si sumas el +3(hxdcml) ya haria el salto de linea...
    o me equivoco?

    ResponderEliminar
    Respuestas
    1. Hola:

      la cabecera de un archivo .BMP tiene 54 Bytes de longitud (https://es.wikipedia.org/wiki/Windows_bitmap), del Byte 00 al Byte 53, y es de ahí de donde sale el valor 36. Si convertimos 54 en decimal a hexadecimal obtenemos 36, que sería la primera posición (en hexadecimal) con información de la imagen (en nuestro caso, esa posición contiene el valor 0E - mira la primera figura del post).

      A partir de ahí, para ir a la primera posición (en hexadecimal) de relleno debemos sumar a esa cantidad (36 en hexadecimal) los Bytes que contienen información "útil" de la primera línea de la imagen (cada línea de la imagen tiene 523 pixeles de ancho y se utilizan 3 Bytes/pixel), es decir, 523 pixeles x 3 Bytes/pixel = 1569 Bytes, que en hexadecimal es 621. Por tanto, el primer carácter de relleno estará en la posición hexadecimal 36 + 621 = 657 (los tres caracteres de relleno de la primera línea de la imagen contienen 4B, 65, 79 - mira la segunda figura correspondiente al editor hexadecimal).

      A partir de ahí, para situarnos en la posición del siguiente carácter de relleno (el primero de la segunda línea de la imagen) sumamos a 657 (en hexadecimal la primera posición del primer carácter de relleno de la primera fila) los 3 Bytes de longitud correspondientes al relleno de la primera fila más los 621 Bytes (en hexadecimal) que contienen información "útil" de la segunda línea de la imagen, es decir: 657 + 3 + 621 = C7B (en hexadecimal).

      Y así sucesivamente...

      Eliminar

Publicar un comentario

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