a) EL DIRECTOR DEL PROYECTO. (poner el nombre del Director del Proyecto)

Implementación de una API Java de Criptografía RSA Autorizada la entrega del proyecto del alumno/a (poner el nombre del alumno/a) …………………………………………………

9 downloads 213 Views 756KB Size

Recommend Stories


s del proyecto. Director Co-Director
REPUBLICA DE COLOMBIA DEPARTAMENTO DEL MAGDALENA ALCALDIA MUNICIPAL DE TENERIFE FORMULARIO PARA LA PRESENTACION DE PROYECTOS PRODUCTIVOS 1. PRESENT

Nombre del proyecto:
UTEQ Firmado digitalmente por UTEQ Nombre de reconocimiento (DN): cn=UTEQ, o=UTEQ, ou=UTEQ, [email protected], c=MX Fecha: 2015.05.26 14:10:3

Del Escritorio del Director
Verano 2016 Del Escritorio del Director Fechas Importantes: !Feliz Verano! Es un honor y privilegio servir como el nuevo director de la Middle Scho

Story Transcript

Implementación de una API Java de Criptografía RSA

Autorizada la entrega del proyecto del alumno/a (poner el nombre del alumno/a) …………………………………………………….

EL DIRECTOR DEL PROYECTO (poner el nombre del Director del Proyecto)

Fdo: ………………………….. Fecha ….../….../…...

Vº Bº del Coordinador de Proyectos (poner el nombre del Coordinador de Proyectos)

Fdo: ………………………….. Fecha ….../….../…...

I

Implementación de una API Java de Criptografía RSA

UNIVERSIDAD PONTIFICIA COMILLAS ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI) INGENIERO EN INFORMÁTICA

PROYECTO FIN DE CARRERA

IMPLEMENTACIÓN DE UNA API JAVA DE CRIPTOGRAFÍA RSA

AUTOR: Javier Ruiz de Ojeda Fernández MADRID, Septiembre de 2007

II

Implementación de una API Java de Criptografía RSA

Agradecimientos

A mi familia, que se ha sacrificado siempre para invertir en mi educación, consiguiendo que yo pudiera llegar a ser la persona que soy hoy. A los profesorados de las instituciones que me han acogido (Kensington School, ETSI ICAI, NJIT), porque no se han contentado con enseñarme los contenidos de los temarios, sino que además me han formado como persona. A todos los compañeros y amigos que han dejado su huella en mí, porque sin ellos esta travesía en busca de aprendizaje no habría sido una lección en sí misma.

A todos, gracias por poner a mis lados las vallas que, permitiéndome observar el mundo exterior, se han encargado de mantenerme a mí dentro del camino, y al resto de los peligros y tentaciones fuera de él.

III

Implementación de una API Java de Criptografía RSA

Resumen del Proyecto

Desde hace más de 2000 años, la criptografía ha caminado de la mano del hombre, y desde las campañas romanas hasta la Segunda Guerra Mundial, se ha encargado de determinar los vencedores y los vencidos. Poder disponer de un sistema que permita enviar un mensaje que sólo pudiera ser leído por el destinatario objetivo ha sido y sigue siendo una necesidad crucial. La ciencia de la criptografía presenta múltiples problemas, pero por ser un sistema destinado a usarse por unos pocos, siempre se han podido paliar con soluciones rudimentarias y poco creativas. Sin embargo el mundo en el que vivimos hoy, la ‘Era de la Información’, lleva todos estos problemas a una nueva dimensión, y por tanto requiere soluciones innovadoras y revolucionarias en campos tan modernos como la informática, y tan antiguos como las matemáticas. Este proyecto pretende explicar los avances criptográficos de la última mitad del siglo XX, y plasmarlos en una implementación al alcance de todos, que permita un uso fácil de la criptografía en nuestras comunicaciones. Para ello proveerá una serie de funciones que faciliten el cifrado de información para su viaje por canales no seguros, así como algunas aplicaciones de ejemplo.

IV

Implementación de una API Java de Criptografía RSA

El desarrollo de software conoce muchas metodologías, y es difícil que ningún proyecto, alcanzada una determinada envergadura, se ciña solamente por una de ellas. Así, para la consecución de este proyecto, se ha empleado una mezcla de varias. La metodología que ha gobernado todas las demás ha sido algo que aprendí estudiando en Estados Unidos, y que los americanos llaman ‘scrum’. El término deriva del mundo del deporte, en particular del fútbol americano, y pretende describir el proceso por el cual los jugadores se reúnen constantemente para analizar la situación, y seleccionar la estrategia adecuada a seguir hasta la próxima reunión. Se trata, pues, de una versión extrema del modelo en espiral (que pretendía solucionar los problemas ocasionados por la rigidez del modelo en cascada), en la que es difícil definir objetivos o prever problemas a largo plazo. La mayor fortaleza de esta metodología reside en que, dado el número de revisiones realizadas del proceso del proyecto, el avance de este es bastante rápido y optimizado, ya que en cada momento sólo se centra en las cuestiones pertinentes. La otra gran ventaja respecto a modelos tradicionales es la rapidez con la que empieza a generar resultados que, si bien en un principio no son ni de lejos los apropiados, permiten tener desde el principio una base sobre la que trabajar, incluso aunque se trate de un sistema nuevo.

V

Implementación de una API Java de Criptografía RSA

Al finalizar el proyecto, se dispondrá de una API Java que permita el cifrado y descifrado de texto, de manera que sólo pueda ser leído por sus destinatarios. Además se presentarán dos aplicaciones de demostración. Las características del proyecto serán las siguientes. La longitud del mensaje no influye en la aplicación, ya que la encriptación se realiza por bloques. La complejidad matemática de la criptografía empleada se mantendrá oculta del usuario, que podrá cifrar y descifrar mensajes con transparencia. Las claves empleadas serán distintas para comunicación, para aumentar la seguridad. A su vez, un usuario no podrá utilizar su juego de claves para descifrar mensajes de otros usuarios. El estándar criptográfico empleado es RSA, por ser el algoritmo matemático de encriptación más potente en la actualidad, y por tratarse de un estándar de criptografía de clave pública y asimétrica (ambas cualidades y su importancia serán explicadas más adelante). El código será público, con lo que cualquiera podrá utilizarlo o modificarlo para su uso particular.

VI

Implementación de una API Java de Criptografía RSA

Abstract

For more than 200 years cryptography and man have walked together, and from the first Roman campaigns to the Second World War, it has determined success. A system that allows sending a message only readable by its intended receiver has been and still is a crucial need. The science of cryptography has, however, many flaws, and generates many problems. Traditionally, these could be solved in rudimentary ways, for cryptography was only intended for a small group of people. But, in today’s world, the ‘Information Age’, all these problems acquire a new dimension, and thus require new and revolutionary solutions that reside in fields as modern as programming, and as old as math. This project will try to explain the cryptographic advances since the middle 20th century, and implement them in a way that is easy for anyone to use, allowing a simple use of cryptography in our communications. With this in mind, it shall provide a series of functions that enable the encryption of information so it can travel through an open channel. There are many methodologies in software engineering, and it is complicated for any considerable project to use any single one of them. Thus, a mixture of several has been used in this one.

VII

Implementación de una API Java de Criptografía RSA

The methodology that has governed the rest is one I learned while studying abroad in the US, something they call ‘scrum’. The word comes from the world of sports, football in particular, and attempts to describe the process in which the players will gather once and again to analyze the situation and choose the appropriate strategy to use until the next gathering. It is, therefore, an extreme version of the spiral model (which solved many of the problems caused by the strictness of the waterfall model), where it is difficult to define goals or predict problems long-term. The greatness of this methodology is that, because of the amount of revisions the project suffers, it progresses quite fast, since it only focuses in the questions at hand. The other great advantage is how fast it starts generating results, as opposed to other traditional methodologies. These results might not be the correct ones at first, but they provide a base which we can build upon, even when we are creating a new system. By the end of the project, a Java library will be available that will enable the encryption and decryption of messages sent between processes, so that only their intended readers can access them. The project specifications are the following. The length of the message does not affect the application, since the encryption will happen in blocks.

VIII

Implementación de una API Java de Criptografía RSA

The mathematical complexity of the existing cryptography will be hidden from the user, who can encrypt and decrypt messages transparently. The keys will vary from use to use, making it more difficult for an eavesdropper to break them. Also, one user will not be able to use his/her set of keys to decrypt another user’s information. The cryptography used will be RSA, since it is the most powerful mathematical system available, and because it is an asymmetric, public key system (both these concepts will be further explained). The code will be public, so anyone can use it or modify it for their particular use.

IX

Implementación de una API Java de Criptografía RSA

Índice 1 Introducción                1.1 Introducción Histórica          1.2 Introducción al Proyecto          2 Estado del Arte                2.1 TCP/IP                2.2 RSA                2.3 PGP                2.4 SSL                 2.5 Criptografía Cuántica          3 Metodología y Tecnología            4 Identificación de Necesidades            4.1 Objetivos del Sistema            4.2Alcance de la Aplicación            4.3 Tipología de Usuario            4.4 Restricciones            4.5 Organización            4.6 Antecedentes            5 Análisis de Requisitos            6 Estudio de la Arquitectura            7 Diseño                  7.1 Estructura de la API RSA            7.2 Estructura de la Aplicación Cliente/Servidor      7.3 Estructura de la Aplicación de Cifrado de Ficheros  8 Programación y Pruebas              8.1 API RSA                8.2 Aplicación Cliente/Servidor          8.3 Aplicación de Cifrado de Ficheros      9 Desarrollos Futuros               9.1 Comunicación Bilateral entre Cliente y Servidor     9.2 Ficheros de Distintos Tipos          9.3 Contraseñas para el Cifrado de Ficheros     9.4 Nuevas Aplicaciones          10 Planificación del Proyecto           11 Valoración Económica            12 Conclusiones              13 Bibliografía                 13.1 Internet                13.2 Libros             

X

                                                                           

                                                                           

1  1  8  9  11  12  14  15  16  19  22  22  24  25  26  26  27  28  33  34  34  37  39  41  42  44  46  49  51  52  53  55  56  58  60  62  62  62 

Implementación de una API Java de Criptografía RSA

