1 Método Criptográfico de Sustitución Simétrica para el Análisis del Cómputo Matricial en Sistemas Embebidos Fausto Abraham Jacques García1, Ruth Angélica Rico Hernández1, Juan Salvador Hernández Valerio1, Carlos Alberto Olmos Trejo1, Gabriela Xicoténcatl Ramírez1, Ubaldo Chávez Morales1, Antonio Trejo Morales2 y Víctor Hugo Guerrero Cruz2. 1 Profesor e Investigador de la Facultad de Informática de la Universidad Autónoma de Querétaro Querétaro, México. 2 Ingeniero de Software en el Centro de Ingeniería y Desarrollo Industrial, Querétaro, México. jacques@uaq.edu.mx, rico@uaq.mx, valerio@uaq.mx, caolmos@uaq.mx, gabyxico@uaq.mx, ubald.chavez@gmail.com, atrejo@cidesi.mx, victor.guerrero@cidesi.mx. Resumen— En el presente artículo se describe el procedimiento utilizado para la implementación del método criptográfico de sustitución simétrica Hill Cipher en un Sistema de Software Embebido, usando una Tarjeta Raspberry Pi para la ocultación de datos. Este estudio se realiza con la finalidad de obtener el desempeño de este algoritmo en una tarjeta con procesamiento limitado y así ver las capacidades que tiene la tarjeta para realizar cálculos matemáticos básicos, los cuales permiten realizar todo el proceso para encriptar y desencriptar un mensaje. Para este algoritmo se requiere el uso de las operaciones que se dan lugar en los espacios lineales aritméticos. Palabras claves— Encriptación, Hill Cipher, Raspberry Pi, Python, Sistemas Embebidos. I. INTRODUCCIÓN Un sistema embebido consiste en un sistema de computación cuyo hardware y software están específicamente diseñados y optimizados para resolver un problema concreto eficientemente. El término "embebido" (también se le conoce como “empotrado”), cuya función principal no es computacional, pero es controlado por una computadora integrada. Esta computadora puede ser un microcontrolador o un microprocesador (Alejandro A.D., 2012). La palabra embebido implica que se encuentra dentro del sistema general, oculto a la vista, y forma parte de un todo de mayores dimensiones. La característica principal que diferencia a los “embebidos” de los demás sistemas electrónicos es que, por estar insertados dentro del dispositivo que controlan, están sujetos en mayor medida a cumplir requisitos de tamaño, fiabilidad, consumo y costo. A lo largo de la historia, la humanidad ha tenido, por diversas razones, la necesidad de transmitir mensajes cuyo contenido permanezca oculto. La criptografía nació, en principio, como la habilidad para esconder información a cualquier persona que no le estuviera permitido leerla. A través de los siglos, se desarrollaron distintas técnicas, métodos e instrumentos que permitieron el desarrollo de este arte; la criptografía clásica abarca éstas técnicas (Universidad Nacional Autónoma de México Facultad de Ingerniería, 2012). La palabra criptografía proviene del griego krypto, (oculto), y graphos, (escribir), que literalmente sería escritura oculta, con esta definición podemos decir que es un arte de antiguo uso. Se divide en dos grandes ramas, la Criptografía de clave privada o simétrica y la Criptografía de clave pública o asimétrica (The Raspberry Pi Foundation, 2006). La Criptografía simétrica, se ha implementado en diferentes tipos de dispositivos: manuales, mecánicos, eléctricos, hasta llegar a las computadoras, donde se programan los algoritmos actuales. La idea general es aplicar diferentes funciones al mensaje que se desea cifrar de modo tal, que sólo conociendo la clave, pueda descifrarse (Amicelli, 2012). El cifrado simétrico es una forma de criptosistema en la cual la encriptación y desencriptación se realiza usando la misma clave. El cifrado simétrico transforma un texto plano en un texto cifrado utilizando una clave secreta y un algoritmo de cifrado (Stallings, 2011). A su vez se utiliza la misma clave y un algoritmo de descifrado lo cual permite recuperar el texto cifrado. Las técnicas tradicionales de cifrado simétrico utilizan la sustitución o transposición, estas técnicas Memorias del “2do. Congreso Nacional de Tecnologías de la Información”, Universidad del SABES, San José Iturbide, Gto., México, 29 y 30 de Agosto del 2014. 1 convierten elementos de texto sin formato (caracteres, bits) en elementos de texto cifrado (Stallings, 2011). El método de encriptación por medio de la transposición transpone sistemáticamente las posiciones de los elementos de texto plano para cifrar el texto (Stallings, 2011). tiene un alfabeto predefinido de 26 caracteres, los cuales no son modificables (Valeiras, 2011). Otro ejemplo donde se utiliza esta técnica de encriptación es en el artículo titulado “Development of secure encoder-decoder for JPEG images”, es un desarrollo orientado a la encriptación y desencriptación de imágenes en formato jpeg implementado en Matlab por el autor Hamissa, G. (Hamissa, et al., 2011) II. MÉTODOS Consideraciones previas: Figura 1 Encriptación Simétrica Cipher. “Python es un lenguaje de programación poderoso y fácil de aprender. Cuenta con estructuras de datos eficientes y de alto nivel y un enfoque simple pero efectivo a la programación orientada a objetos. La elegante sintaxis de Python y su tipado dinámico, junto con su naturaleza interpretada, hacen de éste un lenguaje ideal para scripting y desarrollo rápido de aplicaciones en diversas áreas y sobre la mayoría de las plataformas” (Rossum, 2009). “El algoritmo de Hill Cipher es un sistema que está basado en el álgebra lineal y ha sido importante en la historia de la criptografía. Fue inventado por Lester S. Hill en 1929, y fue el primer sistema criptográfico polialfabético que era práctico para trabajar con más de tres símbolos simultáneamente. Este sistema es polialfabético pues puede darse que un mismo caracter en un mensaje a enviar se encripte en dos caracteres distintos en el mensaje encriptado” (Rossum, 2009). La Raspberry Pi es una placa computadora que es desarrollada en Reino Unido por la fundación Raspberry Pi, es de bajo costo y su propósito fundamental es promover el desarrollo en las ciencias de la computación. El diseño de la tarjeta cuenta con un System-on-a-chip Broadcom BCM2835, que contiene un procesador central (CPU) ARM1176JZF-S a 700 MHz. Actualmente se encuentran en el mercado dos tipos de esta tarjeta, el modelo A y el modelo B, su diferencia; el modelo A solo tiene un puerto USB, carece de puerto Ethernet y presenta menor capacidad en memoria RAM (256 MB modelo A y 512 MB modelo B) (ALEJANDRO, 2012). Existen algunos desarrollos inspirados en este algoritmo de encriptación, en ejemplo de ellos es CryptoHill, desarrollado bajo la plataforma de Visual Studio 2008 y su código está escrito en su totalidad en C#. Este programa tiene la capacidad de calcular las matrices de diferente tamaño según las necesidades del usuario, como única restricción Trabajaremos en la aritmética modular acotada a 26, 28 y 29. Esto quiere decir que nuestro método criptográfico nunca usará valores diferentes a los antes citados. El alfabeto que usaremos estará formado por 26, 27 o 29 letras previamente definidas por el usuario, por ejemplo, para utilizar la aritmética modular 26 se proponen los siguientes caracteres: A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ver Tabla 1. Letra A E I M Q U Y Cifrado 0 4 8 12 16 20 24 Letra B F J N R V Z Cifrado 1 5 9 13 17 21 25 Letra C G K O S W Cifrado 2 6 10 14 18 22 Letra D H L P T X Cifrado 3 7 11 15 19 23 Tabla 1 Alfabeto para aritmética modular 26. No obstante el cifrado y descifrado del método de encriptación Hill Cipher funciona si tomamos una aritmética modular 28 o 29, agregando los caracteres faltantes para completar la tabla de caracteres a utilizar, se pueden elegir otras letras del alfabeto, signo, números, etc. Para la realización de la encriptación de texto se utiliza la siguiente fórmula matemática: C = PK mod n C = Equivale al texto encriptado. P = Es el vector de texto a encriptar. K = Es la llave para encriptar (sistema de n ecuaciones lineales). Mod n = Es la operación modular según Euclides, y n es el número de símbolos totales, los cuales conforman un alfabeto determinado. Así mismo para la desencriptación del mensaje generado se utiliza la siguiente fórmula P = K-1C mod n P = Es el texto desencriptado. Memorias del “2do. Congreso Nacional de Tecnologías de la Información”, Universidad del SABES, San José Iturbide, Gto., México, 29 y 30 de Agosto del 2014. 1 K-1 = Es la llave inversa (transformación de la original) para realizar las operaciones de desencriptación. C = Es el mensaje cifrado. Mod n = Es la operación modular según Euclides, y n es el número de símbolos totales, los cuales conforman un alfabeto determinado. Una restricción para que el método de encriptación Hill Cipher funcione es que la matriz clave privada tenga matriz inversa asociada. Esto, en aritmética modular, quiere decir que: El determinante de la matriz clave privada tiene que ser distinto de cero. El máximo común divisor entre el determinante de la matriz clave privada y los escalares 26, 28 ó 29 (aritméticas modulares con la que podemos trabajar) tiene que ser igual a 1. 8. 9. Procedimiento del algoritmo para desencriptar: 1. 2. 3. 4. Procedimiento del algoritmo para encriptar: 1. 2. 3. 4. 5. 6. 7. Seleccionar la aritmética modular a utilizar (26, 27 ó 29). Tener la clave privada que se va a utilizar para encriptar, esta clave debe ser cuadrada, 2x2, 3x3, junto con su clave privada inversa. Primero se traduce el texto plano en su equivalente numérico, teniendo en cuenta que el carácter A corresponde al número 0, el B al 1, el C al 2, etc. Una vez obtenido el texto plano numérico, se toma sus primeros n números, donde n es la dimensión de la matriz clave privada K (número de filas o columnas de la matriz), es decir, el tamaño del bloque a cifrar. Los n números obtenidos del paso anterior conforman los elementos de un vector P (bloques de 2 o 3 caracteres dependiendo la aritmética modular utilizada) de una única columna y n filas. Los elementos se colocan de forma ordenada en el vector P. Se realiza el producto de la matriz clave privada K por el vector P, obteniéndose un nuevo vector C de una única columna y n filas (bloques de 2 o 3 caracteres). Al valor de cada elemento del vector P se le aplica modulo correspondiente (26, 28 o 29). Se traduce cada elemento numérico del vector C en su carácter equivalente, teniendo en cuenta que el número 0 corresponde al carácter A, el 1 al B, el 2 al C, etc. Los caracteres obtenidos en el paso anterior corresponden al texto cifrado. Si hay más texto plano por cifrar, se comienza desde el paso 4 para volver a iterar con los siguientes n números del texto plano. 5. 6. 7. 8. Primero se calcula la matriz inversa K-1 de la matriz clave privada K. A continuación se traduce el texto cifrado en su equivalente numérico, teniendo en cuenta que el carácter A corresponde al número 0, el B al 1, el C al 2, etc. Una vez obtenido el texto cifrado numérico, se toma sus primeros n números, donde n es la dimensión de la matriz clave privada K (número de filas o columnas de la matriz), es decir, el tamaño del bloque a descifrar. Los n números obtenidos del paso anterior conforman los elementos de un vector C de una única columna y n filas. Los elementos se colocan de forma ordenada en el vector C. Se realiza el producto de la matriz K-1 por el vector C, obteniéndose un nuevo vector P de una única columna y n filas. Al valor de cada elemento del vector P se le aplica modulo correspondiente (26, 28 o 29). Se traduce cada elemento numérico del vector P en su carácter equivalente, teniendo en cuenta que el número 0 corresponde al carácter A, el 1 al B, el 2 al C, etc. Los caracteres obtenidos en el paso anterior corresponden al texto plano. Si queda texto cifrado por descifrar, se comienza desde el paso 3 para volver a iterar con los siguientes n números del texto cifrado. III. DESARROLLO El programa desarrollado está implementado en el entorno de desarrollo Python 2.7. Para ello se utiliza la interfaz de programación de aplicaciones gráfica denominada Tkinter, que está basada en la programación de ventanas típicas de Windows usadas como formularios. Memorias del “2do. Congreso Nacional de Tecnologías de la Información”, Universidad del SABES, San José Iturbide, Gto., México, 29 y 30 de Agosto del 2014. 1 Esta librería gráfica es parte de Python. Este programa esta embebido en la memoria de una tarjeta Raspberry Pi de características mencionadas en el apartado de introducción, que es compilado y ejecutado para comprobar el funcionamiento del algoritmo sobre esta tarjeta de recursos limitados. A continuación se muestran partes del código desarrollado para el método criptográfico Hill Cipher en un Sistema de Software Embebido usando una Tarjeta Raspberry Pi para la ocultación de datos. En la Figura 2, se muestra la clase principal del programa, así como la importación de las librerías necesarias para la correcta ejecución del programa. Figura 3 Función de encriptación. En la Figura 4, se muestra el código correspondiente a la función llamada DencryptMessage, la cual tiene como objetivo principal, desencriptar el mensaje encriptado en base a la clave privada inversa seleccionada. Figura 2 Clase Principal del programa. Para la función de encriptación, se desarrolló una función llamada EncryptMessage, la cual tiene como objetivo implementar el algoritmo de encriptación basado en el método de Hill Cipher, ver Figura 3. Memorias del “2do. Congreso Nacional de Tecnologías de la Información”, Universidad del SABES, San José Iturbide, Gto., México, 29 y 30 de Agosto del 2014. 1 HOLAMUNDO. Se puede observar en la Figura 5, la interfaz gráfica correspondiente a la pantalla principal, donde se ingresa los símbolos a utilizar según un alfabeto determinado, el modulo, la llave privada, separando cada renglón de la matriz por corchetes, la llave inversa de la misma forma, así como parámetros que dictan el tamaño de la llave, para culminar con el texto plano. Figura 5 Pantalla principal de la aplicación. Figura 4 Función de desencriptar. IV. RESULTADOS Primero se procede con la selección de la aritmética modular a utilizar, una vez realizado esto, se definió la simbología a utilizar para la encriptación y desencriptación del mensaje, por ejemplo: n = 26 Simbología = A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z matriz K = [17,17,5],[21,18,21],[2,2,19] matriz K-1 = [4,9,15],[15,17,6],[24,0,17] mensaje = “Hola Mundo” En base a los parámetros ingresados anteriormente, se procedió a realizar la encriptación del mensaje, obteniendo como resultado el siguiente texto en su forma encriptada: A continuación se presentan las capturas de pantalla de cada uno de los módulos de encriptación. Se puede apreciar en la parte superior de las Figuras siguientes, el historial de uso del CPU, en cada una de ellas, se encierra en un círculo de color azul el área donde se encripta y desencripta el texto, por ejemplo: “UNIVERSIDAD AUTONOMA DE QUERETARO”, así como el consumo de memoria utilizado antes de iniciar cada función. Se puede observar también el pico máximo generado durante la ejecución de cada una de las funciones. El sistema tarda aproximadamente 1.5 segundos en realizar cada una de las funciones, se pudo observar que si se ejecutaba el programa principal desde el IDLE de Python, este consumía más recursos de procesamiento, razón por la que se optó ejecutarlo desde la consola de Linux, para enfocarse, de esta forma, en el consumo de CPU. WGRSMOEXM Posteriormente se realizó la desencriptación del texto encriptado para descifrar el mensaje original, obteniendo como resultado el mensaje original sin el carácter espacio, ya que no está contemplado este carácter en la simbología, y se obtuvo la siguiente cadena de texto: Memorias del “2do. Congreso Nacional de Tecnologías de la Información”, Universidad del SABES, San José Iturbide, Gto., México, 29 y 30 de Agosto del 2014. 1 Figura 6 Módulo 26 matriz 3x3. Figura 7 Módulo 26 matriz 2x2. En la Figura 6 se muestra la prueba generada con el módulo 26 utilizando una matriz de 3x3, el proceso de encriptación utilizó un máximo de 16% del CPU, mientras que para desencriptar utilizó un 21% del CPU, ambas funciones tardaron menos de 2 segundos en generarse. En la Figura 7, se muestra el mismo ejercicio utilizando módulo 26 pero con una matriz de 2x2, se puede apreciar que la rutina de encriptación y desencriptación utilizaron un 19% del CPU, en esta prueba, el tiempo de respuesta y la utilización del CPU fueron iguales. La siguiente prueba fue realizar la encriptación del mensaje: “UNIVERSIDAD AUTONOMA DE QUERETARO”, utilizando el módulo 28 con una llave de 3x3, se puede observar que la rutina de encriptación ocupo un 16% del CPU y tardo 2 segundos en realizarse, mientras que para la desencriptación ocupo 18% del CPU y un tiempo menor de 2 segundos, ver Figura 8. Figura 8 Módulo 28 en llave de tamaño 3x3. Memorias del “2do. Congreso Nacional de Tecnologías de la Información”, Universidad del SABES, San José Iturbide, Gto., México, 29 y 30 de Agosto del 2014. 1 En la Figura 9 se muestra el mismo ejercicio utilizando el módulo 28, pero con una matriz de 2x2, se puede apreciar que la rutina de encriptación y desencriptación ocuparon un 17% y 15% del CPU respectivamente, en esta prueba el tiempo de respuesta fue de 1.5 segundos para ambas rutinas. Figura 10 Módulo 29 en llave de tamaño 3x3. Finalmente en la Figura 11 se utilizó el módulo 29 con una matriz de 2x2, en ella se puede apreciar que para la rutina de encriptación se consumió un 21% del CPU, mientras que la función de desencriptación consumió un 14% del CPU, ambas con un tiempo de respuesta de 1.5 segundos. Figura 9 Módulo 28 en llave de tamaño 2x2. La siguiente prueba fue realizada utilizando el módulo 29 con una matriz de 3x3 para el mismo mensaje utilizado en las pruebas anteriores, ver Figura 10. Se puede apreciar que la rutina de encriptación consumió un 19% del CPU, mientras que la rutina correspondiente a la desencriptación solamente consumió un 17% del CPU y de la misma forma, el tiempo de respuesta aproximado fue de 1.5 segundos en ambas rutinas. Figura 11 Módulo 29 en llave de tamaño 2x2. V. CONCLUSIONES Una vez realizadas las pruebas con el algoritmo de encriptación Hill Cipher, y teniendo en cuenta que la tarjeta Raspberry Pi aun con su limitación en procesamiento como lo son sus 512 Mb en RAM y sus 700MHz en su núcleo, obtuvimos resultados interesantes, la tarjeta Raspberry Pi Memorias del “2do. Congreso Nacional de Tecnologías de la Información”, Universidad del SABES, San José Iturbide, Gto., México, 29 y 30 de Agosto del 2014. 1 mostró un desempeño óptimo durante la encriptación y desencriptación de los diversos textos introducidos. Las pruebas realizadas nos mostraron el potencial que tiene la tarjeta aún con sus limitantes en procesamiento. Ha quedado demostrado que los algoritmos de encriptación tales como el Hill Cipher, pueden ser empleados en dispositivos embebidos similares la Raspberry Pi, y pueden ser empleados para aplicaciones más elaboradas enfocadas a brindar un sistema de encriptación portable para sistemas embebidos. También queda demostrado que las capacidades de la tarjeta Raspberry Pi son necesarias para ejecutar estas aplicaciones, las cuales tienen gran potencial para ser utilizadas en diversas áreas de investigación. En base a los resultados obtenidos en las diversas pruebas realizadas, se concluye que el utilizar el módulo 28 con una matriz de 2x2 es el método más óptimo para realizar estas funciones, ya que se comportó brindando el mejor desempeño en cuanto a rendimiento del CPU y tiempo de respuesta. Una restricción importante a considerar al trabajar en el entorno gráfico de la Raspberry Pi, es el uso de la memoria, ya que al cargar el entorno gráfico sobrecargamos aún más la memoria RAM, esto genera como consecuencias un desempeño menos óptimo para la aplicación, es por ello que se recomienda no utilizar gráficos en aplicaciones embebidas, y realizar todo mediante la consola. Lo anterior para obtener un mejor rendimiento en nuestro proceso y así se puede utilizar de forma óptima el potencial de procesamiento de la Raspberry Pi, dedicada simplemente a la realización de los cálculos correspondientes. Con este proyecto se buscó mostrar los alcances de la tarjeta Raspberry Pi en conjunto con el lenguaje de programación Python, para la implementación del algoritmo de encriptación Hill Cipher, y así poner en práctica los conocimientos adquiridos en el Álgebra Lineal y durante la fases de Mantenimiento Pruebas y Especificaciones de Software, específicamente en el software embebido y obteniendo una correlación a nivel neuronal entre la teoría y la práctica. primera-parte/ [Último acceso: 2014 Marzo 27]. A, P. D. A. P., 2009. Sistemas Embebidos y Sistemas Operativos Embebidos, Venezuela: Centro de Investigación en Comunicación y Redes (CICORE). Flores, P. S. d. J. C., 2014. Criptografía cuántica. Seguridad Cultura de prevención para TI, 1(20), p. 28. Hamissa, G. y otros, 2011. Development of secure encoder-decoder for JPEG images. Cairo, IEEE Xplorer, pp. 260 - 266. Rossum, G. v., 2009. El tutorial de Python. [En línea] Available at: http://docs.python.org.ar/tutorial/pdfs/TutorialPython2.pdf [Último acceso: 19 Marzo 2014]. Stallings, W., 2011. Cryptography and network security. Quinta edición ed. New York: Pearson. The Raspberry Pi Foundation, 2006. What is a Raspberry Pi?. [En línea] Available at: http://www.raspberrypi.org/faqs [Último acceso: 20 Marzo 2014]. Universidad Nacional Autónoma de México Facultad de Ingerniería, 2012. Fundamentos de Criptografía. [En línea] Available at: http://redyseguridad.fip.unam.mx/proyectos/criptografia/criptografia/index.php/1panorama-general/12-historia-de-la-criptografia [Último acceso: 28 Marzo 2014]. Valeiras, D. G., 2011. CryptoHill. [En línea] Available at: http://cryptohill.blogspot.mx/ [Último acceso: 31 Marzo 2014]. VI. REFERENCIAS ALEJANDRO, A. D. J., 2012. Criptografía. FI. UNAM. [En línea] Available at: http://criptounam2012.blogspot.mx/2012/10/algoritmohill.html [Último acceso: 20 Marzo 2014]. Amicelli, C., 2012. Criptografía. [En línea] Available at: http://www.mkit.com.ar/blog/criptografiaMemorias del “2do. Congreso Nacional de Tecnologías de la Información”, Universidad del SABES, San José Iturbide, Gto., México, 29 y 30 de Agosto del 2014.