Diseño y Programación Orientados a Objetos

Encriptación de Imágenes

 

 

Alumnos:

Luis Báez I.

Carolina Mellings I.

 

 

Introducción


Cuando se tiene una fotografía o imagen privada que no se desea que sea revisada por terceras personas, es necesaria una forma de dejarla oculta en el PC. Es por ello que para solucionar esta problemática se realiza una aplicación en la cual el usuario encripta una imagen ingresando una clave que solo él conocerá y que será necesaria a la hora de desencriptarla.

La necesidad a la que responde este proyecto, es más bien de tipo doméstica para uso particular, pues un programa comercial que realice el procedimiento que aquí se presenta tiene un alto costo.

Una utilidad extra que puede tener nuestra aplicación es en oficinas, por ejemplo en el PC de una secretaria que usualmente tiene fotografías familiares que no deberían ser descubiertas por algún jefe, quien podría pensar que esta realizando otras actividades durante su horario de trabajo.

 

Desarrollo

 

Para desarrollar la aplicación de encriptación debemos analizar las características de una imagen y a partir de éstas desarrollar un algoritmo que permita ocultar la información.

Una imagen se compone por un cierto número de píxeles, donde cada uno guarda la mezcla RGB que compone el color de cada punto. Además, una imagen contiene información referida a las características propias de la imagen, en nuestro caso particular nos interesa obtener dimensiones de ancho y alto, las cuales están referidas a la cantidad de píxeles.

Una vez que hemos identificado éstas características se desarrolla un algoritmo que permita modificar el orden en que el valor del píxel se distribuye dentro de la imagen. Específicamente del valor RGB que contiene la mezcla de los colores rojo, verde y azul.

Lo primero a realizar es buscar una imagen que permita desarrollar la aplicación de encriptación, que en éste caso se desarrolla en lenguaje Java.

Debido a que se desea desordenar el orden de los píxeles, un primer paso a realizar es copiar la imagen a una variable que pueda ser manejada en el programa. Para ello se utiliza una variable de tipo Image, no obstante, ésta variable no permite manejar directamente el valor de cada píxel. Para solucionar el manejo de los píxeles, es necesario transferir (redibujar) la información de la variable a un buffer (BufferedImage). Realizada ésta operación, se crea un panel dentro de un frame que permite desplegar por pantalla la imagen original y las operaciones realizadas.

Para desarrollar el algoritmo de encriptación se requiere obtener la cantidad de fragmentos, el password y las dimensiones de ancho y alto de la imagen. Es por ello que se utiliza la entrada de datos a través de JOptionPane, por el cual el usuario ingresa la imagen que desea encriptar, cuyo formato de nombreimagen.jpg, el número de fragmentos que corresponde a un entero, el password que corresponde a un entero positivo de 4 dígitos, y además se le indica a la aplicación si lo que se desea es encriptar o desencriptar la imagen indicada previamente a través de una “e” o una “d” respectivamente. Ingresados los datos, si la opción es encriptar el algoritmo procede a desordenar la ubicación de los fragmentos de acuerdo a operaciones entre los datos, tras lo cual se obtiene la nueva posición que ocuparan los fragmentos. Para ello se hace necesario utilizar arreglos bidimensionales, en donde el primer subíndice hace referencia a la cantidad de fragmentos, y el segundo subíndice nos indica la cantidad de píxeles que contiene dicho fragmento, luego se copian los píxeles que componen la imagen en forma ordenada y a partir de un arreglo auxiliar, de iguales dimensiones, se copian los fragmentos desordenados. Finalmente se copia el arreglo desordenado al buffer (BufferedImage), y a través de la clase de entrada/salida se crea un objeto fichero de la clase File, el cual nos permite por medio de la clase ImageIO guardar en formato de imagen (.jpg)  el buffer que contiene la imagen encriptada.

Luego para desencriptar la imagen se utiliza el mismo algoritmo de encriptación, con la diferencia que toma los fragmentos y los lleva a su posición original, tras lo cual la imagen queda visible nuevamente para el usuario.

 

 

Bosquejo de solución

 

 

 

Figura 1 Bosquejo de solución

 

 

 

Dificultades en desarrollo

 

La mayor dificultad encontrada en el desarrollo del proyecto correspondió al manejo de imágenes en Java, específicamente a la forma que permitiera el manejo de las dimensiones de la imagen y acceder a sus píxeles. En un principio se copia la imagen a una variable de tipo imagen la cual no permite manejar los píxeles, lo cual se solucionó utilizando una nueva variable en la cual se dibuja la imagen, y por medio de métodos de manejo de imágenes se logra acceder los píxeles. No obstante se encuentra con la dificultad en el manejo de los píxeles que conforman el fragmento, lo cual se solucionó mediante el uso de dos arreglos bidimensionales.

Otra dificultad, luego de realizado todo el algoritmo de encriptación corresponde al momento de guardar a un archivo los fragmentos desordenados de la imagen. Para ello se recurre a la clase ImageIO que nos permite comprimir la imagen a formato jpg.

Una dificultad que no logró ser solucionada fue el hecho de adquirir el ancho y el alto de la imagen en píxeles a través de la misma aplicación por lo que se recurre a solicitarla al usuario como una solución por defecto.

Finalmente, dado razones de tiempo no se desarrolla una interfaz mas simple para el usuario, en la cual permita desplegar una GUI para el manejo de archivos, no obstante se cumple con el objetivo principal del proyecto, encriptación y desencriptación de imágenes.

 

Ejecución del Programa

 

Para ejecutar la aplicación, esta responde a dos actividades, la de encriptación y la de desencriptación.

 

Para encriptar una imagen una vez ejecutado el programa se pasa por las siguientes etapas:

 

  1. Seleccionar la imagen a encriptar:

 

 

  1. Indicar el ancho en píxeles de la imagen:

 

 

  1. Indicar el alto en píxeles de la imagen:

 

 

  1. Indicar el número de fragmentos en que se dividirá la imagen:

 

 

  1. Indicar una clave de encriptación de 4 dígitos:

 

 

  1. Indicar que el procedimiento a ejecutar es de encriptación mediante una e:

 

 

Luego la aplicación mostrará a través de un frame la imagen original y la imagen encriptada la cual se guarda en un archivo llamado imencrip.jpg,  cuyo nombre deberá ser modificado por el usuario para no sobrescribirlo.

 

 

     

Para desencriptar una imagen una vez ejecutado el programa se pasa por las siguientes etapas:

 

 

 

Luego se repiten los pasos 2. 3. 4. 5.

 

 

6.  Se indica que lo que se va a realizar es la desencriptación de una imagen a    través de la letra d:

 

 

Finalmente un frame muestra la imagen encriptada arriba y desencriptada abajo y además se guarda en un archivo con el nombre imdesenc.jpg.

 

 

 

Conclusiones

 

Una vez realizado el proyecto, se concluye que:

 

 

 

Referencias

 

 

 

Archivos