ANEXOS                Anexo A: Manual del Usuario            A.1 Requerimientos del Sistema          A.2 Uso de la API RSA             A.3 Uso de la Aplicación Cliente/Servidor        A.4 Uso de la Aplicación para el cifrado de Ficheros    A.5 Futuras Aplicaciones                                                   

XI

             

             

63  63  63  65  67  73  75 

Implementación de una API Java de Criptografía RSA

1 Introducción

1.1 Introducción Histórica Hasta la llegada de la Segunda Guerra Mundial, y desde hace dos milenios, la historia de la criptografía se ha desarrollado relativamente despacio. La inmensa mayoría de los sistemas criptográficos se basan en dos operaciones, la de transposición (alterar o intercambiar las posiciones de los elementos) y la de sustitución (cambiar unos elementos por otros). La creación de un nuevo sistema criptográfico consiste, pues, en escoger un nuevo algoritmo, o definir una nueva función de cambio. Con la llegada de la Segunda Guerra Mundial, nació Colossus, la primera máquina programable de la historia, el primer ordenador. Por tratarse de un invento relacionado con el espionaje (sirvió para romper los códigos alemanes, y para ganar la guerra), sus especificaciones fueron destruidas. En 1945 apareció ENIAC, y con él el primer ordenador que los gobiernos y las empresas pudieron utilizar. La llegada a la tecnología y a la ciencia de los ordenadores supuso una oportunidad revolucionaria en el mundo de la criptografía, y permitió que aparecieran nuevos algoritmos exponencialmente más complejos, hasta el punto que la Agencia de Seguridad Nacional norteamericana tuvo que imponer restricciones al tamaño de las claves para

1

Implementación de una API Java de Criptografía RSA

seguir poder accediendo a los contenidos de los mensajes cifrados que circulaban por el mundo. Sin embargo, esto provocó también otros cambios en la concepción de la criptografía, y es que ahora ya no era usada sólo para fines militares, sino que surgió un nuevo mercado para ella. Con la llegada de las comunicaciones a escala masiva, los bancos y muchas otras empresas se abrieron a las transacciones económicas por internet. Secretos que valían millones empezaron a circular por canales abiertos, donde cualquiera podía acceder a ellos, salvo que estuvieran cifrados. Pero con esta explosión, algo que hasta entonces había sido una pequeña falta pobremente remediada de la criptografía, pasó a ser su mayor vulnerabilidad: la transmisión de claves. Metafóricamente, la criptografía equivale a meter un mensaje en una caja metálica, y sellarla con un candado. El problema es que la llave del candado también ha de llegar a manos del receptor, y debe viajar abiertamente (si lo hiciera dentro de otra caja sellada, esta también necesitaría una llave y entraríamos en una recursión infinita). La solución hasta la fecha era que las personas que deseaban comunicarse tenían que encontrarse para intercambiar estas claves, o contratar a gente que se dedicara a distribuirlas. La primera solución deja de ser eficaz cuando debes generar transacciones con miles de clientes, y la segunda corre el riesgo de que la persona contratada sea interceptada. Durante muchos años, se pensó que el problema del envío de

2

Implementación de una API Java de Criptografía RSA

claves no tenía solución, incluso llegó a considerarse un axioma de la criptografía. Sin embargo, la criptografía ya no sólo pertenecía a los militares, sino al mundo, y ahora la capacidad de pensamiento era mucho mayor, además de admitir ideas más radicales e innovadoras. El equipo compuesto por Diffie, Hellman y Merkle fue el primero en desafiar el axioma arriba mencionado, con la siguiente idea. Imaginemos que Alice y Bob (los nombres comúnmente empleados para referirse a dos personas que desean comunicarse en secreto) desean comunicarse sin que nadie pueda leer su mensaje. Alice puede introducir su mensaje en una caja, y cerrarla con su candado, mandándosela a Bob. Al recibirla este, añade al cerrojo un segundo candado, del que sólo él tiene la llave, y se la vuelve a enviar a Alice. Alice, al recibirla, retira su candado con su llave, y se la envía de nuevo a Bob. Ahora la caja sólo lleva el candado que le puso Bob, y él puede quitarlo, revelando el mensaje. Esta idea demuestra que un mensaje puede viajar sin ser revelado, y lo que es más importante, sin intercambio de claves. Esta idea es considerada la mayor contribución al mundo de la criptografía de la historia. Pasaron

algunos

años

antes

de

que

se

pudiera

formalizar

matemáticamente esta idea. El problema residía en que las funciones matemáticas comunes son de dos sentidos. Si por ejemplo elijo una función

3

Implementación de una API Java de Criptografía RSA

que multiplique por dos, el receptor del mensaje tendrá que dividir por dos para recuperar su mensaje, lo cual es fácil y simple. El problema es que cualquiera que vea el mensaje, podría hacer lo mismo, ya que la función siempre es pública, y por tanto la cifra no es segura. Lo ideal sería encontrar una función matemática que funcionase sólo en un sentido, que no fuera reversible. Aquí entra en juego la aritmética modular. La aritmética modular es la que rige por ejemplo el funcionamiento de un reloj (en este caso el módulo sería 12). Las horas avanzan hasta llegar al último número, y entonces vuelven al primero. Si son las 10 de la mañana, y tenemos una reunión en 5 horas, no decimos que la reunión sea a las 15, sino a las 3. En aritmética convencional, si tomábamos 33 obteníamos 27. Y si conocíamos la función criptográfica (en este caso 3x), no nos habría sido difícil deducir que la clave era 3. Sin embargo, en aritmética modular, si seguimos tomando 12 como módulo, 33 = 3 (mod 12), o lo que es lo mismo, 12 + 12 + 3. La ventaja de esta función es que si vemos 3 (mod 12), la única manera de saber que x = 3 es probar todas las x posibles entre 1 y 12, hasta dar con la adecuada. Naturalmente, en este ejemplo explicativo, incluso disponiendo sólo de un papel y un lápiz, tardaríamos apenas un par de minutos, pero si el tamaño de la clave crece, esta tarea pasaría a ser desproporcionadamente grande, incluso disponiendo de un ordenador.

4

Implementación de una API Java de Criptografía RSA

Así pues, este primer sistema criptográfico de clave pública consistía en lo siguiente. La función criptográfica se define como 7x (mod 11), y se hace pública, para que Alice y Bob puedan saberla. Si Eve, una tercera persona interesada en interceptar el mensaje, ve esta función, aún no puede saber cuál va a ser la clave empleada por ellos para la comunicación. Ahora Alice elige un número secreto para ella, por ejemplo el 3, lo aplica a la función (73 = 2 (mod 11)), y envía el resultado (2) a Bob. Bob hace lo mismo, escogiendo por ejemplo el 6 (76 = 4 (mod 11)), y le envía su resultado (4) a Alice. Ahora Alice coge el 4 que ha recibido, y lo eleva a su número secreto (43 = 9 (mod 11)), y Bob hace lo mismo con el 2 que ha recibido (26 = 9 (mod 11)). Los dos han obtenido el 9 como resultado, esta es la clave que compartirán. Y Eve nunca ha visto este número, ni ninguno que pueda llevarla a deducir cómo obtenerlo. De nuevo, lógicamente, parece un problema trivial, pero deja de serlo al utilizar números de gran tamaño. La criptografía había entrado en una nueva época, donde dos personas podías comunicarse en secreto sin llegar a conocerse, pero aún quedaba un pequeño problema por resolver. Ahora mismo hacía falta enviar varios mensajes para poder llegar a tener una clave. La situación ideal es que se pudieran enviar los mensajes sin requerir que las dos personas estuvieran conectadas simultáneamente. Para ello se diseñó un nuevo sistema, llamado de clave asimétrica, y basado nuevamente en la analogía de las cajas y los candados. En este caso, la idea es que Alice cree múltiples candados, todos

5

Implementación de una API Java de Criptografía RSA

los cuales pueden abrirse con una misma llave, que se quedará Alice. Ahora coge sus candados y los envía a las oficinas postales del mundo. De esta manera, si Bob quiere comunicarse con ella, no tiene más que ir a la oficina postal más cercana y pedir un ‘candado modelo Alice’. Luego cierra su caja con él, y se lo envía a ella. Cuando Alice lo recibe, lo abre con su llave, y de nuevo el mensaje ha viajado con seguridad. Sin embargo, una vez más la teoría era más simple que la práctica, y buscar un sistema matemático que solucionara esto tardó algún tiempo. En este caso fue otro equipo, el compuesto por Rivest, Shamir y Adleman, del Instituto Tecnológico de Massachusetts, quien obtuvo la respuesta. Ellos fueron los que dieron con una función matemática de un sentido, basada en la aritmética modular, y que hacía uso de números primos de gran tamaño. Así nació la criptografía RSA (las siglas de sus inventores). Para obtener las claves, Alice (receptora de los mensajes), debería escoger dos números primos, y multiplicarlos, obteniendo un número N. La ventaja de este método es que no importa lo grandes que sean los primos, para Alice es cuestión de segundos obtener N (la clave pública). Sin embargo, para un intruso, saber qué dos números son los factores de N (recordemos que por ser primos, N sólo tendrá como factores a estos números, y a ningún otro) es algo virtualmente imposible. La factorización es uno de los problemas matemáticos más complejos de la historia, incluso hay quien afirma que no

6

Implementación de una API Java de Criptografía RSA

existe un método capaz de dar con estos números primos en un tiempo que no sea O(√N). Mientras esto siga así, la encriptación RSA seguirá siendo segura (ver referencia L01). En este apartado, por tratarse de una introducción, no se describirá la teoría matemática detrás de la criptografía RSA, sino que será descrita más adelante.

7

Implementación de una API Java de Criptografía RSA

1.2 Introducción al Proyecto Hoy en día las comunicaciones a través de canales abiertos (teléfono, bluetooth, VoIP, Internet…) están a la orden del día. Desgraciadamente, existen muchas maneras en las que alguien interesado podría acceder a ellas. Muchas de estas comunicaciones, además, contienen información valiosa, como datos bancarios, movimientos industriales, información personal… En resumen, información que en manos de las personas equivocadas puede ocasionar muchos problemas. Internet ofrece muchas maneras de proteger estos datos, pero muy pocas son capaces de detener a un intruso con el conocimiento o la dedicación necesarios. Este proyecto pretende implementar una serie de herramientas que permitan a sus usuarios obtener los beneficios de la criptografía RSA, pudiendo enviar información cifrada entre procesos, y descifrarla posteriormente. La principal ventaja de esta implementación es que pone al alcance de los programadores una tecnología que tiene una base matemática que en ocasiones resulta compleja de comprender. Gracias a ella, las matemáticas quedan ocultas al programador, que puede comunicar sus procesos de forma transparente, sin ser necesariamente consciente de cómo esa encriptación está sucediendo.

8

Implementación de una API Java de Criptografía RSA

2 Estado del Arte

Internet es, hoy por hoy, un medio extremadamente inseguro. El hecho de que la mayoría de las redes que lo componen sean Ethernet o inalámbricas supone que siempre que un mensaje es emitido, este es distribuido a multitud de máquinas en su camino hasta el receptor. En general, estas máquinas están preparadas para ignorar los mensajes que no las incluyan como destinatarios, pero es peligrosamente sencillo configurar un ordenador para recuperar estos mensajes. A continuación veremos algunos de los sistemas criptográficos más empleados hoy en día. Se tratarán los medios más populares hoy en día sobre los que se basa la criptografía. En primer lugar veremos el protocolo TCP/IP, el más extendido en Internet por el momento, y sobre el que se basan la mayoría de las comunicaciones, así como sus características de cara a proteger la información. Además, se explicará con detalle el algoritmo de cifrado RSA, aportándose la notación y explicaciones necesarias para comprender su funcionamiento, así como el de las aplicaciones desarrolladas en este proyecto.

9

Implementación de una API Java de Criptografía RSA

Por otra parte, se describirán PGP y SSL, dos de las implementaciones criptográficas más extendidas hoy en día, y veremos que de hecho se basan en principios similares a la criptografía RSA, o incluso hacen uso de ella. Por último, nos adentraremos en un presente que se diría que es ficticio, y en las posibilidades que nos brinda de cara a un futuro que ya podría estar aquí. Veremos cómo la llegada de la criptografía cuántica, hasta hace unos meses sólo una teoría, comienza a dar sus frutos, y a mostrarnos que la criptografía perfecta puede, de hecho existir.

10

Implementación de una API Java de Criptografía RSA

2.1 TCP/IP El protocolo preferido en Internet, TCP/IP, ha ido evolucionando desde su inicio hasta convertirse en un protocolo con un compromiso bastante eficiente entre fiabilidad y latencia. IP se encarga de distribuir los datos por la red, y TCP aporta los matices de fiabilidad necesarios (puesto que se asegura de que los paquetes sean correctos, no se pierdan, y si se pierden vuelvan a ser transmitidos). Desgraciadamente, este protocolo viaja sin cifrar, lo cual significa que cualquiera que se encuentre en alguna de las redes atravesadas por un mensaje puede acceder a su contenido. El envío de mensajes a través de TCP/IP parece, por tanto, una opción pobre a la hora de buscar privacidad en las comunicaciones, si bien por ser el protocolo más común en Internet, tendrá que servir de base para las comunicaciones que realicemos.

11

Implementación de una API Java de Criptografía RSA

2.2 RSA Ya hemos hablado en la Introducción Histórica de la evolución de la criptografía RSA. Aquí se detalla su funcionamiento, así como la notación que utilizaremos de ahora en adelante para referirnos a los diversos elementos que intervienen en ella. Como adelantábamos, Alice (la receptora de los mensajes), debe escoger las claves. Para ello, primero elegirá dos números primos, a ser posible de tamaño considerable. Estos números primos se llamarán p y q. Una vez elegidos, se debe obtener su producto, N. Además, se deben hallar dos enteros con características especiales. El primero, z, debe ser tal que z = (p1)*(q-1). El segundo número es e que ha de ser primo relativo a z, es decir que su MCD sea 1. El conjunto de N y e pasa a ser la clave pública de Alice. Finalmente se hallará d, la clave privada de Alice. Aquí es donde entra en juego la función de un solo sentido que hace que RSA funcione. El número d debe ser el inverso modular de e, en módulo N (d = e-1(mod N)). Para ver cómo funciona esto, repasemos qué es un inverso. En aritmética normal, el inverso de un número es aquel que, multiplicado por el número, da como resultado la unidad. Lo mismo ocurre en aritmética modular, aunque los resultados puedan ser poco intuitivos. Si pretendemos hallar el inverso modular de 2 en módulo 7, debemos encontrar un número x tal que 2 * x = 1 (mod 7). En este caso, la solución sería 4, ya que 2*4 = 8 = 1 (mod 7).

12

Implementación de una API Java de Criptografía RSA

La ventaja de la inversión modular es que, como ya hemos dicho, se trata de una función de un solo sentido. En aritmética normal, dado un inverso, es fácil saber de qué número es inverso. Si me preguntan de qué número es inverso el 0.5, la respuesta es 2, ya que 2 * 0.5 = 1. Esto se obtiene aplicando la función inversa, es decir: 1/0.5 = 2. En inversión modular, no existe la función inversa, haciendo que la clave sea genuinamente secreta. Si quisiéramos saber de qué número es inverso modular el 4 (en el ejemplo anterior), no tendríamos más remedio que probar con el todos los número hasta dar con uno que, multiplicado por 4, nos de cómo resultado 1 (mod 7). De nuevo, los resultados parecen poco impresionantes, pero debemos recordar que el uso de ordenadores cada vez más potentes permite la creación de claves que en ocasiones llegan a ser verdaderamente inexpugnables. La carrera criptográfica entre quienes buscan obtener mensajes más seguros y quienes buscan romper las claves para descifrar esos mensajes se reduce, en el caso de RSA, a un grupo de gente que busca primos más grandes, y otro grupo de gente que busca mayor poder computacional para probar todas las diferentes posibilidades. Por suerte para los criptógrafos, cuando sus enemigos obtienen mayor poder computacional, ellos también se ven beneficiados, ya que la búsqueda de claves es exponencialmente más sencilla que su descifrado. Esto significa que, a medida que avanza el tiempo, las claves se vuelven cada vez más difíciles de romper, en lugar de al revés (ver referencia L02).

13

Implementación de una API Java de Criptografía RSA

2.3 PGP PGP (las siglas de ‘Pretty Good Privacy’, o ‘privacidad bastante buena’) es otro estándar criptográfico creado por Philip Zimmermann, y que como RSA tiene por función el cifrado de mensajes o textos. Está comenzando a ser bastante popular debido en parte a sus implementaciones en código abierto, como OpenPGP. Algunas de sus mayores ventajas son la posibilidad de cifrar archivos en un ordenador además de comunicaciones, o el uso de un algoritmo de compresión antes del cifrado, para reducir el tamaño del mensaje o texto (ver referencias W01 y W02).

14

Implementación de una API Java de Criptografía RSA

2.4 SSL SSL (Secure Sockets Layer) es un estándar de seguridad que permite el envío de mensajes privados entre nodos de una red. En general, su proceso consta de tres fases. En la primera fase se decide qué algoritmo de encriptación se empleará para la comunicación (recordemos que SSL, al igual que PGP son estándares criptográficos,

mientras

que

RSA

es

realmente

un

algoritmo).

La

implementación actual ofrece las siguientes opciones. En criptografía de clave pública están disponibles los algoritmos RSA, Diffie-Hellman (ambos descritos anteriormente), DSA y Fortezza. Además nos permitirá elegir algoritmos de otras categorías como el cifrado simétrico, o una serie de funciones hash. En la segunda fase se intercambian las claves, y en la tercera se procede al intercambio de mensajes cifrados. La característica principal de SSL es que nos permite crear túneles seguros de comunicación hasta el punto en que una red completa pueda estar tunelada, dando lugar a una Red Privada Virtual, o VPN (ver referencia W01).

15

Implementación de una API Java de Criptografía RSA

2.5 Criptografía Cuántica Parece que nos encontramos en una época dorada de la criptografía, en la que si nos esforzamos un poco podemos tener una privacidad prácticamente total en nuestras comunicaciones a través de canales abiertos. Según Zimmerman, “Todos los ordenadores del mundo trabajando en paralelo tardarían 12 millones de veces la edad del Universo en descifrar un mensaje cifrado correctamente con PGP”. Sin embargo, la historia nos demuestra que los sistemas criptográficos suelen tener algún fallo escondido que las termina haciendo vulnerables. Por tanto, debemos mantener siempre un ojo en los descubrimientos presentes y futuros (ver referencia L01). La manera más fácil de descifrar mensajes correctamente cifrados es hacer uso de un ‘atajo’, o un ‘hack’ (haciendo uso del auténtico significado del término, que es descubrir cómo funciona algo para poder modificar alguna de sus características para obtener un mejor rendimiento) que se aproveche de alguna de las facetas no matemáticas de la encriptación. Un virus, troyano, puerta trasera… instalado en el ordenador de Alice haría que todos los mensajes cifrados que le lleguen puedan ser leídos por un intruso. Sin embargo, eso no es una solución elegante (aunque sí resulte eficaz), de hecho ni siquiera está en el campo del criptoanálisis (ciencia que se dedica a descifrar los mensajes cifrados mediante criptografía). Un criptoanalista intentaría en primer lugar buscar un error en el algoritmo (como ocurrió en el

16

Implementación de una API Java de Criptografía RSA

caso de Enigma, o en el de la más reciente encriptación WEP). Desgraciadamente, el problema de factorización (obtener los factores de un número) sigue sin haber sido resuelto, hasta el punto que hay matemáticos que sostienen que seguramente no tenga solución. Quedaría aún una tercera manera para intentar romper RSA, que es contemplada en estos momentos la piedra angular de la criptografía (los documentos y comunicaciones más secretos del mundo siguen siendo cifrados con ella). Si ocurriera una revolución tecnológica equivalente al nacimiento del ordenador, y que aumente la potencia de cálculo en la medida en que el ordenador lo hizo, sería concebible que un ataque de fuerza bruta sobre un mensaje cifrado con RSA pudiera obtener la solución en un margen de tiempo más cómodo, de horas o incluso minutos. Aquí entra en juego la cuántica. Un ordenador cuántico es a un superordenador actual lo que éste es a un ábaco estropeado. Sería capaz de realizar operaciones tan complejas en tan poco tiempo que desestabilizaría el concepto de privacidad. Un gobierno que pudiera contar con él tendría total control de las comunicaciones en el mundo. Y sin embargo, la teoría cuántica, que es la que amenaza con pulverizar la criptografía como la conocemos, trae otras posibilidades. Los criptógrafos parecen vislumbrar en la criptografía cuántica un nuevo sistema criptográfico que sea perfecto, completamente privado, y eterno. Esto se debe a que se

17

Implementación de una API Java de Criptografía RSA

basaría en propiedades físicas, inamovibles, en lugar de en teorías matemáticas, que suelen ser desbancadas por otras más modernas. Un ejemplo de criptografía cuántica (realizado en laboratorios en los últimos meses) sería utilizar como clave un fotón. El principio de incertidumbre de Heisenberg nos dice que al observar una partícula se altera inevitablemente su estado. Esto significa que siempre que un intruso accediera a nuestro fotón, este quedaría inservible, y el receptor sabría que la clave es inservible, pudiendo simplemente pedir una nueva. Esto plantea, naturalmente, nuevos problemas. Por ejemplo, parece difícil este envío de fotones, ya que la fibra óptica suele necesitar de elementos intermedios aproximadamente cada 10 kilómetros. Estos elementos (una nueva generación de encaminadores) deberían ser capaces de leer el fotón, interpretarlo, asegurarse de que su valor es correcto, y emitir otro igual hacia el siguiente nodo. En cualquier caso, y en vista de los acontecimientos recientes, parece que nos encontramos en una época privilegiada para la criptografía y el criptoanálisis, aunque sólo sea por la cantidad de avances (algunos parecen de ciencia-ficción) que se están produciendo en estos exactos momentos.

18

Impleme entación de una u API Java a de Criptogrrafía RSA

3 Mettodolo ogía y Tecno ología

Por no haber disspuesto de e todo el año para realizar e el proyecto o, he dispuesto de un margen n de tiemp po algo re educido, lo o cual me ha obliga ado a adop ptar una metodologí m ía agresiva a. De hech ho, he em mpleado un na metodología que aprendí durante d mi estancia en Estado os Unidos, realizand do un proy yecto para a una empresa. Dich ha metodología recib be el nomb bre de ‘scru um’, que es e un térm mino americcano proce edente del mundo de el deporte, como tanttos otros de los que utilizan, y que se usa para den nominar ca ada una de e las peque eñas reuniones que tienen loss jugadore es de un equipo de e fútbol am mericano entre juga adas. Resu ulta una metáfora m pe erfecta parra la metod dología, pu uesto que la idea es s que en cada c reunió ón se analiiza lo que se ha avanzado dessde la últim ma reunión, qué prob blemas han surgido,, el estado o del proy yecto, y cuál c será lla estrateg gia a segu uir hasta la a próxima reunión. r

19

Implementación de una API Java de Criptografía RSA

En mi caso, por ser un proyecto personal, no se puede decir que haya tenido reuniones, pero sí que he dedicado muchos momentos a hacer recopilación de lo completado, a tratar los problemas que han surgido, y ponerme plazos, y a decidir qué hacer en cada momento, o qué partes del proyecto requerirían mayor atención. Se trata, pues, de una versión muy agresiva de la metodología en espiral o evolutiva, aunque resulta mucho más eficiente en condiciones de recursos (en este caso el tiempo) reducidos. La mayor ventaja que ofrece es no desperdiciar tiempo describiendo todos los aspectos del proyecto en las reuniones, sino que en cada una sólo se centra en los más pertinentes. Eso además provoca que los trabajadores empleen mejor su tiempo, ya que en cada intervalo entre reuniones sólo hay que preocuparse de ciertos aspectos. Naturalmente, además de la metodología ‘scrum’, en un proyecto de esta magnitud intervienen en menor medida otros tipos de metodología. Como se mencionaba anteriormente, esta metodología se basa en parte en la metodología incremental o en espiral, así que se podría decir que en cada reunión se atraviesan las fases que a ésta corresponden. Por tanto, en cada reunión se discutirán

las necesidades, los requisitos a cubrir antes de la

próxima reunión, un estudio de la arquitectura que se tomará para cumplir esos requisitos, se diseñará la parte de la aplicación que corresponda, se

20

Implementación de una API Java de Criptografía RSA

programará y finalmente se realizarán pruebas para comprobar que se ajuste a los requisitos. Otra metodología que en ocasiones he empleado es lo que se define como ‘programación extrema’. Cuando la parte de la aplicación en la que tenía que trabajar tenía una complejidad de tipo matemático en lugar de informático, en lugar de dedicar mucho tiempo al diseño, lo definía de forma esquemática y me ponía inmediatamente a programar. La ventaja principal que presenta es que las ideas que aparecen durante el desarrollo son plasmadas e implementadas inmediatamente, no perdiéndose, lo cual en ocasiones da lugar a fragmentos de código más originales. Esta metodología suele resultar eficiente cuando el algoritmo informático no es demasiado complejo, y tiene la ventaja de que permite solucionar problemas de otras índoles (como por ejemplo ajustes de fórmulas matemáticas, o tamaños y formato de datos) de forma algo más eficiente que las metodologías tradicionales. Sin embargo, suele resultar conveniente dedicar tiempo a estas aplicaciones después de programadas, ya que al programar así, es fácil que los detalles de etiqueta de programación se dejen a un lado, y el resultado, aunque eficiente, sea bastante caótico y difícil de entender.

21

Implementación de una API Java de Criptografía RSA

4 Identificación de Necesidades

4.1 Objetivos del Sistema La aplicación en la que se basa este proyecto pretende facilitar el uso del cifrado RSA a cualquier programador que quiera incluirla en sus programas. El resultado del proyecto estará constituido por una API denominada RSA, y por una serie de aplicaciones que pueden ser utilizadas por sí mismas, o ser modificadas por un programador para servir objetivos más específicos. Los objetivos de la API RSA son: •

Crear un conjunto de claves pseudo-aleatorias para esta instancia del programa, de manera que si existen varias instancias, cada una cifre los mensajes de forma distinta.



Digerir y ‘des-digerir’ una cadena de texto, es decir, convertirla de texto en números, y viceversa (para ello se empleará el código ASCII).



Cifrar y descifrar cadenas digeridas mediante el uso de las claves previamente creadas.

22

Implementación de una API Java de Criptografía RSA

Por otra parte, las aplicaciones de demostración creadas también responderán a una serie de necesidades. La primera aplicación, la que permitirá la comunicación cifrada entre un cliente y un servidor, tendrá los siguientes objetivos: •

Una estructura cliente/servidor, donde el servidor cree un juego de claves, y el cliente las emplee para enviarle información cifrada.



En ningún momento la información viajará en abierto (sin cifrar), el único momento donde esto puede ocurrir es al enviar el servidor su clave pública, que como su nombre indica, es susceptible de ser vista por terceros sin afectar a la seguridad de la comunicación.

Por su parte, la aplicación dedicada al cifrado y descifrado de ficheros, tendrá que cumplir los siguientes objetivos •

La herramienta permitirá cifrar o descifrar un fichero ASCII (de formato .txt) con criptografía RSA.

23

Implementación de una API Java de Criptografía RSA

4.2Alcance de la Aplicación La API RSA necesitará otra serie de métodos que le permitan realizar todas sus funciones. Se procurará que todos los métodos sean tan modulares como sea posible, para facilitar su portabilidad, y para favorecer el que puedan ser usados incluso fuera de la propia aplicación. Se agruparán en fases que facilitarán la comprensión del funcionamiento de la aplicación: •

Creación de claves: Cuando un objeto de la clase desarrollada sea creado, se crearán para él una serie de claves (de manera que si hay varias instancias, cada una tenga un juego de claves distinto). Así, si otro proceso pretende iniciar una comunicación cifrada con él, se le podrá suministrar una clave pública.



Mapeo de mensajes: Para poder cifrar un mensaje, ya provenga del teclado de un usuario, o de un fichero de texto, este tendrá que convertirse a formato ASCII, para que luego podamos combinarlo con la clave y cifrarlo.



Cifrado de mensajes: Teniendo por entrada el mensaje en código ASCII, y la clave pública del destinatario, en esta fase se cifrará el mensaje.



Descifrado de mensajes: Un mensaje recibido podrá ser descifrado mediante el uso de nuestra propia clave privada.

24

Implementación de una API Java de Criptografía RSA

4.3 Tipología de Usuario Esta aplicación está destinada a cualquier persona con conocimientos de Java que pretenda hacer uso de la criptografía RSA. Se podrá utilizar para el envío de mensajes cifrados, o incluso para cifrar un fichero de nuestro ordenador. Puesto que cada instancia de la aplicación creará un nuevo juego de claves, y dada la cantidad de claves posibles que existen, es muy difícil que en el uso de varias de estas instancias, estas interfieran entre sí.

25

Implementación de una API Java de Criptografía RSA

4.4 Restricciones Como se comentaba antes, la restricción más dura ha sido la temporal, por el hecho de tener que empezar y terminar el proyecto durante el verano. Además aparecen otras restricciones que, por no tratarse de una aplicación profesional, y precisamente por no haberse dispuesto de más tiempo, no han podido incluirse. Una de ellas es que la entrada y salida de archivos de texto tenga que ser en formato ASCII, aunque en teoría sería posible extenderlo a cualquier otro.

4.5 Organización

26

Implementación de una API Java de Criptografía RSA

4.6 Antecedentes Este proyecto tiene el fin de satisfacer las necesidades de privacidad que un programador pueda tener para las comunicaciones entre sus programas. Si bien es cierto que buscando en la red podemos encontrar implementaciones de casi cualquier sistema criptográfico en casi cualquier lenguaje de programación, la mayoría de las que he encontrado sólo sirven para explicar la implementación de RSA, y ninguna de las que he visto parece tener por fin el proveer una herramienta criptográfica para gente que no sabe criptografía.

27

Implementación de una API Java de Criptografía RSA

5 Análisis de Requisitos

HOJA DE REQUISITOS PROYECTO: Implementación en Java de criptografía RSA

