aplicación software para el desarrollo de tareas criptográficas

164
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA DE TELECOMUNICACIÓN UNIVERSIDAD DE MÁLAGA PROYECTO FIN DE CARRERA APLICACIÓN SOFTWARE PARA EL DESARROLLO DE TAREAS CRIPTOGRÁFICAS INGENIERÍA DE TELECOMUNICACIÓN MÁLAGA, 2008 GÉNESIS GARCÍA MORILLA

Upload: genesis-garcia-morilla

Post on 18-Nov-2014

312 views

Category:

Technology


8 download

DESCRIPTION

Aplicación software para la realización de tareas criptográficas a través de algoritmos como el RSA de clave pública y los algoritmos de clave privada DES y TDES, a su vez también permite el uso del protocolo RSA Digital. Construida utilizando C++ como lenguaje de programación, Qt como librería para la interfaz gráfica y GMP como librería para la aritmética de múltiple precisión.

TRANSCRIPT

  • 1. ESCUELA TCNICA SUPERIOR DE INGENIERA DE TELECOMUNICACIN UNIVERSIDAD DE MLAGA PROYECTO FIN DE CARRERA APLICACIN SOFTWARE PARA EL DESARROLLO DE TAREAS CRIPTOGRFICAS INGENIERA DE TELECOMUNICACIN MLAGA, 2008 GNESIS GARCA MORILLA
  • 2. ESCUELA TCNICA SUPERIOR DE INGENIERA DE TELECOMUNICACIN UNIVERSIDAD DE MLAGA Titulacin: Ingeniera Telecomunicacin Reunido el tribunal examinador en el da de la fecha, constituido por: D./D.__________________________________________________________ D./D.__________________________________________________________ D./D.__________________________________________________________ Para juzgar el Proyecto Fin de Carrera titulado: APLICACIN SOFTWARE PARA EL DESARROLLO DE TAREAS CRIPTOGRFICAS Del alumno D. Gnesis Garca Morilla Dirigido por D. M Carmen Clemente Medina ACORD POR ______________________________________ OTORGAR LA CALIFICACIN DE _______________________________________________ Y, para que conste, se extiende firmada por los componentes del tribunal, la presente diligencia Mlaga, a ______ de __________________ de 2008 El/La Presidente/a El/La Vocal El/La Secretario/a Fdo.: _________________ Fdo.: _________________ Fdo.: _________________
  • 3. UNIVERSIDAD DE MLAGA ESCUELA TCNICA SUPERIOR DE INGENIERA DE TELECOMUNICACIN APLICACIN SOFWARE PARA EL DESARROLLO DE TAREAS CRIPTOGRFICAS REALIZADO POR: Gnesis Garca Morilla DIRIGIDO POR: M Carmen Clemente Medina DEPARTAMENTO DE: Ingeniera de Comunicaciones TITULACIN: Ingeniera Tcnica de Telecomunicacin Sistemas de Telecomunicacin PALABRAS CLAVES: Criptografa, RSA, DES, TDES, RSA Digital, Software, Lenguaje C++, Grficos Qt, Precisin Aritmtica GMP. RESUMEN: Aplicacin software para la realizacin de tareas criptogrficas a travs de algoritmos como el RSA de clave pblica y los algoritmos de clave privada DES y TDES, a su vez tambin permite el uso del protocolo RSA Digital. Construida utilizando C++ como lenguaje de programacin, Qt como librera para la interfaz grfica y GMP como librera para la aritmtica de mltiple precisin. Mlaga, Febrero de 2008
  • 4. A mis padres Antonio y Paqui, Y a mis hermanas Lidia y Anay.
  • 5. ndice PREFACIO CAPTULO 1 - Introduccin..1 1.1.- Objetivos.4 1.2.- Requisitos4 1.3.- Fases del trabajo...5 1.4.- Configuracin del sistema..27 1.4.1.- Linux..28 1.4.2.- Windows XP..28 1.4.3.- Mac OS..30 1.5.- Relacin entre clases...30 CAPTULO 2 - Algoritmos Criptogrficos Desarrollados..35 2.1.- RSA.37 2.1.1.- Introduccin..37 2.1.2.- Generacin de claves38 2.1.3.- Cifrado..41 2.1.4.- Descifrado.42 2.1.5.- Conclusiones.44 2.2.- DES.46 2.2.1.- Introduccin..46 2.2.2.- Generacin de claves46 2.2.3.- Cifrado..48 2.2.4.- Descifrado.53 2.2.5.- Conclusiones.53 2.3.- Triple DES..57 2.3.1.- Introduccin..57 2.3.2.- Cifrado y descifrado..57 2.3.3.- Conclusiones.58 2.4.- RSA Digital60 2.4.1.- Introduccin..60 2.4.2.- Cifrado y descifrado..61 2.4.3.- Firmado digital..61 2.4.4.- Conclusiones.62 I
  • 6. 2.5.- Gestin de Claves de los Algoritmos Desarrollados..63 2.5.1.- Introduccin..63 2.5.2.- Gestin de claves en RSA63 2.5.3.- Gestin de claves en DES y TDES..66 2.5.3.- Gestin de claves en RSA Digital66 CAPTULO 3 - Descripcin de la Aplicacin...69 3.1.- Introduccin71 3.2.- Pantalla Principal71 3.3.- Men Algoritmo Criptogrfico...75 3.3.1- Men RSA.76 3.3.2- Men DES y TDES...83 3.3.3- Men RSA Digital.84 CAPTULO 4 - Conclusiones, lneas futuras y limitaciones...89 4.1.- Conclusiones...91 4.2.- Lneas futuras..92 4.3.- Limitaciones95 APNDICE A - Manual de Usuario.97 A.1.- Pasos comunes para todos los algoritmos..99 A.1.- Usando RSA.102 A.2.- Usando DES y TDES...104 A.3.- Usando RSA Digital105 APNDICE B - Conceptos bsicos sobre Criptografa.109 B.1.- Historia.111 B.2.- Criptologa113 B.3.- Terminologa113 B.4.- Canal de informacin...114 B.5.- Criptosistemas..115 B.6.- Algoritmo criptogrfico...116 B.7.- Clave criptogrfica...116 B.8.- Longitud de clave.117 B.9.- Base Matemtica RSA.117 B.10.- Base Matemtica DES120 APNDICE C - Criptosistemas...123 C.1.- Clasificacin.125 II
  • 7. C.2.- Criptosistemas Simtricos126 C.3.- Criptosistemas Asimtricos..129 ndices extraordinarios...135 I.1.- Cuadros de Cdigo137 I.2.- Figuras...138 I.3.- Tablas141 I.4.- Ecuaciones.141 BIBLIOGRAFA - REFERENCIA....143 B.R.1.- Criptografa...145 B.R.2.- Programacin148 B.R.3.- Matemticas..150 B.R.4.- Software similar150 B.R.5.- Diseo...150 III
  • 8. PREFACIO Este proyecto fue elegido a razn del inters propio sobre la realizacin software y la curiosidad aportada por el mundo de la criptografa. Se le ofrece la posibilidad al lector de adentrarse en ambos campos, con los siguientes captulos que comprenden la documentacin propia del software criptogrfico realizado. A su vez, existe una documentacin extra formada por una serie de apndices para complementar los captulos, unos ndices extraordinarios y la bibliografareferencia consultada al final del libro. En el Captulo 1, se ofrece una breve introduccin comentando cuando y por qu se usa la criptografa, los sistemas ms adecuados segn el uso y los inconvenientes de la criptografa. Se exponen cuales fueron los objetivos y requisitos para la realizacin del software. Se detallan las fases de trabajo, as como la configuracin del sistema necesaria para ello. Adems se indica esquemticamente las relaciones existentes entre las clases obtenidas al final del trabajo. En el Captulo 2, se explican todos y cada uno de los algoritmos criptogrficos realizados, a travs de una introduccin al criptosistema, su generacin de claves, cifrado y descifrado. Se detallan las partes ms relevantes del cdigo implementado de estos, se indican sus ventajas e inconvenientes, y uso actual que acarrean. El final de este captulo hace referencia a las implementaciones para la gestin de claves de cada uno de los algoritmos desarrollados. En el Captulo 3, se describe la aplicacin software haciendo uso de los diferentes mens que la componen. En principio se presenta una visin general de la aplicacin, para luego ir adentrndose en las posibilidades criptogrficas que ofrece gracias a los mens caractersticos de cada criptosistema implementado. En el Captulo 4, se exponen las conclusiones del desarrollo de la aplicacin, sus posibles mejoras y adaptaciones futuras, as como sus limitaciones de uso. En el Apndice A, se encuentra el manual de usuario de la aplicacin. Se muestran los pasos comunes e independientes de la tarea criptogrfica a realizar y los pasos necesarios para el uso concreto de cada tarea, de forma que pueda sacrsele el mximo partido. Este apndice complementa al captulo 3. En el Apndice B, se presenta un breve resumen histrico de la criptografa y los conceptos presupuestos necesarios de cara a este proyecto. Estos conceptos son los referentes a terminologa usada, algoritmo criptogrfico, canal, claves y bases matemticas. Este apndice complementa al captulo 1 y 2, y se recomienda su lectura en caso de dficit de conocimiento criptogrfico bsico del lector.
  • 9. En el Apndice C, se introduce la clasificacin de los criptosistemas junto con sus bases y se listan muy brevemente los ms importantes. Este apndice complementa al captulo 1, 2, 4, y se recomienda su lectura. En los ndices Extraordinarios, aparecen las listas con referencia de pgina de cuadros de cdigo, figuras, tablas y ecuaciones mostradas a lo largo del libro. En la Bibliografa-Referencia, se indica toda la documentacin sobre criptografa, programacin, matemticas, aplicaciones similares a la realizada y programas para el diseo, que se consult en enlaces de Internet y libros, as como libros extras para la profundizacin sobre temas criptogrficos. Junto a la este libro se obsequia un CD-ROM con el libro para su consulta en formato pdf, el cdigo fuente y el ejecutable del software realizado.
  • 10. CAPTULO 1 - Introduccin -
  • 11. Proyecto Fin de Carrera Captulo 1: Introduccin CAPTULO 1 Introduccin. La seguridad y proteccin de datos se han convertido en cuestiones de vital importancia para las comunicaciones electrnicas. Desde navegar por Internet hasta hacer la compra, requieren de criptosistemas y protocolos que oculten la informacin, verifiquen quienes somos, con quien nos comunicamos y que canal es seguro. Esta seguridad y proteccin es necesaria para la expansin y desarroll de la sociedad de la informacin, puesto que provee los medios para que se realicen comunicaciones legales sin necesidad de la presencia fsica del individuo y permiten guardar informacin deseada para acceso y uso exclusivo de estos. Las ramas al frente del uso de la criptografa son bsicamente las formadas por los sistemas simtricos y los asimtricos (vase Apndice C). Los simtricos, son aquellos algoritmos criptogrficos que usan una clave para todo, motivo por el cual se conocen tambin como sistemas de clave secreta. Estos algoritmos son rpidos, hacen uso de recursos matemticos bsicos y fueron los primeros en integrarse. Sin embargo, desde la aparicin de los sistemas asimtricos estn en decadencia. Los asimtricos, son aquellos algoritmos criptogrficos que usan una clave pblica para cifrar y otra privada para descifrar, motivo por el cual se conocen tambin como sistemas de clave pblica. Estos algoritmos son ms lentos, debido al uso de una base matemtica compleja, y requieren mayores recursos de procesado, pero aaden mayor seguridad y proteccin que los sistemas simtricos. En principio, el uso de los asimtricos estaba muy limitado en la dcada de los 70s y 80s, pero a medida que aumentaba la capacidad computacional, iban suplantando en algunos mbitos a los algoritmos simtricos. En la actualidad se suelen usar los algoritmos de clave asimtrica para asegurar la identificacin de usuarios y proteger las transmisiones de pequeas cantidades de datos. Los simtricos se usan para la proteccin de grandes cantidades de datos estancos. Y el uso conjunto de ambos para proteger las transmisiones de grandes cantidades de datos. Puede suscitar que el uso de la criptografa implique solo ventajas: mensajes por e-mails, archivos compartidos, formularios y contraseas en la navegacin por Internet. Todos ellos cifrados para salvar las intercepciones en las comunicaciones. Pero quienes interceptan las comunicaciones? En la mayora de los casos es el sistema operativo y el antivirus, pero lo hacen para nuestra defensa. El problema radica en que los archivos cifrados que contengan virus y/o troyanos1 no sern detectados, por lo que una vez dentro de la computadora pueden hacer inservible la seguridad y proteccin proporcionada por nuestro software criptogrfico. De poco servir el uso de claves y cifrados cuando estemos trabajando con un troyano instalado ya que puede interceptarlo todo. En definitiva, para una seguridad y proteccin de datos, no solo basta con el uso de software criptogrfico adecuado, este debe ser complementado 1 Programa malicioso capaz de alojarse en computadoras y permitir el acceso a usuarios externos, a travs de una red local o de Internet, con el fin de recabar informacin o controlar remotamente a la mquina anfitriona -3-
  • 12. Aplicacin Software para el Desarrollo de Tareas Criptogrficas con un antivirus y firewall2. Adems se requiere por parte del usuario de un uso responsable y consciente de la informacin, as como el conocimiento del comportamiento del sistema operativo en lo que se refiere a las comunicaciones externas. 1.1.- Objetivos. El objetivo de este proyecto ha sido la realizacin de una aplicacin software, para proporcionar la capacidad de cifrar y descifrar texto de forma muy intuitiva. Para ello, se ha diseado una interfaz que permite realizar las operaciones criptogrficas ms conocidas y sus correspondientes gestiones de claves, a travs de un entorno similar al de un editor de texto. Los criptosistemas soportados por esta aplicacin son de clave pblica y clave privada, concretamente: el algoritmo RSA, el DES y el TDES, as como el protocolo RSA Digital. La complejidad de estos ha sido excluida del usuario final. 1.2.- Requisitos. Estos objetivos fueron llevados a cabo partiendo de una serie de requisitos fundamentales. El proyecto deba requerir ejecucin multiplataforma, evitar dependencias a software externo, uso de software libre para su realizacin y disponer de la extraccin de la complejidad criptogrfica, La necesidad de crear un software multiplataforma fue tomada como requisito para permitir la total compatibilidad con cualquier sistema operativo y entorno, dejando de esta forma al usuario la eleccin del SO en el que se sienta ms cmodo para ejecutar el software y evitando atarlo a uno en concreto. Relacionado con lo anterior se encuentra la ausencia de dependencia a otros programas, pues a parte de no depender del SO3, no utiliza ni funciones, ni procedimientos de otras aplicaciones, por lo que el software realizado es autosuficiente e independiente. Con vistas al desarrollo, se descart el uso de software de propietario, optando por el software libre, es decir, libreras del proyecto GNU4, lo que tiene unas repercusiones legales inmediatas, y econmicas, tanto para uso personal como para comercial. Sin embargo con respecto al aspecto que presenta la aplicacin desarrollada, se utiliz una librera (de cdigo abierto) de interfaces grficas de usuario que requiere de licencia para uso comercial, por lo que no es software libre, pero si permite su uso dentro del presente marco de desarrollo. 2 Corta Fuegos, elemento de hardware o software utilizado en una red de computadoras para controlar las comunicaciones, permitindolas o prohibindolas segn las polticas de red que haya definido la organizacin responsable de la red. 3 Que no dependa del SO quiere decir: que puede ejecutarse en cualquier sistema operativo, pero no por si solo. 4 Proyecto cuya filosofa es la de desarrollar y compartir un sistema, programas, libreras de cdigo abierto y uso libre (B.R.2.12). -4-
  • 13. Captulo 1: Introduccin El ltimo requisito importante con el que se cont fue el descarte del acceso a la configuracin de parmetros irrelevantes. Esto disminuy con consideracin, la complejidad de manejo del proceso criptogrfico de cara al usuario final. 1.3.- Fases del Trabajo. El desarrollo de este proyecto ha constado de 5 fases claramente diferenciadas. En ellas se han tratado aspectos como implementaciones, control de errores, incorporacin y adaptacin de libreras, comunicacin con el usuario y mejoras que iban surgiendo a medida que aumentaba el cdigo. 1.3.1.- Implementacin de la clase RSA y la clase DES en modo consola usando C++. La Implementacin de la clase RSA y la clase DES en modo consola usando C++ fue la fase de inicio desde donde se empez buscando y estudiando sobre la Criptografa bsica en general, a travs de Wikipedias5. Tambin para un aporte ms extenso se recurri a la lectura del libro, Tcnicas Criptogrficas de Proteccin de Datos [B.R.1.1]. Tras su lectura, se opt por uno de los algoritmos criptogrficos a implementar, el RSA. Eleccin debida no solo a la visin que ofrece el libro de sencillez y potencia, sino a que en cualquiera de las Wikipedias consultadas tambin se detallaba a este algoritmo como el ms conocido y usado de los sistemas de clave pblica, el ms rpido de ellos, presentando todas las ventajas de los sistemas asimtricos e incluyendo la firma digital. Por lo que el RSA forma uno de los pilares de la criptografa y de este proyecto [B.R.1.29-1.31]. Una vez hecha la eleccin del algoritmo criptogrfico, se pas a la eleccin del lenguaje de programacin para implementarlo. Parte importante en la cual influy la opinin de amigos programadores y los leves conocimientos previos sobre el lenguaje C, Python y el usado en MatLab [B.R.2.1-2.3]. La opcin de MatLab fue descartada, en primer lugar por no ser software libre y por no permitir el control y la versatilidad que permiten lenguajes como C y Java, no son comparables, MatLab es una herramienta matemtica que incorpora un lenguaje adaptado especfico que carece de la multitud de libreras como las disponibles para C y Java. Adems se ralentiza al trabajar con nmero desproporcionadamente enormes (claves) o en el caso no permite su uso. Tambin en los sucesivos trabajos que se hicieron con MatLab (fuera del margen de este proyecto) se constat las escasas opciones de cara a formar una interfaz grfica para el usuario, aspecto esttico y de manejo que constituye gran parte del xito de las aplicaciones. Otra opcin ms reida, fue la posibilidad de hacer la implementacin del RSA en Java ,Python o C. Lgicamente los programadores consultados defendan su lenguaje de mayor uso, coincidiendo en que Java y Python son ms sencillos 5 Documentacin-Libreras online aportada, seleccionada y mantenida por usuarios de Internet de forma libre y gratuita. -5-
  • 14. Aplicacin Software para el Desarrollo de Tareas Criptogrficas que C, pero al ser lenguajes interpretados son ms lentos y exigen gran cantidad de recursos, especialmente RAM y procesador (el cual no era problema con el ordenador disponible). Los lenguajes interpretados no necesitan de compilador sirviendo as para cualquier plataforma o sistema operativo Pero como para C existen compiladores para todo, pues tampoco esto representaba ningn problema. Por lo que en principio parecan estar todos los lenguajes empatados, sin embargo, si lo que se quiere es aprender uno que facilite el salto al resto (objetivo como programador en potencia interesante), C seria la eleccin adecuada como base. Si saltamos de C a Python o Java es mucho ms sencillo que al contrario y concretamente si se quiere pasar de Python a C, resulta algo complicado, pues Python deja muchas lagunas a su propia interpretacin. Python es muy rpido de programar y el ms sencillo, pero permite multitud de acciones que en los otros lenguajes daran errores. Adems cada uno de los programadores consultados haba programado o programaba en C, y todos ellos coincidan en que ese lenguaje es el ms verstil para controlarlo todo (bajo y alto nivel), aunque para cosas especificas podra ser necesario otro que resultase ms rpido y sencillo. C aparte de que produce cdigos muy eficientes, proporciona modularidad. Est considerado como el lenguaje de programacin universal y si existen bibliotecas para lo que sea en un lenguaje concreto, es seguro de que existirn en C, algo por ejemplo muy interesante con vistas al trabajo con nmeros enormes. Teniendo el lenguaje y el algoritmo a implementar, ya solo quedaba encontrar un entorno de desarrollo. Este fue el puesto a disputar por el CodeBlocks [B.R.2.6] y el Dev-Cpp [B.R.2.5]. IDEs para C/C++, de software libre y con el compilador integrado MinGW [B.R.2.7]; compilador que permite compilar las libreras del proyecto GNU en Windows y las APIs6 de Microsoft. Tanto una IDE como la otra, disponen de interfaces similares, simples y fciles de usar. nicamente influyeron en la eleccin mnimos detalles de esttica recargados e idioma, pues la configuracin del rea de trabajo y la imposicin del ingls como nico idioma en el CodeBlocks, hicieron al Dev-Cpp nuestro entorno de desarrollo integrado preferido. Tambin se vio por encima la posibilidad de Visual C++, pero qued rpidamente descartado porque VC++ est especialmente diseado para el desarrollo y depuracin de cdigo escrito para las API's de MS (Microsoft Systems) y no queremos que nuestro software dependa de este. Disponiendo ya de todas las herramientas necesarias, se hizo la primera implementacin, el RSA en modo consola con un men bsico para la navegacin entre las posibilidades que se ofreca (Figura 1.1). Se implementaron varias funciones necesarias dentro del RSA como son el clculo de un nmero primo y el mnimo comn divisor con Euclides. Tambin fueron necesarias muchas otras para el correcto funcionamiento del proceso de cifrado y descifrado, as como para la visualizacin del men. Las cabeceras de estas funciones y procedimientos, se detallan en el Cuadro de Cdigo 1.0, no obstante evitamos de poner todo el cdigo pues se trata de 281 lneas de implementacin obsoleta, y solo algunas bases se mantienen en el desarrollo final. Las partes ms relevantes referentes al RSA se vern con detalle en el Captulo 2. 6 La API es la Interfaz de Programacin de Interfaces, es decir, el conjunto de funciones y procedimientos que ofrece cierta librera para ser utilizada por otro software con capacidad de abstraccin. -6-
  • 15. Captulo 1: Introduccin Figura 1.1: Men consola RSA (1 Versin de la Aplicacin desarrollada) void MostrarMenu(); //muestra el men de la Figura 1.1 bool EsPrimo(int numero); //usada en Generar_Claves int Mcd_con_Euclides(int a, int b); //usada en Generar_Claves void Generar_Claves(unsigned int &e, unsigned int &n, unsigned int &d); //calcula las claves void LeerMensaje(TCadena &mensaje); //entrada texto void EscribirMensaje(TCadena mensaje); //salida texto void EscribirCifrado(TArrayN mensaje_cifrado, unsigned int i); //salida texto cifrado void EscribirDescifrado(TArrayN mensaje_descifrado, unsigned int n_car); //salida descifrado void Cifrar_Mensaje(unsigned int e, unsigned int n, unsigned int &n_car, TCadena mensaje, TArrayN &mensaje_cifrado); //cifra con RSA void Descifrar_Mensaje(TArrayN mensaje_cifrado,unsigned int n, unsigned int n_car);//descifra void CargarFichero(); //carga y muestra un txt Cuadro de Cdigo 1.1: Cabecera de funciones y procedimientos de la 1 Versin de la Aplicacin. De entre todas las funciones y procedimientos, nicamente se encontraron dos problemas a destacar. Uno dentro del procedimiento Generar_Claves. Donde hubo errores conceptuales en el clculo del nmero inverso modular, para la clave privada, que haca que no se pudiera recuperar el texto en claro. Y el otro referente al control de Overflows7 en Cifrar_Mensaje y Descifrar_Mensaje. Solucionados gracias a ir aplicando el clculo del resto a sucesivos productos en vez de aplicarlo a una exponencial al final (Cuadro de Cdigo 1.2). while(jvaciar();//para los limites de la lista dLimitesLista->ponerNombre(tr("Seleccione los parmetros para buscar los primos")); mpz_class minList=1000;//valor por defecto para el comienzo de bsqueda mpz_class cantidad=10;//valor por defecto para la cantidad de primos dados de encontrar dLimitesLista->setInferior(QString::fromStdString(minList.get_str(10))); dLimitesLista->setCantidad(QString::fromStdString(cantidad.get_str(10))); dLimitesLista->exec();//debemos seleccionar los parmetros de bsqueda if(dLimitesLista->getReady()){//si se acept continuamos minList=dLimitesLista->getInferior(); cantidad=dLimitesLista->getCantidad(); mpz_class i=0; while(ivaciar(); dParametroEnRSA->ponerNombre(tr("Elija un nmero primo de la lista P")); dParametroEnRSA->ponerLista(listaPrimosCarP); dParametroEnRSA->exec(); if(dParametroEnRSA->listo()){ //Guardamos QString como mpz_class rsa->p.set_str(dParametroEnRSA->extraer().toAscii().data(),10); labelP->setText(dParametroEnRSA->extraer());//ponemos el texto en labelP botonP->setEnabled(false);//desactivamos este paso botonQ->setEnabled(true);//activamos el siguiente paso } } } Cuadro de Cdigo 2.1: Clculo de la lista de nmeros primos -38-
  • 45. Captulo 2: Algoritmos Criptogrficos Desarrollados A la vista del mtodo implementado, resulta muy interesante situarlo dentro de la clase en la Figura 1.8, para ver en que nivel del proceso se encuentra y entender su comportamiento. Bsicamente se va buscando los primos consecutivos a partir de un lmite inferior. La lista de primos estar completa cuando se complete la cantidad definida por el usuario. El resto de cdigo hace referencia a los ajustes de etiquetas, botones y otros parmetros que no influyen de manera directa con el procesado matemtico del criptosistema. Su uso adecua la interfaz y la correcta comunicacin con el usuario, estos no se omiten por su aporte a la comprensin del proceso, pero se comentarn tan solo a lnea de cdigo21. Obtenidos p y q, se calcula su producto, es decir, la clave pblica que se utilizara para el cifrado y el descifrado n. Su implementacin en el Cuadro de Cdigo 2.2., se resume en una lnea. void MiGenerarRSA::calcularN(){ rsa->n= rsa->p*rsa->q; labelN->setText(QString::fromStdString(rsa->n.get_str(10)));//ponemos como texto en labelN botonN->setEnabled(false); botonE->setEnabled(true);//desactivamos N, activamos E } Cuadro de Cdigo 2.2: Clculo del producto de los nmeros primos (clave pblica n) El siguiente paso es la eleccin de la clave pblica e, presentada en una lista. Para ello es necesario el clculo previo de (n ) (vase la Expresin 2.1). Esta clave debe cumplir la condicin de primo relativo con (n ) (solo as tendr inversa modular y se podr recuperar la seal ms adelante). As e debe cumplir: 1 < e < (n ) y no tener ningn nmero menor que lo divida. Utilizando el mximo comn divisor con Euclides en su versin iterativa (vase Cuadro de Cdigo 2.3), se hizo una primera implementacin al servicio de e. Debido a la lentitud de este mtodo con forme se manejaban nmeros ms grandes, se hizo uso de una funcin especifica aportada por GMP [B.R.2.14]. Las claves pblicas obtenidas con esa funcin, se almacenarn en una lista segn el Cuadro de Cdigo 2.4, para la posterior eleccin de e. mpz_class MiRsa::mcdEuclides(mpz_class a, mpz_class b){ mpz_class t; while(a>0){ t=a; a=b%a; b=t; } return b; } Cuadro de Cdigo 2.3: Mnimo Comn Divisor por Euclides en su forma iterativa El par de claves pblicas que deber transmitir el usuario o que debern colocarse en una red pblica, estar formado por la eleccin de la clave pblica n (segn los primos) y de la clave pblica e (seleccionada de la lista). 21 Esta aclaracin es igualmente valida para el resto de los mtodos comentados, por lo que se omitir en los subsecuentes Cuadros de Cdigo. -39-
  • 46. Aplicacin Software para el Desarrollo de Tareas Criptogrficas void MiGenerarRSA::elegirE(){ mpz_class o=(rsa->p-1)*(rsa->q-1); QStringList listaClavesE;//lista de posibles claves pblicas e, almacenada como carcter dLimitesLista->vaciar();//para los limites de la lista dLimitesLista->ponerNombre(tr("Seleccione los parmetros para buscar las claves pblicas E")); mpz_class minList=1000;//valor por defecto para el comienzo de bsqueda mpz_class cantidad=10;//valor por defecto para la cantidad de primos dados de encontrar dLimitesLista->setInferior(QString::fromStdString(minList.get_str(10))); dLimitesLista->setCantidad(QString::fromStdString(cantidad.get_str(10))); dLimitesLista->exec();//debemos seleccionar los parmetros de bsqueda if(dLimitesLista->getReady()){//si se acept continuamos minList=dLimitesLista->getInferior(); cantidad=dLimitesLista->getCantidad(); mpz_class gcd;//para el mximo comn divisor mpz_class i=0; while((ivaciar(); dParametroEnRSA->ponerNombre("Elija una Clave Pblica de la lista"); dParametroEnRSA->ponerLista(listaClavesE); dParametroEnRSA->exec(); if(dParametroEnRSA->listo()){ //Guardamos QString como mpz_class rsa->e.set_str(dParametroEnRSA->extraer().toAscii().data(),10); labelE->setText(dParametroEnRSA->extraer());//ponemos el texto en labelP botonE->setEnabled(false);//desactivamos este paso botonD->setEnabled(true);//activamos el siguiente paso } } } Cuadro de Cdigo 2.4: Clculo de la lista de claves pblicas e Lo siguiente es el clculo de la inversa de la clave elegida e, a la que se le llamar d, esta ser la clave privada. Su cometido junto con n es el descifrado. Para su clculo, el cual es posible gracias a la comprobacin de su existencia en el Cuadro de Cdigo 2.4, se tiene que despejar d de la siguiente expresin: de 1(mod (n)) (2.2) Este caso, el de la clave privada en la generacin de claves en RSA, se traduce, al igual que los anteriores pasos, literalmente a nivel de programacin. Su mtodo esta presentado en el Cuadro de Cdigo 2.5. -40-
  • 47. Captulo 2: Algoritmos Criptogrficos Desarrollados En primer lugar, se hizo uso de un bucle para la clave privada d, que multiplicada por la clave pblica e modulo phi resultase 1. El inconveniente de la lentitud que presentaba este proceso para el clculo de la inversa, propino es uso de un mtodo especifico de GMP. void MiGenerarRSA::calcularD(){ mpz_class o=(rsa->p-1)*(rsa->q-1); //Calculamos la inversa de e y la almacenamos en d mpz_invert(rsa->d.get_mpz_t(),rsa->e.get_mpz_t(),o.get_mpz_t()); labelD->setText(QString::fromStdString(rsa->d.get_str(10)));//ponemos en labelP botonD->setEnabled(false);//desactivamos este paso aceptar->setEnabled(true);//activamos el boton que verifica terminado } Cuadro de Cdigo 2.5: Clculo de la clave privada d Resumiendo, se tiene un nmero e (un exponente) que sale de (n ) , un nmero d (otro exponente) que sale de (n ) y el nmero n (un modulo). Como ya se ha comentado en varias ocasiones con e y n se puede cifrar y con d y n se puede descifrar, con lo que ya no es necesario el generador de claves, (n ) . Si alguien quisiera generar nuestra clave privada de nuevo, tendra que recuperar (n ) . Y es aqu donde radica la seguridad del RSA, en la imposibilidad de factorizar para recuperar el generador. Si alguien quisiera recuperar (n ) para sacar la clave privada calculando la inversa de la pblica, solo conoce n, no conoce p ni q. As que tendra que empezar a dividir n entre nmeros primos gigantes para adivinar p y q y luego poder hacer (p-1)(q-1) que es (n ) . Lo cual presenta dos dificultades, una es que ir dividiendo requiere muchos recursos, y otra es saber si el nmero por el que se divide es primo, por lo que la factorizacin de n (que as se llama a encontrar p y q) se vuelve un problema intratable. En caso de duda para este y otros apartados se recomienda el Apndice B, donde se presenta la base criptogrfica bsica, as como la matemtica. Concretamente para el sistema RSA vase el Apartado 9 del Apndice B. 2.1.3 Cifrado. Para cifrar, lo nico que se hace es elevar lo que se quiere cifrar a e (el exponente de la clave pblica) y calcular su modulo n, es decir, segn la expresin: c m e (mod n) (2.3) El paso a nivel de programacin del cifrado (Cuadro de Cdigo 2.6.), no es tan inmediato como en la generacin de claves, pudiendo dar problemas como los -41-
  • 48. Aplicacin Software para el Desarrollo de Tareas Criptogrficas vistos en el Captulo 1, Apartado 1.3.1. La implementacin del cifrado parte de los caracteres que conforman el mensaje. Coge sus estados numricos elevndolos dentro de un bucle a razn de e, mientras se va multiplicando los resultado sucesivos y se calcula el modulo n en cada vuelta del bucle. Al final, cada nmero obtenido correspondiente al cifrado de un carcter, es almacenado dentro de una lista como cadena de caracteres numricos decimales para su posterior muestra. La misma implementacin (vase Cuadro de Cdigo 1.2), fue sustituida en las ltimas fases del proyecto por su anloga en GMP, mpz_powm, aumentando la velocidad en el proceso. QStringList MiRsa::encriptar(QString mensaje){ mpz_class encriptado[mensaje.size()];//array de mpz_class para almacenar el encriptado QStringList encriptadoQStrList;//lista de QString para almacenar los car Encriptados mpz_class carClaro;//para los caracteres del mensaje en unicode //Encriptamos tal que ((mensaje)^e)mod n for(int i=0;i
  • 49. Captulo 2: Algoritmos Criptogrficos Desarrollados representados como listas de caracteres. Se quiere obtener el nmero en el cdigo Unicode que lo representaba, para adjuntarlo todo (carcter a carcter recuperado) en la cadena que se devuelve. QString MiRsa::desencriptar(QStringList encriptadoList){ //Para el desencriptado mpz_class desencriptado[encriptadoList.size()];//array de mpz_class para almacenar el desencriptado QString desencriptadoQStr;//QString para almacenar los car Desencriptados mpz_class carCifrado;//para los caracteres cifrados //Desencriptamos tal que ((mensaje)^d)mod n for(int i=0;i
  • 50. Aplicacin Software para el Desarrollo de Tareas Criptogrficas Continuando con la propiedad de recuperacin del mensaje en RSA, la cual, como acto de fe se dio por valida, se expone su demostracin a travs del siguiente diagrama representado en la Figura 2.2. En ella se ha omitido el modulo n para los clculos al no sufrir cambios durante el proceso. e Partiendo del cifrado, sustituimos el valor de este en la expresin 2.4 c=m m = (me ) d Quedando el descifrado tal y como se muestra aqu. d e mod (n) = 1 Utilizando la propiedad de que e y d son inversa d e = k (n) + 1 Escribimos la expresin de esta forma para usarla al final Por ltimo aplicando reglas matemticas normales y la siguiente propiedad: a ( n ) = 1 Obtenemos m m = m ed = m k ( n ) +1 = ( m ( n ) ) k m1 = 1k m Figura 2.2: Demostracin del Descifrado en RSA 2.1.5 Conclusiones. Las conclusiones tras el desarrollo y estudio de RSA, demuestran que como mtodo criptogrfico a implementar es bastante sencillo si se tienen los conocimientos de programacin y bases criptogrficas necesarias. Referente a las ventajas y desventajas, algunas de las cuales se comentaron en el Captulo 1, apartado 1.3.1, se puntualizan en los subsecuentes renglones terminando con un esbozo que explica el uso actual de tal algoritmo. Las ventajas que dotan a RSA de entre las mejores elecciones para la proteccin y seguridad de datos, se deben a que dentro de los algoritmos asimtricos se muestra como el ms rpido. A su vez gracias a las longitudes de claves usadas en la actualidad es prcticamente imposible romperlo, es decir, no hay tiempo ni recursos como para que sea factible. Su uso no requiere de claves secretas para el cifrado del mensaje, evitando -44-
  • 51. Captulo 2: Algoritmos Criptogrficos Desarrollados la interseccin de terceros en el canal proporcionando. En el caso de trabajo junto a algoritmos simtricos habilita un medio seguro (vase Apartado 2.4, RSA Digital). Otro uso que tambin acomete es el firmado digital, evitando las suplantaciones de identidad. Permite adems la deteccin de alteraciones y errores en la transmisin de documentos. Por todo ello, RSA conforma un estndar internacional y de facto en la industria del software. Sin embargo, cuenta con dos desventajas mnimas a destacar. La primera es propia de su grupo, pues al ser un algoritmo asimtrico es mucho ms lento y complejo, precio que se paga a favor de un mayor aporte de seguridad. La segunda es la producida por el uso indebido de longitudes de clave pequeas. Esto convierte al RSA en una simple herramienta de transposicin, es decir, si (m)^e es menor a la longitud de la codificacin ASCII, UNICODE RSA no aporta seguridad. Para demostrar semejante desventaja se recurre al siguiente ejemplo: Con la base de codificacin UTF22 para la representacin de los caracteres a cifrar por RSA (en cuyo caso la mxima longitud representable sera 2^24) y del uso de una red pblica que proporciona la clave pblica e=3. Se quiere cifrar el mensaje en claro formado por los caracteres a,b y c (97,98,99 respectivamente usando UTF). El cifrado resulta (97)^3=912673, (98)^3=941192, (99)^3=970299, para cada uno de los cuales el valor numrico es menor que 2^24. Entonces sabiendo el exponente e (pblico) y el mdulo n (pblico) se puede recuperar el mensaje sin necesidad de la clave privada d. Si la clave e hubiese sido por ejemplo 329, no se hubiese producido esa transposicin pues se sale del mximo valor representable por la codificacin y hubiese sido necesario aplicar el proceso de la Figura 2.2, el descifrado mediante n y d. Para concluir con este algoritmo criptogrfico desarrollado, comentar que la utilizacin del sistema RSA est experimentando una rpida expansin y puede llegar a ser omnipresente en los prximos aos. Hoy en da, se utiliza en una gran variedad de productos, plataformas e industrias del mundo entero. Se encuentra en productos comerciales de software y se planea una expansin mayor. RSA est incluido en sistemas Apple, Microsoft, Netscape, Novell, Sun, actuales y futuros. En cuanto al hardware, el sistema RSA se puede encontrar en telfonos seguros, en tarjetas de redes Ethernet y en tarjetas inteligentes. El RSA se utiliza tambin en muchos organismos estatales, grandes compaas, laboratorios y universidades. La adopcin del sistema RSA parece utilizarse ms rpidamente para autenticacin (firmas digitales) que para una mayor privacidad (encriptado). Quiz, esto se deba a que los productos para autenticacin son ms fciles de exportar. En los que se refiere a los estndares usados, el sistema RSA forma parte de muchos estndares oficiales en todo el mundo. El estndar ISO23 9796, incluye al RSA como un algoritmo criptogrfico, como as tambin el CCITT24, mediante el estndar de seguridad X.509. Tambin forma parte de los estndares de SWIFT25, de los estndares de ETEBAC 5 del sistema financiero francs y del 22 Forma de representar caracteres UNICODE e ISO/IEC 10646 como una serie de palabras de 16 y 24 bits. ISO, Organizacin Internacional de Estndares. 24 CCITT, Comit Internacional de Consulta en Telegrafa y Telefona. 25 SWIFT, Sociedad para las Telecomunicaciones Financieras Interbancarias Mundiales. 23 -45-
  • 52. Aplicacin Software para el Desarrollo de Tareas Criptogrficas borrador del estndar ANSI X9.31 del sistema bancario estadounidense.Tambin el estndar australiano de administracin de claves, AS2805.6.5.3 especifica RSA. Otros estndares estn en etapa de desarrollo y se anunciarn dentro de los prximos aos. Se espera que muchos incluyan el RSA como sistema adicional o recomendado para autenticacin y/o privacidad. 2.2 DES 2.2.1 Introduccin. Como ya se ha comentado brevemente en las Fases de Trabajo (Apartado 1.3), el DES es un algoritmo simtrico cifrador de bloques que utiliza una clave secreta para todo que debe proporcionarse por un canal seguro. En este caso, el algoritmo toma la informacin en bloques de 64 bits produciendo un bloque de texto cifrado tambin de 64 bits (vase Apartado 2.2.3., Figura 2.4). Este sistema fue desarrollado por Horst Feistel, cuando trabajaba para IBM. Las claves utilizadas por DES son de 56 bits, aunque se suelen distribuir en forma de un nmero de 64 bits, donde cada octavo bit (el bit menos significativo) de cada uno de los ocho bytes de la clave es un bit de paridad (Figura 2.3). Byte 1 Byte 2 7 bits Byte 8 7 bits Paridad Paridad 7 bits Paridad Figura 2.3: Clave DES 2.2.2 Generacin de Claves. La generacin de claves del algoritmo DES, la cual tuvo su primera implementacin en las primera aplicacin DES desarrollada para consola, no tiene ningn secreto, pues restringiendo su longitud a 64 bits es la que el usuario desee. Esta clave es la que comnmente se llamar clave original, a partir de la cual se generan una serie de subclaves de ronda distintas Ki (segn el Cuadro de Cdigo 2.8), que se irn combinando con la parte derecha expandida del bloque de mensaje segn se muestra en la Figura 2.5 al final del Apartado 2.2.4 para obtener el bloque cifrado despus de la inversin al final de la ltima ronda. Aunque para algunos lectores puede quedar explicado con los breves comentarios en las lneas de cdigo y el uso de declaraciones intuitivas, el cuadro anterior deja muchas lagunas si no se esta acostumbrado a interpretar cdigo. Se expresa de manera ms detallada en los subsecuentes renglones, lo que se tradujo a nivel de programacin de las tablas y expresiones presentadas en las referencias [B.R.1.1 y B.R.1.4-1.7]. -46-
  • 53. Captulo 2: Algoritmos Criptogrficos Desarrollados void MiDes::keygen(){//Partiendo de la clave[64] aplicamos una serie de permutaciones //Realizamos una permutacin fija de clave[64] para distribuir todos los bits quedndonos solo //con 56 de estos (se descartan los de paridad), (pemutacionTipo1()) permutacionTipo1();//primera permutacin. Obtenemos permuTipo1[56] int i,k=0; for(i=0;i