Parte I Personal PNGSafeBox para Windows
Descripción general
El proyecto se basa en la modificación de ficheros gráficos (PNG) y cuya estructura se «tunea» para ser prácticamente inexpugnables.
Por ejemplo, si queremos cifrar una imagen(foto) que contenga los datos de nuestra tarjeta de coordenadas tan solo tendremos que convertir la imagen a formato gráfico PNG y utilizar el programa comentado en este artículo.
El resultado será un fichero modificado de tal forma que no sea posible su visionado hasta que vuelva a ser «reordenado» de nuevo por el programa.
Algoritmo de cifrado utilizado.
Haremos uso de la estructura típica de un fichero gráfico PNG. Esta puede consultarse en la página oficial de dicho formato grafico (http://www.libpng.org/pub/png/spec/1.2/PNG-Contents.html), pero no es preciso su conocimiento detallado ya que nuestro programa se encarga de todo.
Un fichero gráfico PNG esta conformado una cabecera seguida de secciones que se denominan «chunks». La especificación de cada chunk no es objeto de este artículo, pero baste decir que utilizaremos parte de la cabecera del fichero PNG así como parte no esencial del primer chunk existente en el mismo.
El algoritmo para cifrar la imagen – en formato PNG – a proteger realiza estos pasos:
1) Genera tres números alatorios de un rango especifico, N1, N2 y N3
2) Crea una matriz de bytes con datos del offset N1 a EOF-N1 del fichero gráfico.
3) Transpone dichos bytes y los reescribe al fichero.
4) Repite – dos veces más – similar procedimiento para los números N2 y N3.
5) Crea una cadena con la información /N1N2N3+
6) Cifra mediante triple DES la cadena utilizando nuestra KEY y IV
7) Escribe la cadena cifrada en una posición de cabecera del fichero PNG.
8) Realiza algunas modificaciones en la zona inicial de la cabecera del fichero PNG.
Una vez hechos estos pasos el fichero PNG obtenido queda altamante modificado y su visualización es imposible.
La única forma de visualizar de nuevo el fichero gráfico será utilizando el programa cifrador/descifrador para restaurar el PNG a su formato original.
Vemos en esta simulación gráfica cómo se transponen físicamente los bytes en el fichero. En el ejemplo mostrado (un fichero de tamaño mínimo) tenemos una imagen de 100×100 pixels, la cual ocupa en el fichero 476 bytes. Los números generados han sido : 25, 43 y 56, y las 3 matrices de transposición (mostradas aquí por colores) intercambiaran posiciones entre si tres veces consecutivas.
Hemos de destacar que las tres matrices pueden ocupar posiciones solapadas, lo cual complica aún más la «re ordenación» de bytes sin conocer las coordenadas adecuadas. En este ejemplo vemos gráficamente cómo, efectivamente, se solapan parte de las matrices de inversión.
Software utilizado para el Proyecto
Para desarrollar el programa hemos optado por una excelente herramienta de programación y que nos permite implementar el proyecto en VB.NET de forma totalmente gratuita.
Se trata del entorno Sharp Develop. En nuestro caso hemos optado por la versión 3.2.1 del citado software. Esta no es la última existente, pero nos ha resultado suficiente y, probablemente, será mucho más compatible con sistemas Windows que no estén actualizados al cien por cien.
El programa desarrollado es minimalista y tan solo persigue hacer lo que hace, es decir, cifrar y descifrar ficheros PNG.
Podemos descargar el proyecto VB.NET desde el link que aparece al final del artículo o desde la sección de descargas de Webtronika.
Notas sobre el código del programa
A pesar de que el programa se ha desarrollado para que sea suficientemente auto-explicativo (contiene muchos comentarios) preferimos explicar aquí algunos de los aspectos mas destacados del mismo.
La primera rutina que ejecuta el programa es «Initialize«, la cual – como su nombre indica – efectuará ciertas inicializaciones básicas. Una vez efectuadas el control recae en el botón «Open File» , el cual nos permite elegir el fichero a tratar ( cifrar o descifrar ).
La rutina asociada al botón llamará a una verificación – función IsCiphered ( ) – sobre el fichero seleccionado. Mediante la verificación del primer byte de dicho fichero el programa conocerá si se trata de un fichero PNG estándar o bien un fichero previamente cifrado por nuestro programa. En el caso de que el primer byte no coincida con estas dos posibilidades se calificará dicho fichero de inválido para ser tratado por el programa.
La rutina de codificación – CodeFile ( ) – ejecutará el algoritmo de codificación comentado en lineas anteriores. Cabe destacar que la cadena a codificar se conforma por las tres posiciones a guardar (cada una de ellas forzada a dos posiciones) y un par de símbolos ( «/» y «+» ) al principio y final de la misma que ayudarán en posteriores verificaciones, y por supuesto usando la codificación Base64. Esto hace que la cadena final sea de 8 posiciones.
Por ejemplo, si las tres posiciones obtenidas aleatoriamente fueran 3, 23 y 41 la cadena s0 a cifrar quedará finalmente como /032341+
Podemos ver que la rutina de descodificación ejecuta un proceso similar pero al transponer las matrices del fichero lo hace – lógicamente – en sentido inverso.
Además de esto, la rutina de descodificación ejecuta la subrurina ChkDecodeString ( ) que controla que el contenido de la cadena descifrada cumple con el formato esperado, con lo comentado para s0. Para ello hace uso de varias comprobaciones :
* Longitud de la cadena s0 es de 8 posiciones.
* Los caracteres de la cadena s0 pertenecen a la base numérica Base64.
* Los 6 caracteres centrales son de tipo numérico.
* Los caracteres inicial y final son / y +.
La rutina utilizada para generar los tres números aleatorios se ha prefijado a unos márgenes que eviten que el número obtenido (offset a utilizar posteriormente) sea mayor de 15, con lo evitamos «tocar» la cabecera del fichero y que será donde alojaremos posteriormente la información cifrada (mediante 3DES) de las tres posiciones aleatorias.
Es de destacar que la codificación del valor (cadena) que contiene la información sobre las tres posiciones aleatorias generadas se realiza mediante un cifrado triple DES operado en modo CBC / no Padding. Para ello necesitaremos utilizar una KEY de cifrado (16 bytes) y un vector de inicialización (8 bytes). Dadas las longitudes de ambas cadenas se ha preferido dar la posibilidad al usuario de modificar desde el frontal del programa tan solo el valor prefijado del vector de inicialización (I.V.) ya que dada su menor longitud puede ser más fácil de recordar por el usuario a modo de «password».
El valor de la KEY de cifrado se ha prefijado en el programa (en la cabecera), pero puede ser modificado a nuestro gusto. Tan solo hemos de respetar que la cadena utilizada use tan solo caracteres pertenecientes a la codificación Base64.
La rutina de trasposición utilizada – Transpose ( F, P) – es la misma tanto en la codificación comoi en la descodificación del fichero. La única diferencia estriba en que es llamada tres veces y dichas llamadas se realizan en orden inversoi en la rutina de descodificación.
La rutina ChkKey ( ) se encarga de verificar en tiempo real que el vector de inicialización seleccionado manualmente (I.V.) cumpla con la longitud y formato adecuado. Si es así la casilla IV se colorea en verde, y en rojo si no lo es.
Manejo del programa
La utilzación del programa no tiene secreto alguno. Se ha prefijado para que se ejecute en una ventana muy reducida y centrada en la pantalla.
Para cifrar un archivo tan solo hemos de seleccionar el mismo. Inmediatamente el nombre del fichero aparecerá en el frontal del programa y pulsando sobre el icono del candado se cifrará o descifrará el fichero elegido.
Al abrir el fichero se ejecuta un análisis previo del mismo y, como hemos comentado, dependiendo del valor del primer byte del fichero el candado nos dará la opción de cifrar, descifrar o nos indicará que el fichero selecionado no es válido.
Los valores de byte 0 que la rutina puede encontrarse son :
-
0x89 => Fichero no cifrado (PNG estándar).
-
0x25 => Fichero PNG cifrado por nuestro programa.
-
Otros => Fichero de formato no reconocido.
El fichero ZIP descargable incluye tanto el proyecto completo (VB .NET for Sharp Develop) como el fichero ejecutable.
Hemos de tener en cuenta que el fichero ejecutable puede, digamos, ser personalizado mediante la selección de un valor de I.V. específico a utiliar en el cifrado 3DES. Por otra parte, si retocamos el proyecto podremos configurar a nuestro gusto tanto el valor de la KEY como del I.V.
La primera vez que abramos el proyecto bajo el IDE Sharp Develop podemos abrir la solución (fichero .sln) y pulsar luego dos veces sobre «MainForm.vb» en el árbol de proyecto que aparece a nuestra izquierda.
apareciendo entonces dos ventanas, una para el código VB en sí y otra para el diseño gráfico (Form) del programa.
Notas sobra los valores usados para KEY & IV
Los valores internos (por defecto) que usa el programa para la KEY y el Initialization Vector (I.V.) son los siguientes:
- KEY = «TheKey1234567890»
- I.V. = «1234567+»
Podemos modificar el valor del I.V. durante la ejecución del programa o, si precisamos asegurar más privacidad y seguridad, editar el código fuente del mismo y ajustar las dos variables que conforman el cifrado 3DES. Estas están situadas en la parte inicial (superior) del código.
Descarga del Software del artículo
Descarga del Proyecto y el programa ………….. PNGSafeBox para Windows
Document download (English)……………………. PNGSafeBox Doc. English
Descarga de documentación (Español) ……….. PNGSafeBox Doc. Español
Nueva versión 1.2
Mejoras añadidas a la versión 1.2:
* Control del tamaño mínimo de fichero (400 Bytes)
* Función Drag & Drop para apertura de fichero.
* Movimiento de la ventana vía ratón.
Proyecto y programa versión 1.2 ………….. PNGSafeBox para Windows v 1.2