JEFE PROYECTO: Javier Ruiz de Ojeda Fdez.

FECHA: 19/06/07 FUENTE: Programador

ESTADO: Final

VERSIÓN: 1.0

PÁG: 1 de 5

PRIORIDAD: Alta

CLIENTE: David Contreras IDENTIFICADOR REQUISITO: R01 DESCRIPCIÓN REQUISITO: Encontrar una manera de implementar grandes números y aritmética modular en Java TIPO REQUISITO: Operativo DESCRIPCIÓN: Los grandes números y la COMENTARIOS: Importante resolverlo antes aritmética modular pueden ser difíciles de comenzar a programar de implementar BENEFICIOS: Al ser Java un lenguaje orientado a objetos, una clase que se refiera a los números grandes sería una gran ventaja, además de facilitar las comunicaciones COMENTARIOS/SOLUCIONES SUGERIDAS: Investigar la clase BigInteger

DOCUMENTOS RELACIONADOS: REQUISITOS RELACIONADOS: RESOLUCIÓN: La clase BigInteger de Java soluciona el problema

28

Implementación de una API Java de Criptografía RSA

HOJA DE REQUISITOS PROYECTO: Implementación en Java de criptografía RSA

JEFE PROYECTO: Javier Ruiz de Ojeda Fdez.

FECHA: 19/06/07 FUENTE: Programador

ESTADO: Final

VERSIÓN: 1.0

PÁG: 2 de 5

PRIORIDAD: Media

CLIENTE: David Contreras IDENTIFICADOR REQUISITO: R02 DESCRIPCIÓN REQUISITO: Transformar cualquier tipo de dato en ASCII

TIPO REQUISITO: Funcional DESCRIPCIÓN: Para poder manejar y cifrar texto, este debe aparecer en formato ASCII

COMENTARIOS: En un futuro se puede extender a cualquier tipo de dato

BENEFICIOS: El código ASCII es más sencillo de cifrar que otras representaciones formales

COMENTARIOS/SOLUCIONES SUGERIDAS: Intentar que funcione con texto en primer lugar

DOCUMENTOS RELACIONADOS: REQUISITOS RELACIONADOS: RESOLUCIÓN: Transformar el texto carácter a carácter

29

Implementación de una API Java de Criptografía RSA

HOJA DE REQUISITOS PROYECTO: Implementación en Java de criptografía RSA

JEFE PROYECTO: Javier Ruiz de Ojeda Fdez.

FECHA: 19/06/07 FUENTE: Programador

ESTADO: Final

VERSIÓN: 1.0

PÁG: 3 de 5

PRIORIDAD: Alta

CLIENTE: David Contreras IDENTIFICADOR REQUISITO: R03 DESCRIPCIÓN REQUISITO: Permitir comunicaciones entre procesos, para intercambiar claves, y posteriormente mensajes TIPO REQUISITO: Funcional DESCRIPCIÓN: La finalidad principal de la encriptación es que las comunicaciones sean seguras

COMENTARIOS: Comprobar que se pueden enviar datos, y después datos cifrados

BENEFICIOS: Si no pudiéramos enviar los datos encriptados, perderíamos la mayor funcionalidad de la aplicación COMENTARIOS/SOLUCIONES SUGERIDAS: Primero crear una arquitectura cliente/servidor y luego comprobar que el envío de datos es adecuado

DOCUMENTOS RELACIONADOS: REQUISITOS RELACIONADOS: Permite el requisito R04 RESOLUCIÓN: RMI

30

Implementación de una API Java de Criptografía RSA

HOJA DE REQUISITOS PROYECTO: Implementación en Java de criptografía RSA

JEFE PROYECTO: Javier Ruiz de Ojeda Fdez.

FECHA: 19/06/07 FUENTE: Programador

ESTADO: Final

VERSIÓN: 1.0

PÁG: 4 de 5

PRIORIDAD: Alta

CLIENTE: David Contreras IDENTIFICADOR REQUISITO: R04 DESCRIPCIÓN REQUISITO: Asegurarse de que la encriptación funciona, y los datos (incluso los no-alfabéticos) son correctos al descifrar TIPO REQUISITO: Funcional DESCRIPCIÓN: La complejidad matemática de la encriptación pone en peligro el correcto funcionamiento

COMENTARIOS: Hacer pruebas con datos alfanuméricos, símbolos...

BENEFICIOS: Si la encriptación destruye los datos, la aplicación es inservible

COMENTARIOS/SOLUCIONES SUGERIDAS: Hacer muchas pruebas con distintos tipos de datos, siempre tras asegurarse que el requisito R03 esté cumplido

DOCUMENTOS RELACIONADOS: REQUISITOS RELACIONADOS: Debe comprobarse tras finalizar el requisito R03 RESOLUCIÓN: Tras finalizar las aplicaciones, exhaustiva fase de pruebas

31

Implementación de una API Java de Criptografía RSA

HOJA DE REQUISITOS PROYECTO: Implementación en Java de criptografía RSA

JEFE PROYECTO: Javier Ruiz de Ojeda Fdez.

FECHA: 19/06/07 FUENTE: Programador

ESTADO: Final

VERSIÓN: 1.0

PÁG: 5 de 5

PRIORIDAD: Baja

CLIENTE: David Contreras IDENTIFICADOR REQUISITO: R05 DESCRIPCIÓN REQUISITO: Mejora del tiempo de respuesta

TIPO REQUISITO: Funcional DESCRIPCIÓN: Si la encriptación es buena pero la latencia es demasiado alta, la aplicación pierde utilidad

COMENTARIOS: Dejarlo para el final

BENEFICIOS: Un bajo tiempo de espera hará que los usuarios estén dispuestos a usar la aplicación, mientras que una alta latencia les desmoralizará COMENTARIOS/SOLUCIONES SUGERIDAS: Hacer pruebas con distintas cantidades de datos y tamaños de claves

DOCUMENTOS RELACIONADOS: REQUISITOS RELACIONADOS: RESOLUCIÓN: Al terminar las aplicaciones, el tiempo de respuesta es adecuado

32

Implementación de una API Java de Criptografía RSA

6 Estudio de la Arquitectura

La arquitectura para este proyecto es principalmente software, ya que la arquitectura hardware en la que se podría usar la aplicación puede tomar varias formas. Un usuario podría utilizarla para cifrar archivos en su ordenador, mientras que otro podría aplicar la encriptación RSA a las comunicaciones entre un servidor y una serie de clientes remotos. Las especificaciones físicas del ordenador sobre el que se ha realizado en proyecto, así como sus pruebas, son estas: ordenador portátil Toshiba Satellite, con procesador Intel Centrino Duo a 1’6 GHz con 1 GB de RAM En cuanto al aspecto software, lo primero que decidí fue realizar el proyecto en el lenguaje Java, por su portabilidad, las ventajas que presenta a la hora de programar cosas como funciones o clases, y la comodidad que supone programar en un lenguaje que me resulta familiar, en lugar de añadir más complicaciones al proyecto. Para programar en Java, he utilizado el entorno de desarrollo NetBeans 5.0, ya que estoy familiarizado con él y todo está bien organizado. Al igual que Eclipse, es de distribución libre y se puede obtener en la web de SUN.

33

Implementación de una API Java de Criptografía RSA

7 Diseño

Este apartado muestra el diseño del proyecto. Debido a la metodología empleada, el diseño ha sufrido varias modificaciones a lo largo de su desarrollo, para ajustarse a las restricciones que iban apareciendo, y para dar cabida a las nuevas ideas surgidas durante el proceso.

7.1 Estructura de la API RSA Para comprender cuál es la estructura de la API RSA y qué funcionalidades tiene, se recurrirá a un diagrama UML de la misma.

34

Implementación de una API Java de Criptografía RSA

Como vemos, los atributos principales de la API son sus claves, explicadas anteriormente, que son lo que hace que el algoritmo matemático funcione correctamente. En cuanto a los métodos, tenemos los siguientes: •

BigInteger getN (): Nos permite obtener la clave n de la API RSA.



BigInteger getE (): Nos permite obtener la clave e de la API RSA, que junto con la clave n, conforman la clave pública.



BigInteger getD (): Nos permite obtener la clave d de la API RSA, o lo que es lo mismo, la clave privada (la que nos permite descifrar un mensaje).



BigInteger digerirMensaje (String input): Dada una cadena de entrada, la transformara en un gran número con el que posteriormente podremos trabajar para cifrarlo y descifrarlo.



String desdigerirMensaje (BigInteger input): Efectúa la operación inversa al método anterior, y nos permite a partir de un mensaje descifrado, obtener la cadena original.



BigInteger cifrarMensaje (BigInteger input, BigInteger n, BigInteger e): Dado un mensaje digerido (en forma de número), y una clave pública (formada por el número n y la clave de cifrado e), nos devolverá el mensaje cifrado también en forma de número.

35

Implementación de una API Java de Criptografía RSA



BigInteger descifrarMensaje (BigInteger input, BigInteger d): Dado un mensaje cifrado, y la clave privada d, nos devolverá el mensaje sin cifrar, o lo que es lo mismo, sólo digerido. Por tanto, la estructura para el envío de un mensaje cifrado sería esta:

     

36

Implementación de una API Java de Criptografía RSA

7.2 Estructura de la Aplicación Cliente/Servidor La aplicación cliente/servidor nos servirá para demostrar cómo utilizar la criptografía RSA para cifrar las comunicaciones entre dos elementos a través de un canal abierto, mediante el uso de la API RSA descrita en el apartado anterior. Como su nombre indica, la arquitectura de esta aplicación constará de dos partes, un cliente y un servidor, que podrán comunicarse de forma remota. El servidor admitirá varias conexiones simultáneas gracias al uso de RMI, que gestiona el uso de puertos, etc. En cuanto a la arquitectura física, podemos decir que las dos partes de la aplicación podrían residir en la misma máquina, o en máquinas separadas:

37

Implementación de una API Java de Criptografía RSA

