Proyecto de Cátedra de Criptografía. Implementación de Algoritmos Criptográficos y de Digestión de Mensajes para ser utilizados en un Sistema de Control Escolar con Firma Digital y Verificación de Notas
MARN Experience on the Development of Notification & Alert Systems
Implementación de Algoritmos Criptográficos y de Digestión de Mensajes
1.
Resumen— El presente reporte cubre la investigación e
implementación de dos algoritmos criptográficos y uno de
digestión de mensajes para ser utilizados en un prototipo de
Sistema de cómputo que permite realizar la firma digital de
calificaciones de estudiantes por parte del docente encargado de
una asignatura y la posterior verificación de la calificación por
parte de los estudiantes de dicha asignatura desde sus dispositivos
móviles Android, con el propósito de profundizar en el
conocimiento y requerimientos de dichos algoritmos. Este
documento asume conocimiento del prototipo original del sistema.
Palabras Clave— Android, Infraestructura de llave pública,
Java, RSA, Seguridad.
I. INTRODUCCION
El presente proyecto fue desarrollado con el propósito de
profundizar en el conocimiento de los algoritmos de cifrado y
digestión de mensajes utilizados en la versión 1 del proyecto.
Originalmente el prototipo se creó utilizando la librería Bouncy
Castle como proveedor de servicios criptográficos para el
prototipo, en esta versión, se codificaron los algoritmos a partir
de las especificaciones FIPS correspondientes y en el caso de
RSA a partir del pseudocódigo del algoritmo y de los diferentes
algoritmos necesarios para calcular los pasos del algoritmo
RSA.
La arquitectura del proyecto cambia con respecto al prototipo
original debido a que se suprime la funcionalidad de OpenSSL.
Para el funcionamiento del prototipo se tienen 3 módulos:
Una aplicación Java Swing para la generación de la llave
privada del docente y almacenamiento de la llave
pública en una ubicación accesible. De momento se deja
de lado la noción de certificación de la llave pública.
Una aplicación móvil Android (compatible con API 14
o superior) que permite la consulta y verificación de la
firma digital de las notas por parte de los estudiantes.
Un conjunto de APIs Web que permiten el acceso tanto
de la aplicación swing y Android a los datos.
II. OBJETIVO DEL PROYECTO
Implementar el algoritmo AES-128, RSA y SHA256 para
utilizarlos en el prototipo de sistema de firma digital de
calificaciones.
III. ALCANCES Y LIMITACIONES
A. Alcances:
Se mantendrá la funcionalidad de firma digital del
prototipo solamente sustituyendo los servicios
criptográficos de Java anteriormente utilizados.
.
B. Limitaciones:
El formato de almacenamiento de las llaves RSA no
será implementando el estándar PKCS1.
IV. ARQUITECTURA Y DISEÑO DEL PROTOTIPO
La figura 1. Muestra la arquitectura del prototipo
desarrollado. La comunicación entre los componentes se
hace por medio de unas APIs simples desarrolladas en PHP.
Figura 1. Arquitectura del Sistema Desarrollado
La implementación de la base de datos y de las APIs de
comunicación se hizo en una instancia de Google Cloud
Compute Engine, esta instancia ejecuta Linux Ubuntu 14,
Apache Web Server y PostgreSQL 9.3.
Implementación de Algoritmos Criptográficos y de
Digestión de Mensajes para un Sistema de Control
Escolar con Firma Digital de Calificaciones y Verificación
de Firma Digital desde dispositivos Móviles
David E. Martínez
2. V. CONCEPTOS
RSA
RSA es uno de los primeros criptosistemas de llave pública y es
ampliamente utilizado en la transmisión segura de datos. Este
sistema se basa en la dificultad práctica de descomponer en
factores el producto de dos números primos grandes. Trabajar
con RSA implica el manejo y operación de números enteros
arbitrariamente grandes, generación de números enteros primos
arbitrariamente grandes, operaciones matemáticas en aritmética
modular entre otros.
SHA256
Sha256 es un algoritmo de seguridad parte de una familia de
algoritmos de seguridad descritos en la especificación FIPS180-
2. SHA256 es un algoritmo iterativo, es una función picadillo
de solo ida capaz de procesar un mensaje para producir una
forma condensada llamada digesto. Los cuatro algoritmos SHA
difieren en los bits de seguridad, el tamaño de los bloques de
mensaje y las palabras de datos que utilizan durante la digestión
de los mensajes.
AES
Estándar de Cifrado Avanzado en español, es la especificación
para el cifrado de datos electrónicos establecido por el Instituto
Nacional de Estándares de los Estados Unidos. AES está basado
en el algoritmo de cifrado Rijndael y se encuentra especificado
en la publicación FIPS197. El algoritmo Rijndael fue
originalmente diseñado para trabajar con varias longitudes de
llaves de cifrado pero el estándar contempla 3, las cuales son
128, 192 y 256. AES (Rijndael) es un algoritmo de llave
simétrica. AES se basa en las propiedades matemáticas del
campo Galois 28
.
Bits de seguridad:
Los bits de seguridad vienen dados por el espacio de llaves o la
dificultad de realizar determinadas operaciones matemáticas
como la descomposición en factores. La tabla 1 muestra una
comparación de algoritmos de llave simétrica, RSA de
diferentes longitudes y las funciones SHA.
Tabla 1. Comparación de algoritmos en términos de bits de
seguridad.
VI. IMPLEMENTACION DE LOS ALGORITMOS Y PRUEBAS
Considerando la tabla anterior de bits de seguridad decidí
implementar RSA-3072, para que los 3 algoritmos
implementados tuvieran 128 bits de seguridad. Es necesario
mencionar que este es un trabajo que requeriría revisión pues
algunos detalles de implementación podrían reducir la
seguridad del sistema en general, pero es parte del proceso de
aprendizaje.
Implementación del Algoritmo RSA
Para la implementación del algoritmo RSA se comenzó por la
implementación de las estructuras de almacenamiento de
números grandes y los algoritmos necesarios para proporcionar
la funcionalidad de operaciones matemáticas sobre dichas
estructuras, dicha implementación se basó en la publicación
“Large Integer Case Study in C++ for AP Computer Science”.
La librería generada no es precisamente una implementación
eficiente del almacenamiento de enteros grandes ni se han
incorporado los algoritmos más eficientes para algunas
operaciones, el propósito de esta librería es didáctico. En
algunos casos se tuvo dificultad en la implementación de las
operaciones o durante el proceso de pruebas se encontró
dificultad en la depuración de dichas operaciones por lo que se
implementó una conversión de tipo entre la librería creada y la
clase BigInteger de java.Math, este proceso de conversión le
resta eficiencia a la librería pero es funcional.
Los métodos implementados de forma nativa son: suma,
multiplicación, creación de enteros grandes (reserva de
almacenamiento, inverso multiplicativo modular (algoritmo
extendido de Euclides), prueba de primalidad (Miller-Rabin) y
a partir de esta prueba, generación de números primos.
Métodos implementados por medio de conversión de tipo:
división, substracción (implementación nativa no producía los
resultados correctos), exponenciación modular, máximo común
divisor, residuo.
Para la creación de números aleatorios se utilizó
Java.Security.SecureRandom, pero según la investigación
realizada, el generador de números aleatorios seguros es uno de
los pilares fundamentales de la seguridad del algoritmo por lo
que es un tema de investigación pendiente (profundizar e
implementar)
La ejecución de la generación de parámetros RSA toma
relativamente poco tiempo considerando la longitud de los
números y que la librería creada no posee optimizaciones.
SHA256
Para la implementación de SHA256 se siguió la especificación
FIPS180-2 y las pruebas se realizaron en base al hash de prueba
que aparece en dicho documento. No se tuvieron dificultades en
la implementación de este algoritmo hasta que se realizó la
integración al prototipo. Esto se describe en la sección
siguiente.
AES
La implementación del algoritmo Rijndael se hizo en base a la
especificación FIPS197, se implementó para funcionar con
llaves de 120 bits exclusivamente, es decir, no posee la
parametrización para funcionar con llaves de otras longitudes.
Para cifrar con AES se implementó el modo de operación ECB
por simplicidad. Durante las pruebas fue evidente la necesidad
de implementar otro modo de operación, pues en una prueba
cambiando un carácter se observó la independencia entre los
bloques cifrados. La figura 2 muestra una captura de pantalla
de las pruebas de cifrado y descifrado con AES.
3. Figura 2. Cambio en un carácter solo se ve reflejado en el
bloque que lo contiene.
Pruebas en el dispositivo Android
Uno de mis mayores puntos de interés era probar el
funcionamiento y rendimiento de los 3 algoritmos
implementados en el dispositivo Android. Tanto SHA256 y
AES ejecutaron sin problemas en poco tiempo, la ejecución de
la generación de parámetros RSA-3072 tomó más tiempo pero
el programa ejecutó, generó los parámetros y realizó la
operación de cifrado y descifrado. Este resultado me pareció
interesante para mencionarlo en este reporte. La figura 3
muestra la captura de pantalla de dicha prueba.
Figura 3. Ejecución de los algoritmos en un celular Android.
Se observa el trabajo del Garbage Collector de Android y el
resultado de cifrar un número pequeño utilizando los
parámetros generados en ese momento.
VII. INTEGRACIÓN DE LOS ALGORITMOS AL PROTOTIPO 1
Para la integración al prototipo, se hicieron varios cambios que
pareciera le restaron funcionalidad con respecto al prototipo
original, sin embargo con trabajo adicional e investigación se
puede alcanzar y mejorar la funcionalidad original.
Se cambió el gestor de bases de datos de MySQL a PostgreSQL,
también las estructuras de las tablas cambiaron con respecto al
prototipo original y los tipos de datos.
La funcionalidad de login se suprimió y el programa ejecuta con
parámetros fijos para el docente y estudiante, pues el
mecanismo de login se espera rediseñar.
Igual que el prototipo 1, una aplicación swing permite la
generación de parámetros RSA y su almacenamiento. La llave
privada se almacena en el disco local y se cifra con AES y la
llave pública se almacena en la base de datos, en el registro del
docente. Para la generación de la llave AES se utilizó SHA256,
solicitando una contraseña al usuario, la cual se ingresa a
SHA256, el hash obtenido se ingresa nuevamente a SHA256 y
luego se hace un XOR entre el byte 1 y el 16 para obtener una
llave de 128 bits.
Durante la prueba de firma digital de calificaciones y
verificación de la firma en el dispositivo Android encontré un
problema en mi implementación de SHA256 en que luego de
una ejecución de SHA256 no se inicializaba nuevamente el
hash inicial (H0) para ejecuciones posteriores.
Las figuras 4 y 5 muestran la aplicación swing y la aplicación
Android en ejecución.
Figura 4. Aplicación Java Swing. Generación de llaves RSA y
Firma Digital de Calificaciones.
Figura 5. Verificación de Firma Digital en Android.
4. La firma digital se almacena y se representa como una cadena
de texto de la representación hexadecimal. En el prototipo 1 se
utilizó la cadena en codificación base 64.
VIII. CONCLUSIONES
Conocer e implementar estos algoritmos fue sumamente
interesante. Luego de estudiar estos algoritmos puedo decir que
el esfuerzo valió la pena, uno queda invitado a estudiar más
sobre el tema.
El desarrollo actual permite pasar a otros puntos de interés, por
ejemplo implementar confidencialidad en la base de datos,
ahora que ya se encuentra en la nube.
IX. BIBLIOGRAFÍA
Large Integer Case Study in C++ for AP Computer Science
http://apcentral.collegeboard.com/apc/public/repository/ap01.p
df.lr_7928.pdf
RSA (cryptosystem)
http://en.wikipedia.org/wiki/RSA_%28cryptosystem%29
FIPS180-2 Secure Hash Algorithms
http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
FIPS197 Advanced Encription Standar
http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf