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
Aplicación software para el desarrollo de tareas criptográficas
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.
Citation preview
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
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