La creación de una estructura cliente/servidor en Java no plantea excesivos problemas en un principio, si bien en este caso fue algo complicada la tarea del intercambio de claves. Al final, se optó por utilizar la faceta RMI (o Invocación de Métodos Remotos) de Java, gracias a la cual la estructura y diseño de las clases Server y Client se reducía en complejidad (si bien ese tiempo se tuvo que invertir igualmente en investigar el funcionamiento del RMI). Gracias a esta faceta, todos los métodos residen en el servidor, pero es el cliente quien los invoca remotamente. De esta manera, la lógica del cliente pasa a ser casi lineal, y además se reduce la carga de trabajo en el servidor, lo cual si se desea ampliar sus funcionalidades como se sugiere en el apartado de Desarrollos Futuros, sería de gran ayuda. El último detalle, por tratarse de una estructura con RMI, sería la creación de un interfaz que es el encargado de permitir esta comunicación, y que se encarga de definir de forma abstracta los métodos que el cliente invocará en el servidor. Estos métodos son: •

BigInteger getN() throws RemoteException: Envía la clave n.



BigInteger getE() throws RemoteException: Envía la clave e.



void enviarInfo(BigInteger mensaje) throws RemoteException: Una vez recibido el mensaje, se descifra y se vuelve a convertir a cadena. Esta cadena será imprimida por pantalla en el servidor para comprobar que la comunicación, el cifrado y el descifrado han funcionado correctamente.

38

Implementación de una API Java de Criptografía RSA

7.3 Estructura de la Aplicación de Cifrado de Ficheros Esta aplicación es la encargada de ayudarnos a cifrar y descifrar ficheros en nuestro ordenador. A diferencia de la aplicación anterior, que sólo servía como prueba de concepto para demostrar las comunicaciones cifradas entre dos aplicaciones, esta es una aplicación autosuficiente, que cualquiera podría utilizar en su ordenador. Por ello, se ha decidido además dotarla de un sencillo interfaz gráfico que la haga más visual (y más amigable) para los usuarios. En este caso, salvo que se deseen añadir nuevas funcionalidades como las descritas en el apartado de Desarrollos Futuros, el usuario no necesitaría ni siquiera saber programar. Vamos pues a ver el interfaz gráfico:

39

Implementación de una API Java de Criptografía RSA

Como vemos, se trata de un interfaz muy simple, que trata de nuevo de recalcar el espíritu de este proyecto, que no es otro que el de acercar una tecnología compleja a usuarios mucho menos avanzados. Sólo posee un campo para texto donde el usuario introducirá la ruta del archivo que desea cifrar o descifrar, y dos botones que iniciarán dichas funciones. En cuanto al código, la aplicación centra su funcionalidad en dos métodos: •

int cifrarFichero (String origen): Este método abre el fichero de origen, y lo va leyendo carácter a carácter. Cada 50 caracteres (el tamaño se puede variar, aunque puede desbordarse si no vigilamos su relación con el tamaño de las claves), esa cadena de texto se transforma en un número que se cifra y se almacena en un nuevo fichero.



int descifrarFichero (String origen): Para realizar la operación inversa al método anterior, se abrirá el fichero cifrado, y se irán recogiendo los números almacenados en él. Para cada uno, se descifrará y almacenará en otro nuevo fichero.

 

40

Implementación de una API Java de Criptografía RSA

8. Programación y Pruebas    

Para la etapa de programación y pruebas del proyecto, se ha dividido este en 3 

etapas bien diferenciadas, por ser estas modulares. Estas fases son la implementación  de la API RSA, y las implementaciones de las dos aplicaciones que harán uso de ella.  Por tanto, podría establecerse el siguiente esquema de precedencias entre ellas.   

       

41

Implementación de una API Java de Criptografía RSA

8.1 API RSA La API RSA era la parte más importante del proyecto, la que generaba la motivación, y la que permitía que todas las funcionalidades demostradas en las aplicaciones fueran posibles. Para ello, como veíamos en la identificación de necesidades, la aplicación debía ser capaz, fundamentalmente, de crear un juego de claves, y posteriormente poseer una serie de métodos para digerir los mensajes y cifrarlos, con sus correspondientes métodos inversos. Para la programación de la API ha sido fundamental el descubrimiento de la clase BigInteger de Java. Esta clase nos permite manejar números de gran tamaño (requeridos para la criptografía moderna), y además posee una serie de métodos que nos permiten operar con ellos, entre los cuales destacan los que nos permiten trabajar en aritmética modular. Como se especificó anteriormente, esto era crucial para el proyecto. Además, era necesario crear una serie de métodos que nos permitieran el paso de cadenas de caracteres a números y viceversa. Para ellos se han creado los métodos digerirMensaje(), que transforma una cadena en una serie de números atendiendo a su código ASCII, desdigerirMensaje(), que efectúa la operación inversa, y finalmente un método toBigInteger(), que nos permite obtener un número BigInteger a partir de una cadena de caracteres numéricos.

42

Implementación de una API Java de Criptografía RSA

Finalmente, quedaban las consideraciones propias del algoritmo RSA. Como avanzábamos, el primero de estos pasos era la creación de un conjunto de claves, todas ellas de tipo BigInteger. Una vez creadas estas claves, eran necesarios unos métodos de tipo ‘getter’ que nos permitieran obtenerlas para su

uso.

Finalmente,

los

métodos

cifrarMensaje()

y

descifrarMensaje() nos permiten hacer justo eso, dado un mensaje digerido, cifrarlo, y dado un mensaje cifrado, descifrarlo. Esta etapa del proceso fue relativamente corta de implementar una vez que el algoritmo y cada uno de los elementos que intervienen en RSA fueron perfectamente comprendidos. De hecho, las funciones de cifrado y descifrado son las más simples, y la mayor complejidad se alcanzó al efectuar los pasos controlados de BigInteger a cadena y viceversa. Un exhaustivo proceso de pruebas permitió dar por zanjada esta parte y comenzar el trabajo de las siguientes.

43

Implementación de una API Java de Criptografía RSA

8.2 Aplicación Cliente/Servidor La aplicación cliente/servidor ha sido una de las más problemáticas, por múltiples motivos. En primer lugar, la estructura básica de cliente/servidor de Java permite a estos elementos comunicarse a través de bytes. A la hora de enviar texto de uno a otro esto apenas suponía un problema, pero el envío de claves era mucho más complejo, hasta el punto que me fue imposible realizarlo correctamente. Tras mucho investigar, descubrí la faceta RMI (o Invocación de Métodos Remotos) de Java, lo cual, además de muchas horas de aprendizaje, supuso un avance cualitativo importante (ver referencia W05). Esta faceta permite que el cliente pueda ser el que ejecute los métodos del servidor (de hecho sólo da la orden de que se ejecuten, las operaciones tienen lugar en el servidor), así que la función del servidor se limita a poseer los métodos, simplificando mucho la implementación. Es el cliente el único con una lógica algo más complicada. Además, para el correcto funcionamiento de esto, se ha tenido que desarrollar el interfaz que permite esta invocación remota. La fase de pruebas ha sido bastante larga para esta aplicación, no por defectos en la programación, que quizá no ha sido tan compleja, sino por el complicado proceso de ensayo/error que ha dado lugar a la selección de la estrategia óptima (el uso de RMI para la ejecución de los métodos que permiten el intercambio de claves). Esto naturalmente afecta en retrospectiva al

44

Implementación de una API Java de Criptografía RSA

diseño de esta aplicación, hasta el punto que la propia lógica de la aplicación se ha visto alterada (ahora todos los métodos residen en el servidor, pero es el cliente el que ordena su ejecución).

45

Implementación de una API Java de Criptografía RSA

8.3 Aplicación de Cifrado de Ficheros La aplicación de cifrado de ficheros es una aplicación que, como el resto del proyecto, pretende simplificar tremendamente toda la complejidad que hay detrás. Por ello, como se veía en la etapa de diseño, se ha recurrido a una interfaz extremadamente simple, lo cual no significa que lo que hay detrás lo sea. La dificultad principal a la hora de desarrollar esta aplicación ha sido el paso de texto a números y viceversa. La aplicación ha sido desarrollada con la idea de cifrar y descifrar ficheros ASCII, es decir, que contengan los caracteres numerados del 0 al 255. Por tanto, el primer paso para digerir una cadena de texto era obtener estos números, y luego concatenarlos todos para producir un gran número de clase BigInteger. Naturalmente, varias pruebas fueron llevadas a cabo para poder determinar cuántos caracteres podían ser cifrados a la vez. Finalmente con el tamaño de clave de 512 bytes, se pudo cifrar hasta 102 caracteres en un solo bloque, sin desbordar las variables. Finalmente se escogió 100 como tamaño de bloque para redondear. A medida que el texto se va dividiendo en bloques, estos son digeridos y cifrados por una instancia de RSA, y guardados en un nuevo fichero de destino, donde residen en forma numérica.

46

Implementación de una API Java de Criptografía RSA

La segunda parte de la aplicación, la encargada de descifrar los ficheros, tiene como misión abrir el fichero designado como objetivo, e ir tomando las líneas de números para introducirlas en una variable BigInteger (de nuevo un arduo proceso) que pudiera ser descifrada mediante la instancia de RSA.

47

Implementación de una API Java de Criptografía RSA

Para esto, se tuvo que efectuar una revisión de la clase RSA, y se le añadió un nuevo método llamado toBigInteger(String input). Este método obtiene un BigInteger a partir de una cadena de texto (cuyos caracteres sean números, claro). Una vez descifrado el texto, la aplicación lo vuelve a convertir en una cadena de caracteres ASCII, y lo almacena en un nuevo fichero de destino.

48

Implementación de una API Java de Criptografía RSA

9. Desarrollos Futuros

Durante el desarrollo del proyecto se han cumplido los objetivos principales del mismo. Sin embargo, también han surgido nuevas ideas para funcionalidades adicionales que podrían hacerlo aún más versátil y cómodo. La parte principal del proyecto, la API RSA, está básicamente completada, pero en el campo de las aplicaciones que hacen uso de ella caben posibilidades para muchas mejoras. Por una parte, podrían mejorarse las propias aplicaciones desarrolladas durante el proyecto para incluir nuevas funcionalidades. Por ejemplo, el programa de comunicaciones entre cliente y servidor podría evolucionar hasta convertirse en una especie de programa de mensajería instantánea, donde las comunicaciones se encuentren cifradas con criptografía RSA. Esto significa que podría utilizarse a nivel empresarial, para compartir datos de índole clasificada, o que puedan ser potencialmente peligrosos. En cuanto a la aplicación de cifrado de ficheros, podría extenderse su uso a ficheros de distinto tipo, de manera que podríamos cifrar no sólo documentos

