En este primera Capítulo hemos presentado el contexto en el cual queda enmarcada la tesis, y hemos dejado definidos los objetivos principales de nuestro trabajo.
En el Capítulo 2 recogemos, en tres presentaciones, algunos conceptos básicos y fundamentales en el ámbito de la criptografía en el que ha quedado desarrollada la tesis. En primer lugar, tratamos sobre las condiciones para la existencia de inversos en la aritmética modular: desde un punto de vista intuitivo, o descriptivo y visual, y mediante un desarrollo más analítico del álgebra en la aritmética modular. Esa primera parte finaliza con una descripción del algoritmo RSA. Una segunda parte está dedicada a los números primos: a su localización y a su reconocimiento. En esta parte procuramos ofrecer una visión general básica de la matemática que se requiere para
Introducción 12 desarrollar los tests de primalidad. Presentamos una justificación de por qué hemos elegido finalmente el test de MILLER–RABIN. Una tercera parte de este segundo Capítulo presenta una panorámica (estado del arte) de los algoritmos de factorización, y nos centramos especialmente en el desarrollo de los algoritmos subexponenciales: CFRAC, QS y NFS.
En el Capítulo 3 presentamos una breve descripción del proceso de optimización de código. Presentamos una definición de tiempo de ejecución y mostramos diferentes vías de mejora que se pueden aplicar al objetivo de reducir ese tiempo. Mostramos las principales causas de posibles retardos en la ejecución: riesgos estructurales, de control y de datos. Y mostramos una breve descripción del funcionamiento de la memoria y de las principales técnicas que hemos utilizado para reducir los retardos y optimizar su acceso.
En el Capítulo 4 presentamos un modelo de entero largo, que hemos definido e implementado para trabajar con valores enteros de gran magnitud. En primer lugar mostramos la descripción de nuestro modelo: fundamentos matemáticos y la implementación de nuestro tipo de dato nuevo creado; también mostramos otros modelos de enteros ya existentes y disponibles. En un segundo epígrafe mostramos los operadores que hemos necesitado implementar para los procesos matemáticos de generación de aleatorios, tests de primalidad y factorización: operadores auxiliares, relacionales y a nivel de bit; y operadores aritméticos: suma, resta, producto, cociente y módulo. También hemos necesitado implementar algunas funciones sencillas como son el algoritmo de EUCLIDES para el cálculo del máximo común divisor de dos enteros; el cálculo de la parte entera de la raíz cuadrada de un entero, necesario para todo el proceso de factorización mediante la técnica de las fracciones continuas; y la potencia. Finalmente presentamos algunas implementaciones de tests de primalidad.
El Capítulo 5 queda dedicado a la presentación y descripción de los generadores de bits aleatorios. En un primer epígrafe se describe el generador de bits aleatorios por entrada de teclado, y se muestran los resultados de los diferentes tests estadísticos a que hemos sometido al generador. En un segundo epígrafe presentamos nuestra implementación del generador de secuencias de bits pseudoaleatorias basado en el algoritmo BBS. La implementación de ambos generadores queda justificada por sí misma, por su interés criptográfico; y además hemos desarrollado estos generadores por la necesidad de disponer de abundantes bits aleatorios que nos permitieran generar grandes cantidades de enteros, compuestos de dos primos aleatoriamente buscados. Al final del Capítulo recogemos unas tablas con enteros primos característicos del generador BBS, de diferentes tamaños, y señalamos también el tiempo que hemos necesitado para encontrar cada uno de esos números.
El Capítulo 6 está enteramente dedicado al algoritmo de factorización basado en el método de las fracciones continuas. En un primer epígrafe hacemos una presentación general del algoritmo, desde sus principios más básicos, y vamos presentando las diferentes mejoras que fueron surgiendo a lo largo de los años 70, destinadas todas ellas a reducir los tiempos de ejecución. En
Introducción 13 un segundo epígrafe recogemos los diferentes pasos que sigue nuestra implementación del algoritmo de factorización basado en la técnica de las fracciones continuas, y mostramos luego en una breve descripción, las funciones creadas para cada uno de esos pasos del proceso. También recogemos las estructuras de datos creadas y una relación de los parámetros que modifican el comportamiento del algoritmo. Estos parámetros pueden y deben ser estudiados en cada implementación que se realiza: en nuestro caso el proceso de factorización ha sido ejecutado repetidas veces, para distintos tamaños y diferentes valores de los parámetros; al final del capítulo traemos una expresión que muestra la relación entre el tamaño de los compuestos a factorizar y el valor óptimo de los parámetros.
El Capítulo 7 queda dedicado a la descripción del proceso de optimización. Como en ese Capítulo se describe, el código que hemos optimizado es el que se emplea en la factorización, con los algoritmos implementados y ya presentados en el Capítulo 5. La herramienta que hemos empleado en el desarrollo de nuestra trabajo es la llamada RABBIT (cfr. [Rabbit]). Primeramente recogemos un breve elenco de programas y aplicaciones, disponibles en el mercado o de libre distribución, con un también breve comentario sobre los algoritmos que emplean para la tarea de la factorización de enteros largos. A continuación, y después de una breve descripción del protocolo de actuación que hemos seguido, el Capítulo se desarrolla mostrando los avances más significativos obtenidos en cada uno de los pasos del protocolo: cambio de algoritmo; reducción de Instrucciones; técnicas para reducir instrucciones de salto, especialmente mediante el desenrollado de bucles; evitar las dependencias de datos; y optimizar los accesos a memoria. Recogemos, en un siguiente epígrafe, algunas gráficas que muestran las optimizaciones logradas en las principales funciones sobres las que hemos trabajado. Al final del Capítulo mostramos una gráfica comparativa de los tiempos empleados en la factorización de diferentes enteros compuestos, producto de dos primos de similar tamaño, realizada con nuestra aplicación antes y después de optimizar algunas de las funciones.
Por último, se recoge un breve Capítulo (el octavo) dedicado a las conclusiones de la tesis y a recoger diferentes trabajos que nos parecen de interés y en los pensamos que podríamos seguir investigando, tanto en la implementación como en la optimización de algunos algoritmos criptográficos, y en la definición del concepto de entero largo o de precisión múltiple.