de

texto

básico,

sino

.pdf,

.doc,

.xls,

imágenes…

Así

dispondríamos de una encriptación potencialmente inexpugnable para proteger datos en nuestro ordenador.

49

Implementación de una API Java de Criptografía RSA

Por otra parte, podría incluirse un sistema de gestión de contraseñas para distintos usuarios, o incluso para que un mismo usuario pueda disponer de distintas contraseñas para cifrar sus diferentes archivos. Finalmente, y como es lógico, cabe destacar que las aplicaciones presentadas como complemento a la API RSA en este proyecto no son más que un ejemplo de lo que podría hacerse con ella, pero no son ni mucho menos los únicos usos que se le podría dar. Simplemente se han escogido los que podrían tener según mi opinión mayor cabida en el mundo empresarial. A continuación, se describirán los pasos recomendados para desarrollar cada una de las mejoras anteriormente mencionadas en mayor detalle.

50

Implementación de una API Java de Criptografía RSA

9.1 Comunicación Bilateral entre Cliente y Servidor La aplicación que se ha desarrollado por el momento sólo permite la comunicación unilateral de información desde un cliente hasta un servidor (si no contamos, claro, el intercambio de claves previo a la misma). Sin embargo, sería muy útil integrar esta funcionalidad en un programa de mensajería instantánea para varios usuarios, que podrían estar tranquilos ya que todas sus comunicaciones estarían protegidas por un potentísimo estándar criptográfico. Así, los usuarios podrían llegar a tener conversaciones (incluso entre más de dos de ellos) en el ámbito empresarial sin preocuparse por la seguridad de las mismas. Para desarrollar este cambio, una vez más deberíamos partir de la base de crear el propio sistema de mensajería instantánea (que casi supondría un proyecto en sí). Posteriormente, bastaría con crear una instancia de la API RSA en cada participante, y emplear sus funcionalidades del modo que queda patente en la aplicación cliente/servidor presentada como parte de este proyecto.

51

Implementación de una API Java de Criptografía RSA

9.2 Ficheros de Distintos Tipos En cuanto a la aplicación que permite el cifrado y descifrado de ficheros de texto en nuestro ordenador, su rango de acción podría extenderse considerablemente. La primera mejora diseñada es posibilitar el que se puedan cifrar (y descifrar) múltiples tipos de archivos, como por ejemplo imágenes, documentos más complejos (.pdf, .doc…). Esto permitiría que cualquier fichero de nuestro ordenador pudiera cifrarse para ser almacenado seguramente. Esto sería de especial interés en el entorno empresarial, donde a menudo varios empleados utilizan los mismos ordenadores. Para llevar a cabo de esta mejora, habría que buscar la manera más óptima de transformar estos ficheros en texto ASCII (al fin y al cabo, todos los ficheros de cualquier tipo se componen de ceros y unos). Una vez efectuado este primer cambio, el resto es bastante simple de implementar basándose en la aplicación desarrollada para este proyecto. Las funciones de la API RSA deben ser llamadas de la misma manera que con los ficheros de texto.

52

Implementación de una API Java de Criptografía RSA

9.3 Contraseñas para el Cifrado de Ficheros Otra funcionalidad que se le podría añadir a este programa es dotarlo de un sistema de contraseñas que permita que un fichero necesite de la contraseña original para poder ser descifrado. Esto plantea una nueva vulnerabilidad, ya que una contraseña que sea recordable por un usuario siempre sería más fácil de descifrar que una contraseña de varios cientos de dígitos, pero plantearía una comodidad añadida. Con una política adecuada en torno a la elección de contraseñas, esto podría darle la seguridad necesaria para utilizarse en el mundo empresarial. Para crear esta funcionalidad, probablemente el programa debería disponer de un fichero donde almacene las contraseñas de los usuarios, y sus claves RSA correspondientes, de manera que al introducir una contraseña, el programa obtenga la clave de descifrado adecuada. Volvemos una vez más al problema criptográfico planteado en la introducción histórica del proyecto, es decir, que si el programa crea un fichero donde guardar estas contraseñas, y este fichero es accesible, cualquier usuario podría verlo, y saber todas las claves para ficheros almacenados en ese ordenador. Sin embargo, se ha pensado una forma inteligente de hacer frente a esto. En primer lugar, cada vez que se cifre un fichero, se deberá crear un nuevo juego de claves, que se almacenarán en este fichero de referencia hasta que el fichero sea descifrado. En este momento, el juego de claves será

53

Implementación de una API Java de Criptografía RSA

descartado. Así, se evita que una clave sea utilizada con frecuencia, lo cual ayudaría a un posible criptoanalista a descifrarla. Para solucionar el problema del fichero accesible con todas las contraseñas y claves en él, el programa podría a su vez cifrar este fichero, haciendo su contenido incomprensible para cualquiera salvo él. Así, cada vez que se use, haría uso de su propia clave interna para leer su fichero, y luego volver a cifrarlo, haciéndolo imposible de acceder.

54

Implementación de una API Java de Criptografía RSA

9.4 Nuevas Aplicaciones Los dos programas desarrollados para este proyecto no son más que ejemplos de cómo la tecnología RSA puede pasar a formar parte de cualquier entorno de programación Java. Cualquier programador sin tener ninguna idea de las matemáticas subyacentes a RSA podrá usar estos programas, adaptarlos para su uso personal, o incluso crear otros nuevos para satisfacer cualquier necesidad ya sea en el ámbito particular o de la empresa.

.

55

Implementación de una API Java de Criptografía RSA

10 Planificación del Proyecto

A continuación se detalla la planificación inicial del proyecto. He intentado ceñirme tanto como me ha sido posible a ella, aunque como es lógico, en ocasiones hay actividades que se desarrollan en paralelo, o descubrimientos en fases posteriores llevan a revisiones de las etapas anteriores.

Este diagrama muestra la distribución de tiempo dedicado al proyecto desde su inicio hace unos meses. Puesto que se pretendía presentarlo en Septiembre, se ha dedicado más tiempo semanal del que quizá requeriría otro

56

Implementación de una API Java de Criptografía RSA

proyecto,

especialmente

en

la

etapa

de

programación

y

pruebas.

Aproximadamente, se estima el siguiente uso de horas. •

Investigación y lectura de libros: 6 semanas



Identificación de necesidades: 1 semana



Diseño: 2 semanas



Programación: 10 semanas



Pruebas: 4 semanas



Implantación: 7 semanas

Con un trabajo medio de 10 horas semanales, y teniendo en cuenta que algunas actividades se solapan, el trabajo habrá llevado unas 300 horas. Si a esto le añadimos la documentación, estaría en torno a las 350.

57

Implementación de una API Java de Criptografía RSA

11 Valoración Económica

La valoración económica pretende estimar el coste real del proyecto, incluyendo las horas de trabajo, el software y hardware realizado, y el material empleado para el aprendizaje. Además, se ha dividido en 3 perfiles diferenciados para poder hacerse una idea de cómo se repartirían las horas empleadas en un proyecto realizado por un equipo si este fuera el caso.

Equipo (a 3 años): 200€ Software (gratuito): 0 Libros: 100€ Horas de trabajo: Jefe de Proyecto: Identificación de necesidades: 1 semana ~ 10 horas Diseño: 2 semanas ~ 20 horas Documentación: 2 semanas ~ 20 horas

58

Implementación de una API Java de Criptografía RSA

Analista Investigación y lectura de libros: 6 semanas ~ 60 horas Documentación: 1 semana ~ 10 horas Programador: Programación: 10 semanas ~ 100 horas Pruebas: 4 semanas ~ 40 horas Implantación: 7 semanas ~ 70 horas Documentación: 2 semanas ~ 20 horas

Si estimamos que el Jefe de Proyecto factura 60€ por hora, el analista, 45€ por hora, y el programador, 30€ por hora, vemos que: Total Jefe de Proyecto: 50 horas x 60 €/hora = 3000€ Total Jefe de Proyecto: 70 horas x 45 €/hora = 3150€ Total Jefe de Proyecto: 230 horas x 60 €/hora = 6900€

COSTE TOTAL DEL PROYECTO: 13350€.

59

Implementación de una API Java de Criptografía RSA

12 Conclusiones

Aunque el desarrollo del proyecto haya sucedido en gran parte durante el verano, la idea venía de antes, y también la recopilación de información acerca de los temas aquí descritos. Este proyecto me ha permitido afianzar mis conocimientos de criptografía, hasta llegar a familiarizarme totalmente no sólo con el algoritmo RSA, sino con muchos otros que históricamente sirvieron para dar con él. Desde ese punto de vista, y aunque el proyecto sirve en parte como forma de enseñanza, debo decir que he aprendido mucho. He aprendido criptografía, y a la hora de implementarla, he tenido que aprender muchas nuevas técnicas de programación. El uso de ciertas clases de Java, la Invocación de Métodos, algoritmos complicados para el procesamiento de texto… Estas y muchas otras cosas no se explican en clase (tampoco hace falta saberlas salvo que se meta uno en un proyecto así), pero me han resultado de gran ayuda, y estoy convencido de que saberlas me beneficiará en el futuro. Finalmente, cabe destacar que mucho de lo aprendido no puede incluirse en ninguna disciplina concreta, como lo son la criptografía o la programación en Java. El desarrollo de un proyecto de esta magnitud (el mayor desarrollado en solitario desde que comencé la carrera) me ha llevado a poner

60

Implementación de una API Java de Criptografía RSA

en práctica muchas de las reglas sobre metodología que había aprendido. El seguir unas pautas, o ponerse unos plazos, son cosas que a nivel de estudiante quizá no se hagan con demasiada frecuencia, pero está claro que ayudan, y además serán indispensables el día de mañana. Y hablando de ello, merece una mención especial la descrita como ‘Scrum’ en el apartado de Metodología. Ha demostrado ser una gran aliada en tanto que permite trabajar con una eficiencia altísima, y rápidamente tener resultados palpables, si bien también es cierto que a la hora de generar la documentación quizá no sea la más adecuada. Los objetivos principales han sido cumplidos, y espero que mi proyecto pueda realmente servir de ayuda a programadores, ya que ha sido desarrollado por un programador y para programadores. En otras palabras, lo presento como a mí me gustaría que me presentaran un API que trata tecnologías que desconozco.

61

Implementación de una API Java de Criptografía RSA

13 Bibliografía

13.1 Internet: W01: Wikipedia – http://en.wikipedia.com W02: Todo sobre PGP – http://www.geocities.com/siliconvalley/pines/2332/ W03: Criptografía Cuántica – http://www.textoscientificos.com/criptografia/cuantica W04: RMI – http://java.sun.com/j2se/1.5.0/docs/guide/rmi/hello/hello-world.html W05: API de Java: http://java.sun.com/javase/reference/api.jsp

13.2 Libros: L01: Simon Singh – “The Code Book”. ANCHORBOOKS, 1a edición. Septiembre 2000. L02: William Stallings – “Cryptography and Internet Security”. PRENTICE HALL, 3ª edición. 2003.

62

Implementación de una API Java de Criptografía RSA

ANEXOS

ANEXO A: Manual del Usuario

A.1 Requerimientos del Sistema Los requerimientos del sistema son relativos para este proyecto, y dependen fundamentalmente del uso que se le pretenda dar. Si sólo se desea examinar el código, utilizándolo para poder aprender el funcionamiento de la criptografía RSA, nos bastará con cualquier aplicación del tipo Bloc de Notas. De todas maneras, supondremos que el uso mínimo para este proyecto será el de utilizar las aplicaciones desarrolladas en él. En tal caso, necesitamos una Máquina Virtual Java (JVM) instalada en nuestro ordenador. Podemos descargar la más reciente en la web de SUN (http://java.sun.com). Una vez instalada, el sistema operativo pasa a ser irrelevante. Sin embargo, el proyecto ha sido pensado para ayudar a los programadores (si bien sus aplicaciones alcanzarán en última instancia a usuarios menos avanzados). Por tanto, lo ideal sería disponer de un entorno de

63

Implementación de una API Java de Criptografía RSA

desarrollo Java donde poder ver, modificar, compilar o ejecutar las aplicaciones. Mi recomendación es el entorno NetBeans, también disponible en la web de SUN, que es fácil de instalar e incluye una ayuda muy detallada, además de ser completamente gratuito e incluir una Máquina Virtual Java.

64

Implementación de una API Java de Criptografía RSA

A.2 Uso de la API RSA La clase RSA no es ejecutable en sí misma, de hecho al instanciarse lo único que hace es inicializar sus variables y sus claves. Su verdadera función es ser utilizada por otro programa para proporcionarle todas las posibilidades y funcionalidades de la criptografía RSA. Por tanto, salvo que pretenda hacerse alguna modificación (como cambiar el tamaño de las claves, localizado en la variable SIZE), en principio lo único que se debe conocer de la API son los prototipos de sus métodos. •

BigInteger getN (): Devuelve él número n (producto de los primos p y q).



BigInteger getE (): Devuelve la clave e.



BigInteger getD (): Devuelve la clave d.



BigInteger

digerirMensaje

(String

input): Devuelve el

BigInteger correspondiente a una cadena de caracteres. •

String desdigerirMensaje (BigInteger input): Devuelve la cadena de caracteres correspondiente a un BigInteger.



BigInteger cifrarMensaje (BigInteger input, BigInteger n, BigInteger e): Devuelve un BigInteger que contiene el mensaje cifrado.

65

Implementación de una API Java de Criptografía RSA



BigInteger

descifrarMensaje

(BigInteger

input,

BigInteger d): Devuelve un BigInteger tras aplicar la clave privada (descifrar) a un mensaje cifrado. •

BigInteger

toBigInteger

(String

texto): Devuelve un

BigInteger correspondiente al número que aparece en la cadena de caracteres de la entrada

Para instanciar la clave RSA, llamaremos a su constructor (public RSA()). No necesita argumentos, así que la llamada típica será:

RSA rsa = new RSA();

Una vez hecho esto, podremos usar cualquiera de sus métodos, de la manera siguiente:

BigInteger numero = rsa.toBigInteger (String texto = “Hola”);

66

Implementación de una API Java de Criptografía RSA

A.3 Uso de la Aplicación Cliente/Servidor Por tratarse de una prueba de concepto, la aplicación cliente/servidor no cuenta con un interfaz en forma de ventana. Por tanto, tanto cliente como servidor han de ser arrancados desde la línea de comandos. Primero vamos a ver cómo se arranca el servidor. Como ya dijimos, gracias al uso de RMI de Java, la ejecución del servidor es bastante simple, ya que el código reside en él, pero es invocado por el cliente. Para arrancar el servidor, primero debemos asegurarnos de que la variable PATH del sistema incluya la ruta de los archivos binarios del jdk de Java. Si no la incluye, debemos hacerlo nosotros.

67

Implementación de una API Java de Criptografía RSA

Para compilar y ejecutar un archivo de Java, podemos situarnos en la carpeta donde se encuentra, o bien especificar su ruta cada vez que lo compilemos o ejecutemos. Por comodidad, lo haremos de la primera manera.

Una vez hecho esto, ya podemos compilar o ejecutar cualquier fichero Java. En primer luegar (por si acaso), lo compilaremos.

68

Implementación de una API Java de Criptografía RSA

Normalmente, el siguiente paso sería ejecutar el archivo. Sin embargo, por haber utilizado el RMI de Java, si lo hacemos así obtendremos un error. Lo que debemos hacer es iniciar el registro RMI.

Ahora ya podemos arrancar el servidor.

69

Implementación de una API Java de Criptografía RSA

Según esta implementado el servidor, sabremos que ha funcionado si la salida por pantalla es “Servidor listo”. Veamos ahora cómo funciona el Cliente. Se arranca prácticamente igual que el servidor. Lo primero, como antes, es incluir la ruta de los binarios de Java en el PATH, y situarse en el directorio de los archivos Java.

Y ahora debemos compilar y ejecutar el cliente.

70

Implementación de una API Java de Criptografía RSA

En este caso sabremos que ha funcionado porque se nos pedirá que escribamos un mensaje. Una vez escrito, lo cifrará y se lo enviará al servidor. Así lo veremos desde el lado del cliente.

71

Implementación de una API Java de Criptografía RSA

Y así veremos la recepción desde el lado del servidor.

Y así funciona la aplicación. Como se ha dicho previamente, el servidor acepta varias conexiones simultáneas de clientes. Si queremos comprobarlo, no tenemos más que repetir el proceso de arrancar el cliente, y escribir mensajes desde los clientes. Veremos cómo aparecen todos en el servidor.

72

Implementación de una API Java de Criptografía RSA

A.4 Uso de la Aplicación para el cifrado de Ficheros La aplicación de uso de ficheros es extremadamente fácil de utilizar. Puesto que ya ha sido construida anteriormente, sólo debemos ejecutar el archivo RSA.jar.

Veremos entonces el interfaz de la aplicación. Lo único que queda es especificar la ubicación de nuestro archivo, recordando que los directorios se separan con ‘//’ en lugar de ‘\’.

73

Implementación de una API Java de Criptografía RSA

Como es lógico, si pulsamos el botón de ‘Cifrar’, ese archivo quedará cifrado, y si pulsamos el de ‘Descifrar’, el archivo que acabamos de cifrar ser.a descifrado. Debe aclararse que al cifrar el fichero Prueba.txt, obtendríamos el fichero Prueba(cifrado).txt. Sin embargo, para descifrar éste, debemos pedirle que descifre el mismo de antes, Prueba.txt, y no Prueba(cifrado).txt. Lógicamente, no podemos descifrar un archivo que no ha sido cifrado previamente.

74

Implementación de una API Java de Criptografía RSA

A.5 Futuras Aplicaciones Parte de la motivación de este proyecto ha sido siempre utilizar la API de RSA para animar a los programadores a escribir nuevas aplicaciones, ya sea en el ámbito particular o de la empresa, que hagan uso de ella. Con el mismo fin se han desarrollado las dos aplicaciones que la complementan. Por ello parece adecuado incluir el desarrollo de futuras aplicaciones en el manual del usuario. El programador que desee de cualquier modo modificar o mejorar las aplicaciones aquí presentadas, o desarrollar desde cero unas nuevas, debe tener presentes algunos detalles. El primero y más importante es que es fácil. El desarrollo de la API RSA ha sido concebido desde el principio para hacer las cosas fáciles y ahorrar problemas y complicaciones a los programadores. Sabiendo qué tipo de datos (texto o números) hay que pasarle a cada método, el resto se realiza de forma transparente para el usuario. Por tanto, se anima a cualquier programador en Java a integrar el uso de RSA en cualquier aplicación que ya posea. Internet es una fuente inagotable de recursos y código abierto, y es posible encontrar aplicaciones con casi cualquier fin, así que sería buena idea combinar algunas de ellas con RSA para mejorarlas sustancialmente. El ejemplo obvio sería la aplicación de mensajería instantánea descrita en el apartado de desarrollos futuros. Se puede obtener una de la red, y mejorarla con el API RSA.

75

Implementación de una API Java de Criptografía RSA

También se podría mejorar la aplicación de cifrado de ficheros, aunque no he encontrado ninguna que se ajuste tanto a lo que esta hace, así que en este caso es más recomendable modificar la que aquí se presenta o incluso volver a desarrollar algo similar, que buscar algo ya escrito en Internet. Se ha intentado que el código sea comprensible y sencillo, sin saltos inexplicables, y exhaustivamente comentado, para que la tarea de modificación resulte mucho más sencilla. Por último, ya que la aplicación fue diseñada desde un principio como una implementación en código abierto para ayudar a los programadores a hacer sus comunicaciones, sería deseable que la gente comparta sus ideas al respecto de las aplicaciones futuras de este proyecto para ayudar a que mejore y crezca. Si bien no parece muy inteligente a priori compartir cómo funciona una aplicación de seguridad, en el caso de RSA el algoritmo matemático hace el resto y permite que siga siendo segura (a diferencia, por ejemplo, del uso de cerraduras, en el que saber cómo funcionan es un paso indispensable para aprender a forzarlas).

76

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.