SlideShare une entreprise Scribd logo
1  sur  164
Télécharger pour lire hors ligne
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
ESCUELA TÉCNICA SUPERIOR DE
INGENIERÍA DE TELECOMUNICACIÓN
UNIVERSIDAD DE MÁLAGA

Titulación: Ingeniería Telecomunicación

Reunido el tribunal examinador en el día de la fecha, constituido por:
D./Dª.__________________________________________________________
D./Dª.__________________________________________________________
D./Dª.__________________________________________________________
Para juzgar el Proyecto Fin de Carrera titulado:

APLICACIÓN SOFTWARE PARA EL DESARROLLO DE
TAREAS CRIPTOGRÁFICAS
Del alumno D. Génesis García Morilla
Dirigido por Dª. Mª Carmen Clemente Medina

ACORDÓ POR

______________________________________ OTORGAR LA

CALIFICACIÓN DE _______________________________________________

Y, para que conste, se extiende firmada por los componentes del tribunal, la
presente diligencia

Málaga, a ______ de __________________ de 2008

El/La Presidente/a

El/La Vocal

El/La Secretario/a

Fdo.: _________________ Fdo.: _________________ Fdo.: _________________
UNIVERSIDAD DE MÁLAGA
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA
DE TELECOMUNICACIÓN

APLICACIÓN SOFWARE PARA EL DESARROLLO DE
TAREAS CRIPTOGRÁFICAS
REALIZADO POR:
Génesis García Morilla
DIRIGIDO POR:
Mª Carmen Clemente Medina

DEPARTAMENTO DE: Ingeniería de Comunicaciones
TITULACIÓN:

Ingeniería Técnica de Telecomunicación
Sistemas de Telecomunicación

PALABRAS CLAVES:

Criptografía, RSA, DES, TDES, RSA Digital, Software,
Lenguaje C++, Gráficos Qt, Precisión Aritmética GMP.

RESUMEN:

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.

Málaga, Febrero de 2008
A mis padres Antonio y Paqui,
Y a mis hermanas Lidia y Anay.
Índice
PREFACIO
CAPÍTULO 1 - Introducción…………………………………..1
1.1.- Objetivos…………………………………………….4
1.2.- Requisitos……………………………………………4
1.3.- Fases del trabajo……………………………………...5
1.4.- Configuración del sistema…………………………..27
1.4.1.- Linux………………………………………………………..28
1.4.2.- Windows XP………………………………………………..28
1.4.3.- Mac OS……………………………………………………..30

1.5.- Relación entre clases………………………………...30

CAPÍTULO 2 - Algoritmos Criptográficos Desarrollados…..35
2.1.- RSA………………………………………………….37
2.1.1.- Introducción………………………………………………..37
2.1.2.- Generación de claves………………………………………38
2.1.3.- Cifrado……………………………………………………..41
2.1.4.- Descifrado………………………………………………….42
2.1.5.- Conclusiones……………………………………………….44

2.2.- DES………………………………………………….46
2.2.1.- Introducción………………………………………………..46
2.2.2.- Generación de claves………………………………………46
2.2.3.- Cifrado……………………………………………………..48
2.2.4.- Descifrado………………………………………………….53
2.2.5.- Conclusiones……………………………………………….53

2.3.- Triple DES…………………………………………..57
2.3.1.- Introducción………………………………………………..57
2.3.2.- Cifrado y descifrado………………………………………..57
2.3.3.- Conclusiones……………………………………………….58

2.4.- RSA Digital…………………………………………60
2.4.1.- Introducción………………………………………………..60
2.4.2.- Cifrado y descifrado………………………………………..61
2.4.3.- Firmado digital……………………………………………..61
2.4.4.- Conclusiones……………………………………………….62
I
2.5.- Gestión de Claves de los Algoritmos Desarrollados..63
2.5.1.- Introducción………………………………………………..63
2.5.2.- Gestión de claves en RSA…………………………………63
2.5.3.- Gestión de claves en DES y TDES………………………..66
2.5.3.- Gestión de claves en RSA Digital…………………………66

CAPÍTULO 3 - Descripción de la Aplicación………………...69
3.1.- Introducción…………………………………………71
3.2.- Pantalla Principal……………………………………71
3.3.- Menú Algoritmo Criptográfico……………………...75
3.3.1- Menú RSA………………………………………………….76
3.3.2- Menú DES y TDES………………………………...………83
3.3.3- Menú RSA Digital………………………………………….84

CAPÍTULO 4 - Conclusiones, líneas futuras y limitaciones...89
4.1.- Conclusiones………………………………………...91
4.2.- Líneas futuras………………………………………..92
4.3.- Limitaciones…………………………………………95

APÉNDICE 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 Digital………………………………105

APÉNDICE B - Conceptos básicos sobre Criptografía…….109
B.1.- Historia…………………………………………….111
B.2.- Criptología…………………………………………113
B.3.- Terminología………………………………………113
B.4.- Canal de información……………………………...114
B.5.- Criptosistemas……………………………………..115
B.6.- Algoritmo criptográfico…………………………...116
B.7.- Clave criptográfica………………………………...116
B.8.- Longitud de clave………………………………….117
B.9.- Base Matemática RSA…………………………….117
B.10.- Base Matemática DES……………………………120

APÉNDICE C - Criptosistemas.……………………………..123
C.1.- Clasificación……………………………………….125
II
C.2.- Criptosistemas Simétricos…………………………126
C.3.- Criptosistemas Asimétricos………………………..129

Índices extraordinarios………………………………………...135
I.1.- Cuadros de Código…………………………………137
I.2.- Figuras……………………………………………...138
I.3.- Tablas………………………………………………141
I.4.- Ecuaciones………………………………………….141

BIBLIOGRAFÍA - REFERENCIA….………………………...143
B.R.1.- Criptografía……………………………………...145
B.R.2.- Programación……………………………………148
B.R.3.- Matemáticas……………………………………..150
B.R.4.- Software similar…………………………………150
B.R.5.- Diseño…………………………………………...150

III
PREFACIO
Este proyecto fue elegido a razón del interés propio sobre la realización
software y la curiosidad aportada por el mundo de la criptografía. Se le ofrece la
posibilidad al lector de adentrarse en ambos campos, con los siguientes capítulos
que comprenden la documentación propia del software criptográfico realizado. A
su vez, existe una documentación extra formada por una serie de apéndices para
complementar los capítulos, unos índices extraordinarios y la bibliografíareferencia consultada al final del libro.
En el Capítulo 1, se ofrece una breve introducción comentando cuando y
por qué se usa la criptografía, los sistemas más adecuados según el uso y los
inconvenientes de la criptografía. Se exponen cuales fueron los objetivos y
requisitos para la realización del software. Se detallan las fases de trabajo, así
como la configuración del sistema necesaria para ello. Además se indica
esquemáticamente las relaciones existentes entre las clases obtenidas al final del
trabajo.
En el Capítulo 2, se explican todos y cada uno de los algoritmos
criptográficos realizados, a través de una introducción al criptosistema, su
generación de claves, cifrado y descifrado. Se detallan las partes más relevantes
del código implementado de estos, se indican sus ventajas e inconvenientes, y
uso actual que acarrean. El final de este capítulo hace referencia a las
implementaciones para la gestión de claves de cada uno de los algoritmos
desarrollados.
En el Capítulo 3, se describe la aplicación software haciendo uso de los
diferentes menús que la componen. En principio se presenta una visión general
de la aplicación, para luego ir adentrándose en las posibilidades criptográficas que
ofrece gracias a los menús característicos de cada criptosistema implementado.
En el Capítulo 4, se exponen las conclusiones del desarrollo de la
aplicación,
sus posibles mejoras y adaptaciones futuras, así como sus
limitaciones de uso.
En el Apéndice A, se encuentra el manual de usuario de la aplicación. Se
muestran los pasos comunes e independientes de la tarea criptográfica a realizar
y los pasos necesarios para el uso concreto de cada tarea, de forma que pueda
sacársele el máximo partido. Este apéndice complementa al capítulo 3.
En el Apéndice B, se presenta un breve resumen histórico de la criptografía
y los conceptos presupuestos necesarios de cara a este proyecto. Estos
conceptos son los referentes a terminología usada, algoritmo criptográfico, canal,
claves y bases matemáticas. Este apéndice complementa al capítulo 1 y 2, y se
recomienda su lectura en caso de déficit de conocimiento criptográfico básico del
lector.
En el Apéndice C, se introduce la clasificación de los criptosistemas junto
con sus bases y se listan muy brevemente los más importantes. Este apéndice
complementa al capítulo 1, 2, 4, y se recomienda su lectura.
En los Índices Extraordinarios, aparecen las listas con referencia de página
de cuadros de código, figuras, tablas y ecuaciones mostradas a lo largo del libro.
En la Bibliografía-Referencia, se indica toda la documentación sobre
criptografía, programación, matemáticas, aplicaciones similares a la realizada y
programas para el diseño, que se consultó en enlaces de Internet y libros, así
como libros extras para la profundización sobre temas criptográficos.
Junto a la este libro se obsequia un CD-ROM con el libro para su consulta
en formato pdf, el código fuente y el ejecutable del software realizado.
CAPÍTULO 1
- Introducción -
Proyecto Fin de Carrera

Capítulo 1: Introducción

CAPÍTULO 1 – Introducción.
La seguridad y protección de datos se han convertido en cuestiones de vital
importancia para las comunicaciones electrónicas. Desde navegar por Internet
hasta hacer la compra, requieren de criptosistemas y protocolos que oculten la
información, verifiquen quienes somos, con quien nos comunicamos y que canal
es seguro. Esta seguridad y protección es necesaria para la expansión y
desarrolló de la sociedad de la información, puesto que provee los medios para
que se realicen comunicaciones legales sin necesidad de la presencia física del
individuo y permiten guardar información deseada para acceso y uso exclusivo de
estos.
Las ramas al frente del uso de la criptografía son básicamente las formadas
por los sistemas simétricos y los asimétricos (véase Apéndice C). Los simétricos,
son aquellos algoritmos criptográficos que usan una clave para todo, motivo por el
cual se conocen también como sistemas de clave secreta. Estos algoritmos son
rápidos, hacen uso de recursos matemáticos básicos y fueron los primeros en
integrarse. Sin embargo, desde la aparición de los sistemas asimétricos están en
decadencia. Los asimétricos, son aquellos algoritmos criptográficos que usan una
clave pública para cifrar y otra privada para descifrar, motivo por el cual se
conocen también como sistemas de clave pública. Estos algoritmos son más
lentos, debido al uso de una base matemática compleja, y requieren mayores
recursos de procesado, pero añaden mayor seguridad y protección que los
sistemas simétricos. En principio, el uso de los asimétricos estaba muy limitado en
la década de los 70s y 80s, pero a medida que aumentaba la capacidad
computacional, iban suplantando en algunos ámbitos a los algoritmos simétricos.
En la actualidad se suelen usar los algoritmos de clave asimétrica para asegurar
la identificación de usuarios y proteger las transmisiones de pequeñas cantidades
de datos. Los simétricos se usan para la protección 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 criptografía implique solo ventajas:
mensajes por e-mails, archivos compartidos, formularios y contraseñas en la
navegación por Internet…. Todos ellos cifrados para salvar las intercepciones en
las comunicaciones. ¿Pero quienes interceptan las comunicaciones? En la
mayoría 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 serán detectados, por lo que una vez dentro de la
computadora pueden hacer inservible la seguridad y protección proporcionada por
nuestro software criptográfico. 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 protección de datos, no solo basta con
el uso de software criptográfico adecuado, este debe ser complementado

1 Programa malicioso capaz de alojarse en computadoras y permitir el acceso a usuarios externos, a través de
una red local o de Internet, con el fin de recabar información o controlar remotamente a la máquina anfitriona

-3-
Aplicación Software para el Desarrollo de Tareas Criptográficas

con un antivirus y firewall2. Además se requiere por parte del usuario de un uso
responsable y consciente de la información, 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 realización de una aplicación
software, para proporcionar la capacidad de cifrar y descifrar texto de forma muy
intuitiva.
Para ello, se ha diseñado una interfaz que permite realizar las operaciones
criptográficas más conocidas y sus correspondientes gestiones de claves, a
través de un entorno similar al de un editor de texto. Los criptosistemas
soportados por esta aplicación son de clave pública 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 debía requerir ejecución multiplataforma, evitar
dependencias a software externo, uso de software libre para su realización y
disponer de la extracción de la complejidad criptográfica,
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 elección del SO en el que se sienta
más cómodo 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, librerías del proyecto GNU4, lo que tiene
unas repercusiones legales inmediatas, y económicas, tanto para uso personal
como para comercial. Sin embargo con respecto al aspecto que presenta la
aplicación desarrollada, se utilizó una librería (de código abierto) de interfaces
gráficas 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, permitiéndolas o prohibiéndolas según las políticas de red que haya definido la organización
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 filosofía es la de desarrollar y compartir un sistema, programas, librerías… de código abierto
y uso libre (B.R.2.12).

-4-
Capítulo 1: Introducción

El último requisito importante con el que se contó fue el descarte del
acceso a la configuración de parámetros irrelevantes. Esto disminuyó con
consideración, la complejidad de manejo del proceso criptográfico 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, incorporación y adaptación de librerías, comunicación con el usuario y
mejoras que iban surgiendo a medida que aumentaba el código.

1.3.1.- Implementación de la clase RSA y la clase DES en
modo consola usando C++.
La Implementación 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 Criptografía básica en general, a través de Wikipedias5. También para un
aporte más extenso se recurrió a la lectura del libro, Técnicas Criptográficas de
Protección de Datos [B.R.1.1]. Tras su lectura, se optó por uno de los algoritmos
criptográficos a implementar, el RSA. Elección debida no solo a la visión que
ofrece el libro de sencillez y potencia, sino a que en cualquiera de las Wikipedias
consultadas también se detallaba a este algoritmo como el más conocido y usado
de los sistemas de clave pública, el más rápido de ellos, presentando todas las
ventajas de los sistemas asimétricos e incluyendo la firma digital. Por lo que el
RSA forma uno de los pilares de la criptografía y de este proyecto [B.R.1.29-1.31].
Una vez hecha la elección del algoritmo criptográfico, se pasó a la elección
del lenguaje de programación para implementarlo. Parte importante en la cual
influyó la opinión 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 opción 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 matemática que incorpora
un lenguaje adaptado específico que carece de la multitud de librerías como las
disponibles para C y Java. Además se ralentiza al trabajar con número
desproporcionadamente enormes (claves) o en el caso no permite su uso.
También 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
gráfica para el usuario, aspecto estético y de manejo que constituye gran parte del
éxito de las aplicaciones.
Otra opción más reñida, fue la posibilidad de hacer la implementación del
RSA en Java ,Python o C. Lógicamente los programadores consultados defendían
su lenguaje de mayor uso, coincidiendo en que Java y Python son más sencillos
5

Documentación-Librerías online aportada, seleccionada y mantenida por usuarios de Internet de forma libre
y gratuita.

-5-
Aplicación Software para el Desarrollo de Tareas Criptográficas

que C, pero al ser lenguajes interpretados son más 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 ningún
problema. Por lo que en principio parecían 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 elección
adecuada como base. Si saltamos de C a Python o Java es mucho más 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 interpretación. Python
es muy rápido de programar y el más sencillo, pero permite multitud de acciones
que en los otros lenguajes darían errores. Además cada uno de los
programadores consultados había programado o programaba en C, y todos ellos
coincidían en que ese lenguaje es el más versátil para controlarlo todo (bajo y alto
nivel), aunque para cosas especificas podría ser necesario otro que resultase más
rápido y sencillo. C aparte de que produce códigos muy eficientes, proporciona
modularidad. Está considerado como el lenguaje de programación universal y si
existen bibliotecas para lo que sea en un lenguaje concreto, es seguro de que
existirán en C, algo por ejemplo muy interesante con vistas al trabajo con
números 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 librerías del proyecto GNU en Windows y las API’s6 de Microsoft. Tanto una
IDE como la otra, disponen de interfaces similares, simples y fáciles de usar.
Únicamente influyeron en la elección mínimos detalles de estética recargados e
idioma, pues la configuración del área de trabajo y la imposición del inglés como
único idioma en el CodeBlocks, hicieron al Dev-Cpp nuestro entorno de desarrollo
integrado preferido.
También se vio por encima la posibilidad de Visual C++, pero quedó
rápidamente descartado porque VC++ está especialmente diseñado para el
desarrollo y depuración de código 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
implementación, el RSA en modo consola con un menú básico para la navegación
entre las posibilidades que se ofrecía (Figura 1.1). Se implementaron varias
funciones necesarias dentro del RSA como son el cálculo de un número primo y el
mínimo común divisor con Euclides. También fueron necesarias muchas otras
para el correcto funcionamiento del proceso de cifrado y descifrado, así como
para la visualización del menú. Las cabeceras de estas funciones y
procedimientos, se detallan en el Cuadro de Código 1.0, no obstante evitamos de
poner todo el código pues se trata de 281 líneas de implementación obsoleta, y
solo algunas bases se mantienen en el desarrollo final. Las partes más relevantes
referentes al RSA se verán con detalle en el Capítulo 2.
6

La API es la Interfaz de Programación de Interfaces, es decir, el conjunto de funciones y procedimientos
que ofrece cierta librería para ser utilizada por otro software con capacidad de abstracción.

-6-
Capítulo 1: Introducción

Figura 1.1: Menú consola RSA (1ª Versión de la Aplicación 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 Código 1.1: Cabecera de funciones y procedimientos de la 1ª Versión de la Aplicación.

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 cálculo del número inverso modular, para
la clave privada, que hacía 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 cálculo del resto a sucesivos productos en
vez de aplicarlo a una exponencial al final (Cuadro de Código 1.2).

while(j<=e){ mensaje_cifrado[i]=(mensaje_cifrado[i]*(int(mensaje[i])))%n; j=j+1; }
Cuadro de Código 1.2: Cálculo del resto “%” a sucesivos productos en Cifrar_Mensaje.

Solucionadas estas deficiencias se buscó otro algoritmo para implementar
que no fuese asimétrico como el RSA. Así que dentro de los algoritmos
criptográficos simétricos sobre los que se hace especialmente hincapié en el libro
de Técnicas Criptográficas de Protección de Datos [B.R.1.1], recurrimos al que es
sin duda el más conocido de los sistemas de clave privada, el DES. Este aunque
ya no se considere un sistema seguro, multitud de descendientes comparten
similitudes con el, lo que lo hace muy interesante. Representa la base del Triple
DES, el cual si es seguro, pues la aplicación sucesiva de este algoritmo mejora su
seguridad. Presenta todas las ventajas de los sistemas simétricos, y su
combinación con sistemas asimétricos permite topologías como las usadas en
7

Sobre carga de datos, salimos del margen de datos representable para el tipo definido.

-7-
Aplicación Software para el Desarrollo de Tareas Criptográficas

SSL y PGP8. Por lo que a nivel de estudio el DES se considera una base dentro
de la criptografía y otro de los criptosistemas que no podría faltar en la aplicación
desarrollada.
Con el objetivo de ampliar el menú anterior, añadiendo las opciones
referidas a la utilización del DES junto con las del RSA, a priori se hizo una
implementación aparte donde tuviéramos el DES cifrando y descifrando
perfectamente. Una vez comprobada la ausencia de errores se adaptaría al menú
realizado.
En la primera implementación del DES, se trató la parte de encriptación y
constaba únicamente de la introducción del mensaje a cifrar, usando una clave
interna predefinida para ocultarlo (Figura 1.2).

Figura 1.2: Cifrado DES (1ª Versión de la Aplicación DES)

En lo que se refiere a la implementación del código, las operaciones
utilizadas en el criptosistema DES son mucho mas sencillas que las usadas en el
RSA, sin embargo, el proceso hasta obtener el mensaje cifrado es mucho más
largo9. Por ello, se subdividió el proceso de encriptado en varios subprocesos
para facilitar la programación y la reutilización de código. Las cabeceras de estos
se detallan en el Cuadro de Código 1.3. El número de líneas de código del que se
constaba eran de 453 y las librerías utilizadas al igual que con RSA son las
básicas de C necesarias para el uso de streams y entrada y salida de datos, entre
otras. Las partes más relevantes referentes al DES a la hora de implementarlo en
su versión final se verán junto a la teoría con detalle en el Capítulo 2.
Durante el desarrollo de esta primera versión del DES en la encriptación,
se encontraron mayor número de problemas que con la versión del RSA.
Problemas en su mayoría en el traspaso de los procedimientos del DES descritos
por el libro al código C, pues con muchas líneas de código y sin errores de
compilación, un simple error al adaptar, resultaba tedioso de encontrar. Algunos
de ellos fueron los debidos a los desplazamientos necesarios dentro del
procedimiento para las claves de ronda “generarClavesDeRonda” que producían
claves inválidas para cifrar el mensaje, y que tuvo que ser desmenuzado paso a
paso para encontrar el error existente en las variables controladoras. Se puede
8

SSL (Seguridad de la Capa de Transporte, B.R.4.2) y PGP (Privacidad Bastante Buena, B.R.4.1), protocolo
y programa, respectivamente, cuya finalidad es proteger la información distribuida a través de Internet. PGP
a parte proporciona protección para datos que no estén en transito.
9
En DES el proceso es más largo, tenemos más líneas de código, pero al utilizar operaciones sencillas como
sustituciones, permutaciones y XOR, el tiempo de proceso es menor que en RSA, donde tenemos menos
líneas de código pero operaciones más complejas, tales como el calculo exponencial y el mínimo común
múltiplo entre otras.

-8-
Capítulo 1: Introducción

nombrar también el referente a cuando se programaba la Función de Feistel10, en
el entrecruce de las partes del mensaje, concretamente en el entrecruce que se
hacia en la última vuelta, el cual no debía hacerse y que conllevo cambios
innecesarios hasta su detección. Por comentar uno más, destacar el error dentro
del procedimiento “sustitución” donde se dispone de unas tablas fijas
denominadas S-Box las cuales a partir de una entrada especificada por una fila y
columna sustituyen unos bits por otros, aquí el problema fue que las coordenadas
se mantenían siempre constantes independientemente del valor de entrada, por lo
cual la salida no podía ser correcta, gracias a la depuración y visualización paso a
paso del proceso, este y otros muchos problemas se solucionaron.

void permutacionTipo1(); //usada en generarClavesDeRonda
void permutacionTipo2(); //usada en generarClavesDeRonda
void generarClavesDeRonda(); //calcula las claves de ronda a partir de una clave predefinida
void permutacionInicial(); //facilita la carga de los bits de información en bloques de 8 bits
void expansion(); //expansión de la parte derecha del mensaje
void xorTipo1E(int); //xor de la expansión de la parte derecha con la clave de ronda
void sustitucion(); //sustitución de unos bits por otros según tablas definidas
void permutacion(); //permutación fija
void xorTipo2(); //xor de la parte izquierda con el resultado de las trasformaciones de la parte
derecha
void inversa(); //inversa de la permutación Inicial
Cuadro de Código 1.3: Cabecera de procedimientos de la 1ª Versión de la Aplicación DES.

Terminada la parte del DES para la encriptación, quedaba poder recuperar
el mensaje desencriptandolo. Parte en principio sin aparente dificultad pues el
DES al estar basado en una Función de Feistel tiene la propiedad de que si se
aplica de nuevo el proceso se obtiene en mensaje en claro. De este modo se
completo el criptosistema DES presentándolo en modo consola con una
comunicación entrada salida básica (Figura 1.3).
Al ser el proceso prácticamente el mismo, podemos reutilizar todo el
código anterior (para las cabeceras de los procedimientos, véase Cuadro de
Código 1.3), resultando mínimo el aumento de número de líneas. Y solucionados
los problemas anteriores no tendría por que haberlos aquí. Únicamente existió
uno debido a copiar el algoritmo de encriptado en el de desencriptado sin hacer
variaciones. Pues al ir haciendo la “xorTipo1E” de la expansión de la parte
derecha con la consecuente copia de subClave (clave de ronda) tenía que ir hacia
atrás, en vez de cómo en el encriptado. Habría que usar “subClave[16-ronda][i]”
en vez de lo que se tenía “subClave[ronda-1][i]”. Se diseñó el procedimiento
“xorTipo1D” para el desencriptado dejando “xorTipo1E” para el encriptado.

10

Se trata de un algoritmo criptográfico simétrico por rondas. 1º Se selecciona una cadena N, de 64 o 128
bits, se divide en 2 subcadenas, L (izquierda) y R (derecha), de igual longitud (N/2). 2º Se toma una función
F y una subclave Ki. 3º Se realizan una serie de operaciones con F y Ki y con L o R (solo uno de ellos). 4º La
cadena obtenida se cambia por la cadena con la que no se han realizado operaciones y se siguen haciendo
rondas.

-9-
Aplicación Software para el Desarrollo de Tareas Criptográficas

Figura 1.3: Cifrado y Descifrado DES (2ª Versión de la Aplicación DES)

Llegados a este punto y debido a la cantidad de código generado, y de
funciones y procesos que debieran reutilizarse, se optó por el traspaso a una
programación orientada a objetos. Se pasó de C a C++, lo cual no presentó
dificultad alguna con la ayuda de la documentación necesaria [B.R.2.4]. De este
modo se creó la clase DES y la clase RSA con sus respectivos métodos. El
siguiente paso sería incluir ambas dentro de un nivel superior con integración de
gráficos.
Todas las elaboraciones destacables llevadas a cabo durante esta fase
inicial de implementación de la clase RSA y la clase DES en modo consola
usando C++, se presenta en forma de esquema en la Figura 1.4.

1.3.2.- Adaptación de RSA y DES a Qt.
Las limitaciones gráficas y de movilidad que ofrecían las aplicaciones
desarrolladas (Menú RSA y DES), así como la organización tediosa del código a
la hora de querer añadir nuevas funcionalidades, propinó la optimización de este a
la vez que la búsqueda de una librería gráfica de usuario. El objetivo era
transformar lo que teníamos a una aplicación de escritorio, mucho más intuitiva
que las de modo consola.
La biblioteca para desarrollar interfaces gráficas de usuario tenía que
cumplir con los mismos requisitos que se plantearon al principio. Posibilidad de
integración multiplataforma, ausencia de dependencias y ser software libre.
Requisitos que cumple la librería Qt de Trolltech [B.R.2.10-2.11], la que es sin
duda la mejor librería dentro de su campo y cuyo uso está muy extendido en
plataformas Linux.
Hoy en día y gracias a las adaptaciones que se hicieron para facilitar el uso
de Qt en Windows, sin necesidad de configurar una IDE o trabajar con Cygwin o
Msys11, ocurre que entren cada vez más programadores a formar parte de los
desarrolladores que trabajan con Qt y MS.
Es necesario aclarar que el requisito de ser software libre no es del todo
aplicable para Qt, pues esta requiere de licencia para uso comercial. No obstante,
si permite su uso para el ámbito personal y para el presente marco de desarrollo.
11

Entornos de desarrollo muy similar al de Unix que permiten el uso de herramientas de desarrollo GNU
(autotools, make, gcc…) en Windows (B.R.2.8-B.R.2.9).

-10-
Capítulo 1: Introducción

FASE 1

Técnicas
Criptográficas de
protección de datos

Documentación
sobre
Criptosistemas

3ª Edición Rama

Wikipedias

Páginas y Foros
dedicados

Elección de Algoritmo RSA

Lenguajes de
Programación

Documentación sobre
Recursos para su implementación

Librerías

Elección de C en Dev-Cpp

Apuntes de C

Implementación del RSA en
Modo Consola

Software de
Capacidad
numérica e
IDEs

Fundamentos
Matemáticos
necesarios

Elección de otro Algoritmo: DES

Apuntes de C

Implementación del DES en
Modo Consola

Fundamentos
Matemáticos
necesarios

Cambio del lenguaje de programación
Apuntes de
C++

Traspaso de Implementaciones de C a C++
Figura 1.4: Esquema del proceso de trabajo para la
Implementación de la clase RSA y la clase DES en modo consola usando C++

A la hora de adaptar el código a Qt se substrayeron los cometidos referidos
a la entrada y salida de datos en la comunicación con el usuario, dejando
únicamente las variables y métodos propiamente de los criptosistemas. La clase
-11-
Aplicación Software para el Desarrollo de Tareas Criptográficas

RSA y la clase DES obtenidas no son las versiones definitivas. A parte se
prescinde de mostrar todo el código y se muestran únicamente las definiciones de
las clases (Cuadro de Código 1.4 y 1.5, “mirsa.h” y “mides.h” respectivamente),
junto con breves comentarios, ya que en el Capítulo 2 se entrará en más detalle.

#ifndef MIRSA_H
#define MIRSA_H
//Las clases definidas por Qt empiezan por “Q” seguidas de un nombre identificativo en inglés
#include <QWidget>
class QString; //igual que un include, pero hace la compilación más rápida, solo para punteros
class MiRsa : public QWidget{
Q_OBJECT //referente a los meta datos, necesario en todas las clases Qt
public:
MiRsa(QWidget *parent=0); //constructor
//Funciones
QStringList encriptar(QString); //devuelve un QStringList con el encriptado
QString desencriptar(QStringList); //devuelve un QString con el desencriptado
bool esPrimo(int); //devuelve si un número es primo
int mcdEuclides(int, int); //devuelve el máximo común divisor de dos números
//Variables
int p,q; //números primos
int e,n; //clave Pública

int d; //clave Privada
};
#endif
Cuadro de Código 1.4: Definición de la clase “mirsa” con Qt.

Aunque la declaración de la clase DES pueda parecer muy distinta a la de
RSA, no lo es. Ambas declaraciones contienen en su parte pública los métodos
que deben caracterizar a todo algoritmo criptográfico: una función para encriptar y
otra para desencriptar. Particularmente en la definición de la clase DES toda la
parte privada es básicamente la descrita en el Cuadro de Código 1.3, con la única
diferencia de que se han creado funciones nuevas para la gestión de claves y de
que en este caso mostramos las variables y arrays que se usan en cada parte del
proceso. La definición de la clase RSA es pública íntegramente. Estas decisiones
en la implementación fueron tomadas con vistas a una idea concreta para la
gestión de claves, basada en un diálogo de menús emergentes que guiara al
usuario hasta obtener el mensaje cifrado o descifrado (véase Fase 4: Apartado
1.3.4).
Se debe aclarar que la ausencia de destructores de clase se sustenta en la
utilización únicamente de punteros a objetos de las clases Qt. Estos poseen la
propiedad de llamar a sus propios destructores. Para cualquier otro tipo de
objetos que utilicen memoria dinámica es necesario declarar e implementar un
destructor, de lo contrario se generarian espacios de memoria inutilizables.
Todas las elaboraciones destacables llevadas a cabo durante esta segunda
fase, la fase de adaptación de la clase RSA y la clase DES a Qt, se presentan en
forma de esquema en la Figura 1.5.
-12-
Capítulo 1: Introducción
#ifndef MIDES_H
#define MIDES_H
#include <QWidget>
#include <QString>
class MiDes : public QWidget{
Q_OBJECT //referente a los meta datos, necesario en todas las clases Qt
public:
MiDes(QWidget *parent=0); //constructor
//Funciones
QStringList encriptar(QString); //devuelve un QStringList con el encriptado
QString desencriptar(QStringList); //devuelve un QString con el desencriptado
bool adaptarDefinidaOk(unsigned int); //sustituye clave interna por la definida
private:
//Funciones
void permutaciónInicial(); //facilita carga en bloques (usada en Cifrado-Descifrado)
void Expansión(); //hace una expansión de la parte derecha (E-D 16 Rondas)
void xorTipo1E(int); // XOR de la expansión de la parte derecha con las subclaves (E 16 R)
void xorTipo1D(int); // XOR de la expansión de la parte derecha con las subclaves (D 16 R)
void sustitución(); //hace una sustitución haciendo uso de las S-Box (E-D 16 Rondas)
void permutación(); //cambio simple de unos bits por otros (E-D 16 Rondas)
void xorTipo2(); //XOR con la parte derecha y la izquierda actuales (E-D 16 Rondas)
void inversa(); //invierte la permutación inicial (E-D)
void permutaciónTipo1(); //usada en Keygen
void permutaciónTipo2(); //usada en keygen
void keygen(); //genera las subClaves de rondas
void restaurarCPrivada(); //vuelve a poner la clave interna
//Variables auxiliares
int permuTipo1[56]; //para la permutacionTipo1 de claveIni[64]
int mitadA_pT1[28]; //para la primera mitad de permuTipo1[56]
int mitadB_pT1[28]; //para la segunda mitad de permuTipo1[56]
int a[48]; //para la permutacionTipo2 de mitadA_pT1[28] y mitadB_pT2[28]
int subClave[16][48]; //para las subClaves de las rondas, subClave[0][k]=a[k]...
int mensajeEnBinario[64]; //para el mensaje en formato binario
int permuInicial[64]; //para facilitar la carga de mensajeEnBinario[64] en bloques de 8 bits
int left[32]; //para la parte izquierda del mensajeEnBinario una vez hecha la permuInicial
int right[32]; //para la parte derecha del mensajeEnBinario una vez hecha la permuInicial
int temp[64]; //para las partes left[32] y right[32]
int expansion[48]; //para la expansion de la parte derecha right[32]
int xor1[48]; //para la xorTipo1, xor con la expansion de la parte derecha y las sublclaves
int sus[32]; //para la sustitucion mediante las S-Box de xor1
int per[32]; //para la permutacion de sus[32]
int xor2[32]; //para la xorTipo2 de left[32] y per[32]
int inv[8][8];//para la inversa de la concatenación de left[32] y right[32], terminadas las rond
int clave[64]; //para alojar la clave que se utilizara, definida o interior
};
#endif
Cuadro de Código 1.5: Definición de la clase “mides” con Qt.

1.3.3.- Diseño y desarrollo de la Interfaz.
Las limitaciones de un diseño para consola suscitaron la elección de la
-13-
Aplicación Software para el Desarrollo de Tareas Criptográficas

biblioteca Qt (Apartado 1.3.2). Sin embargo antes de implementar la interfaz se
deben tener claras ideas como la funcionalidad que se ofrecerá de cara al usuario
final y el compromiso entre diseño atrayente y ameno, y la facilidad de uso que se
pretenden, pues tampoco se quiere complicar al usuario con una recarga de
elementos de valor estético únicamente.
Un triunfo asegurado seria imitar el estilo de la mayoría de las aplicaciones
de escritorio. Estilo que todo el mundo usa y que proporciona cierto conocimiento
sobre donde pueden estar las opciones necesarias del programa. Este es el caso
de navegadores, procesadores de texto, programas de diseño… entre otros, que
comparten los elementos básicos característicos de toda aplicación: la Barra de
Menús, la Barra de Herramientas, el Área de Trabajo y la Barra de Estado. No
obstante se optó por la opción arriesgada de innovar. Para ello se creo un Widget
(elemento base en Qt) formado por varias partes movibles que reaccionaban al
pulsar ciertos botones y al situarse sobre ciertas partes de la interfaz (1ª Versión
de la Aplicación conjunta RSA-DES). Básicamente era una barra que guiaba al
usuario a través de las dos posibles opciones para lo que en principio se
implemento: el encriptado con RSA o DES. Esta aplicación se abría (efecto muy
conseguido) al seleccionar cada opción mostrando las nuevas posibilidades en su
caso, y en el paso de un estado a otro, la barra se cerraba mostrando un texto
explicativo de la operación que se estaba realizando. El aspecto que puede
suscitar a primera vista es el de un reproductor de sonido (Figura 1.6. Barra
Dinámica) y la navegación que proporcionaba no fue la esperada, así como la
falta de espacio a la hora de querer incorporar nuevas acciones por tratarse de un
diseño tan compacto. Dimensiones que a su vez daban la impresión de que la
aplicación aportarse pocos recursos. Por todos estos motivos se paro el proceso
de desarrollo y se busco una interfaz más común. Una interfaz básica de
aplicación de escritorio como la que se comentaba al principio del párrafo.
La nueva aplicación de escritorio diseñada (2ª Versión de la Aplicación
conjunta RSA-DES) integra las propiedades y herramientas básicas de un editor
de texto. En principio solo permitía un área para redactar y las funciones en su
estado simple de cifrar y descifrar. Paso a paso se fueron implementando las
funciones de copiar, cortar, pegar, seleccionar… realizables por menús, teclado o
ratón. Esta última para el caso de seleccionar proporciona gran comodidad, pues
mediante doble clic o arrastrando el cursor se pueden indicar de forma muy rápida
las partes del texto escrito a las que se desea aplicarle uno de los dos
criptosistema. En base a las ejecuciones, la ejecución del DES era inmediata,
pues se sustentaba en una clave fija predefinida. Sin embargo para la ejecución
del RSA se configuró un menú en el que poder elegir los números primos
necesarios de una lista, así como el resto de parámetros necesarios (claves
públicas n y e, y clave privada d).
Cada parte que se iba realizando era testeada en ejecución real y hasta
que no funcionase perfectamente no se pasaba a la siguiente implementación. Se
hacía un constante bombardeo de pruebas que en muchos casos requerían
repetir pasos o volver al estado anterior, obligando a borrar todo y empezar de
nuevo. Así por motivos de realización apareció la necesidad de un “deshacer” en
el menú principal, ya que cada vez que se quería repetir una de las fases había
que repetir todos los pasos de nuevo. Esta funcionalidad se dejó también para el
usuario final ya que un “deshacer” es muy interesante para cualquier software
(posteriormente también se crearía el “rehacer”).
-14-
Capítulo 1: Introducción

FASE 2

Personal Informático
Desarrolladores de
Interfaces

Documentación
sobre librerías
Gráficas

Foros de
C++

Elección de Qt como librería

Qt Designer

Documentación sobre
Recursos para su implementación

Qt a nivel de
Programación

Elección de Qt a nivel de Programación

www.qtforum.org

Adaptación de RSA a Qt

Referencia de
la API

www.qtforum.org

Adaptación de DES a Qt

Referencia de
la API

Ideas y estructuras para gestión de claves
Figura 1.5: Esquema del proceso de trabajo para la
Adaptación de la clase RSA y la clase DES a Qt

A medida que se avanzaba en el código aparecían más detalles necesarios
de implementar. La posibilidad de guardar y cargar archivos, crear nuevos
documentos, o gestionar la posición y dimensiones de la aplicación para que el
usuario pueda cambiarlas y se mantengan en ese estado para las próximas veces
que se ejecute. Estas y el resto de las acciones junto con el resto de la interfaz
base se pueden ver en su declaración en el Cuadro de Código 1.6, clase
“miproject”, la cual se puede considerar como el “container” de todas las demás
clases existentes de la aplicación, es decir, la clase principal en la que se sujetan
las demás. La parte de la implementación ha sido omitida pues son 520 líneas de
código de las cuales solo se mostraran algunas partes más relevantes en la
siguiente fase de trabajo (Apartado 1.3.4) y en el Capítulo 3.
Gracias al bombardeo de pruebas se pudieron advertir la existencia de
defectos en las implementaciones de RSA y DES desarrolladas en las fases
-15-
Aplicación Software para el Desarrollo de Tareas Criptográficas

anteriores. Defectos como la imposibilidad de recuperar el mensaje en claro en
RSA a partir del texto codificado (en código ASCII). Cuando se calcula el código
de cifrado de una letra (según los parámetros de las claves generadas que se han
seleccionado), este valor puede salirse del máximo representable de la tabla
ASCII. Así actuaría como un cálculo del módulo en función de la longitud máxima
del código y no podríamos saber cuantas vueltas a dado recuperando algo distinto
del mensaje original. Para solventar semejante defecto se paso de la
representación alfabética a la numérica, siendo diferenciada las partes
encriptadas por puntos. Con DES se hizo lo mismo, pero este criptosistema
presentaba aparte otro error debido a un desplazamiento en la codificación en
bloques de 8 bits. Según se seleccionase un texto u otro en DES, si su longitud
no era múltiplo de 8, su resto representaría el número de espacios hasta el
siguiente carácter. Para solventar este otro problema simplemente se sustrajo a la
longitud del descifrado obtenido el resto, eliminándose así todos los posibles
espacios del final.
La definición de la clase “miproject” presentada (Cuadro de Código 1.6),
muestra al igual que en todos los cuadros de código, breves comentarios sobre la
funcionalidad de sus métodos y variables así como el uso de los objetos que
adopta de otras clases. A diferencia del resto de clases en la que existe un
constructor y varias funciones públicas necesarias, aquí solo se presenta el
constructor pues no son necesarios ningún tipo de comportamiento o
configuración, un objeto de esta clase nos da la presentación de la aplicación.
Además se posibilita la opción en el constructor de empezar la aplicación con la
carga de un archivo por defecto.
Al observar el código puede presentar dudas el hecho de que aparezcan
por primera vez métodos con sus cabeceras en inglés, pudiendo definirlas en
español como hasta ahora. La cuestión es que no se puede. No son iguales que
el resto de métodos, pues representan al ámbito de funciones en Qt para el
control de eventos, que pueden ser reimplementadas (cuyas cabeceras son fijas).
Tales eventos como clickeos de ratón, entradas de teclado, eventos comunes de
las aplicaciones como abrir, cerrar… disponen de estos métodos específicos para
tratarlos. Todos ellos permiten utilizar otras funciones existentes en la clase o
reimplementar todo el código en la medida de lo que sea necesario.
Tratándose del diseño de cada botón de la barra de herramientas. Pese a
que Qt ofrece buenos resultados y rápidos para pintar degradados, bordes,
algunos sombreados…, (acabados simples) se debe recordar que su cometido no
es para la realización de dibujos en general, aunque sea una herramienta dentro
del ámbito gráfico. Qt puede permitir acabados de dibujos realmente buenos pero
estos más que nada dependen de la pericia del diseñador, pues para la mayoría
de usuarios de Qt esta tarea resulta extremadamente engorrosa. Es por ello que
las herramientas propias de dibujo de Qt, así como la posibilidad de configuración
mediante StyleSheet (a través de código CSS12) que incorpora, pueden limitar al
diseñador en estos casos particulares, por lo que se opta por herramientas de
diseño gráfico como Gimp (software libre) o Photoshop (software propietario)13,
12

CSS es un lenguaje formal de hojas de estilo en cascada (Cascading Style Sheets) que describe como se va
a mostrar un documento en pantalla. Utilizado para definir la presentación de documentos en HTML o XML
13Aunque las posibilidades de Photoshop (B.R.5.1-5.2), motivadas por inversiones de millones de dólares,
superan con creces a las de Gimp (B.R.5.3), , Gimp gana terreno a paso de gigante gracias a las
colaboraciones que se hacen a través de usuarios y programadores de todo el mundo (Filosofía GNU)

-16-
Capítulo 1: Introducción

para crear los dibujos que irán en botones, barras, o áreas concretas de la
aplicación.

#ifndef MIPROJECT_H
#define MIPROJECT_H
#include <QMainWindow>
class QAction;class QMenu;class QTextEdit;
#include "micriptosistema.h"
class MiProject : public QMainWindow{
Q_OBJECT
public:
MiProject();//constructor base
MiProject(const QString & nombreArchivo);//constructor que carga archivo
protected:
//Función reimplementada
void closeEvent(QCloseEvent *evento);//guarda los settings y aviso guardar cuando cerramos
private slots:
void nuevo();//crea un nuevo archivo
void abrir();//abre un archivo existente con extensión
bool guardar();//permite guardarArchivo (sinTitulo) o guardarComo(!sinTitulo)
bool guardarComo();//guarda el archivo caso de estar ya guardado
void encriptar();//pasos previos al encriptado del texto seleccionado
void encriptando();//encripta con los parámetros seleccionados
void desencriptar();//paso previo al desencriptado del código seleccionado
void desencriptando();//desencripta con la clave privada
void documentoModificado();//pone setWindowModifed(true)
void acercaDeCriptoYenet();//muestra en que consiste la Aplicación
private:
void iniciar();//configuración de parámetros básicos
//Actuan sobre los elementos básicos de la Aplicación
void crearAcciones();//crea las acciones que me permite hacer la Aplicación
void crearMenus();//crea accesos a las acciones en los menús Archivo, Edición...
void crearBarraDeHerramientas();//crea accesos rápidos a las acciones
void crearBarraDeEstados();//crea una barra de información
//Actúan sobre el aspecto de la Aplicación a nivel de usuario
void leerParametros();//lee y pone la pos y el size guardados en settings o la x defecto
void escribirParametros();//escribe la pos y el size que hemos puesto en settings
//Abrir y Guardar
bool posibleSalvar();//salva o no cambios pendientes en el documento
void cargarArchivo(const QString &nombreArchivo);//carga un archivo
bool guardarArchivo(const QString & nombreArchivo);//guarda el archivo donde indiquemos
Cuadro de Código 1.6: Definición de la clase “miproject” con Qt (Parte 1/2).

-17-
Aplicación Software para el Desarrollo de Tareas Criptográficas
//Actuan en el caso de usar RSA
void posibleSalvarClavesRSA();//salva o no las claves públicas generadas
bool guardarClavesPúblicasRSA(const QString nombreArchivo);//guarda n y e
//Actualiza titulo y pone flags de documento modificado a false
void actualizarArchivo(const QString & nombreArchivo);
//Devuelve el nombre del documento
QString darNombreArchivo(const QString & nombreArchivo);
//Para encontrar el archivo fileName de entre los abiertos
MiProject *encontrarMiProject(const QString & nombreArchivo);
//Menus
QMenu *menuArchivo;//contiene acNuevo, acAbrir, acGuardar, acGuardarComo, acCerrarV
y acSalir
QMenu *menuEdicion;//contiene acDeshacer acRehacerac, Cortar, acCopiar, acPegar y
SelectAll
QMenu *menuCriptosistema;//contiene acEncriptar y acDesencriptar
QMenu *menuAyuda;//contiene acAcercaDeCriptoYenet, acAcercaDeRsa y acAcercaDeDes
//Barras de Herramientas
QToolBar *barraArchivo;//contiene acNuevo, acAbrir y acGuardar
QToolBar *barraEdicion;//contiene acDeshacer acRehacerac, Cortar, acCopiar, acPegar y
SelectAll
QToolBar *barraCriptosistema;//contiene acEncriptar y acDesencriptar
//Acciones
QAction *acNuevo;QAction *acAbrir;
QAction *acGuardar;QAction *acGuardarComo;
QAction *acCerrarVentana;QAction *acSalir;
QAction *acDeshacer;QAction *acRehacer;
QAction *acCortar;QAction *acCopiar;QAction *acPegar;
QAction *acSelectAll;
QAction *acEncriptar;QAction *acDesencriptar;
QAction *acAcercaDeCriptoYenet;
//Mi editor de Texto
QTextEdit *editorTexto;
//QStrings
QString text;//para el mensaje a encriptar
QString codigo;//para el codigo a descifrar
QString archivoActual;//nombre del archivo actual
QString archivoCPActual;//nombre del archivo de las claves públicas actuales
//Boleanas
bool sinTitulo;//indica si el documento tiene titulo o no
//Manejadores
QClipboard *portapapeles;//lo utilizamos en encriptar y desencriptar
MiCriptosistema *cripto;//permite encriptar/desencriptar usando rsa o des…
};
#endif
Cuadro de Código 1.6: Definición de la clase “miproject” con Qt (Parte 2/2).

No obstante, para lo que se necesita ambos programas dentro del presente
desarrollo, estos aportan las mismas prestaciones. Se optó por Photoshop (en
-18-
Capítulo 1: Introducción

una versión limitada pero libre, entrando así dentro de los requisitos que se
plantearon para el desarrollo de la aplicación) por ser el software al que se esta
más acostumbrado. Tras la integración de los dibujos en el background de los
botones y finalizada las nuevas implementaciones que propinó la interfaz
seleccionada, se contaba con el aspecto base final de la aplicación.
Todas las elaboraciones destacables llevadas a cabo durante esta tercera
fase, la fase de diseño y desarrollo de la interfaz, se presentan en forma de
esquema en la Figura 1.6.
FASE 3

Diseño
de posibles
Interfaces

Photoshop

Estilo
Barra
Dinámica

Estilo
Aplicación
Windows XP

Mínima Implementación
Elección de Estilo Aplicación Windows XP

www.qtforum.org

Implementación de funciones
básicas de un editor de texto e
incorporación de las propias de
todo sistema criptográfico

Referencia de
la API de Qt

Diseño de botones
Figura 1.6: Esquema del proceso de trabajo para el
Diseño y desarrollo de la Interfaz de la Aplicación

-19-
Aplicación Software para el Desarrollo de Tareas Criptográficas

1.3.4.- Gestión de claves e implementación de la clase TDES
y RSA Digital.
A finales de la fase anterior se consiguió una versión de la aplicación con
las prestaciones que se definieron para el cifrado y descifrado de texto. Sin
embargo la parte del acceso y configuración de las claves necesitaba de una
adecuada implementación para su gestión.
La gestión de claves realizadas para los criptosistemas desarrollados son
diferentes, debido a su naturaleza en las claves. Con el caso de RSA (algoritmo
de clave pública) se usan un par de claves públicas y una clave privada mientras
que para el caso de DES (algoritmo de clave secreta) se usa únicamente una
clave privada.
Especificando para el caso de RSA se han implementado 3 opciones. La
primera de ellas es la posibilidad de Generar las claves. Con sus comienzos en
las primeras fases, pues según se planteó la generación a partir de primos
(“creación desde cero”) es necesario seguir una secuencia característica del RSA
hasta obtener el par de claves públicas y la clave privada, que permiten el cifrado
y descifrado. Diseñadas las elecciones de los números primos, así como el
cálculo del divisor “n”, la elección del exponente “e” y por último del cálculo del
exponente privado “d”, se hicieron dos mejoras en la generación: una necesaria
para solventar la demora en el cálculo del mínimo común divisor y la otra se trató
de la incorporación de un deshacer. En el caso de la primera, el cálculo del “mcd”
presentaba varias posibles implementaciones para su uso, siendo la más
adecuada para realizar en una computadora la referente al método iterativo
[B.R.2.15]. Esta suplanto a la versión formal desarrollada por Euclides que se
tenía.
Terminados los cambios en la implementación del “menú generar”, se
detectó que una vez guardado un documento cifrado, si este se quería descifrar
en otra sesión de la aplicación, no se podía al menos que se repitiera
exactamente el mismo proceso de generar las claves con el que se cifró el
mensaje. Consecuencia que representaba una gran deficiencia, pues no facilitaba
las comunicaciones con usuarios que dispongan del programa, a menos que se
pasen los números primos y las elecciones, lo cual rompería la seguridad. Esta
limitación se solventó gracias a la implementación de un detector de claves
(usadas durante la sesión) que guarda las claves en un archivo a petición del
usuario, y al desarrollo de la segunda opción de gestión de claves implementada
en el “menú cargar”. Esta última, la del “menú cargar”, dispone de una parte en la
que se puede introducir el par de claves públicas de manera manual y en la otra a
través de archivo (cargando el archivo generado con el detector de claves
usadas). También se ideó un “menú sesión” (3ª opción), surgido de manera
automática como consecuencia del detector, pues se vio la necesidad de que en
algún momento el usuario podría desear reutilizar claves de una misma sesión.
Tanto la parte de encriptar como la de desencriptar en RSA disponen de
los mismos menús, pues son igualmente necesarios. Así lo que se hizo fue
reutilizar código y para el caso concreto del desencriptado activar un menú final
en el que se pidiera la clave secreta de usuario para recuperar el mensaje.
-20-
Capítulo 1: Introducción

El otro caso, el de la gestión de claves del criptosistema DES, es bien
distinto. Aquí no existe un proceso para generar la clave privada sustentado en
los entresijos matemáticos, como la multiplicación de primos elevados o las
propiedades de la modularidad al orden de la criptografía. Tampoco son
necesarias unas claves para cifrar y otras para cifrar. Simplemente se define una
clave privada de longitud fija (64 bits) que es utilizada en ambos procesos.
Lo que se hizo fue mantener el recurso de clave implementado en
inversiones anteriores. Es decir, el uso de una clave fija predefinida a nivel de
programación (clave interior). Esta ahora sería útil para una comunicación entre
todos los poseedores del programa, pero no se garantizaría la seguridad por la
intersección de terceros. La que verdaderamente aportaría seguridad fue la
adición de la posibilidad de elegir la clave, mediante la implementación del “menú
definir”.
Otra diferencia con el diálogo de menús de gestión de RSA es que en DES
la parte de cifrado es exactamente la misma que la de descifrado, debido a que se
usa una clave para todo. Para facilitar la navegación a través de estos diálogos
emergentes que guían al usuario, se implementó un “avanzar” y un “retroceder”
que permiten saltar entre las distintas opciones. Se puede ver la declaración de la
clase que controla estos diálogos haciendo la gestión de claves y que también
permite el uso de los criptosistemas en el Cuadro de de Código 1.7. Dicha clase
denominada “micriptosistema” es en la que la clase principal “miproject” delega el
cometido propio del uso de los criptosistemas. La parte de implementación de
“micriptosistema” posee 600 líneas y es la que ha sufrido más incorporaciones y
reajustes durante la realización del software. De esta se introducirán varias partes
de código en el Capítulo 2.
Llegados a este punto y debido al diseño reutilizable de las clases
implementadas, resurgió una idea de implementación aparecida en las primeras
fases de documentación: La implementación de Triple DES. La cual con tan solo
algunos ajustes puede reutilizar todo el código de DES. Ambas declaraciones son
iguales con lo que se puede recordar el Cuadro de Código 1.5. En su
implementación únicamente se aumentó la longitud de clave y se introdujo todo el
proceso de sustituciones, permutaciones y XORs dentro de un bucle de 3 vueltas
que utiliza claves de longitud DES (64bits). Esta clave de 64 bits correspondientes
a trozos de la clave de longitud TDES (192).
La última incorporación al “menú criptosistemas” surgió tras la lectura de un
artículo [B.R.4.1] en el que se comentaba el poder del uso de la criptografía
simétrica y asimétrica usada en las topologías SSL y PGP (brevemente
comentadas en apartados anteriores). Concretamente hablaba del sobre RSA
Digital, un protocolo bastante potente que usa RSA para ocultar la clave privada
de DES y transmitirla, y DES para la comunicación de información. Se
aprovechan las mayores ventajas de cada parte: RSA es lento pero proporciona
un canal seguro y DES es rápido pero no dispone de un canal seguro por lo que
se complementan perfectamente. Así que aprovechando que se tenía
implementada la clase RSA y DES se conformó este protocolo dentro de la clase
“micriptosistema”. No se implemento una clase aparte como con RSA, DES y
TDES porque al tratarse de un protocolo su desarrollo resultaba mucho más
sencillo dentro de la clase “micriptosistema”, cuya estructura requería de mínimos
ajustes que favorecían la incorporación en este sentido.
-21-
Aplicación Software para el Desarrollo de Tareas Criptográficas

Implementada RSA Digital con RSA y DES, no se podía desaprovechar la
oportunidad de incorporar RSA Digital con RSA y TDES habiendo implementado
TDES. Algunas partes referentes a este código dentro de la clase
“micriptosistema” se verán en el Capitulo 2, para las definiciones referentes a RSA
Digital y los objetos de la clase TDES dentro de esta, ver Cuadro de Código 1.7.
Como se puede apreciar en el Cuadro de Código 1.7, cada elemento de la
declaración de la clase “micriptosistema” aparece brevemente comentado al igual
que cualquier otro cuadro de código. Se pueden destacar las similitudes de los
métodos pertenecientes a RSA, DES, TDES y RSA Digital, los cuales permiten la
introducción de valores adecuados, y la comunicación con las respectivas clases
de cada algoritmo mediante los manejadores de objetos declarados al final (RSA
Digital utiliza la combinación de dos de ellos según sea el caso) y los diálogos
creados. Estos diálogos son los objetos para la gestión de claves; están definidos
en “private” en la parte de “Diálogos” (se han intentado que los nombre de sus
clases y las del resto sean identificativos).

#ifndef MICRIPTOSISTEMA_H
#define MICRIPTOSISTEMA_H
#include <QWidget>
#include <QTime>
class QDialog;class QPushButton;class QLabel;class QStringList;
#include "mirsa.h" #include "mides.h" #include "mitdes.h"
#include "migenecargosesirsa.h" #include "midefinirointeriordes.h" #include "midesotdes.h"
class MiCriptosistema : public QWidget{
Q_OBJECT
public:
MiCriptosistema(QWidget *parent= 0);
//Funciones Generales
void elegirAlgoritmoEncriptado();//permite seleccionar el algoritmo para el encriptado
void elegirAlgoritmoDesencriptado();//permite seleccionar el algoritmo para el desencriptado
int getAlgoritmo();//me devuelve el numero identificativo del algoritmo seleccionado
//Funciones RSA
QString encriptarRSA(QString);//devuelve el mensaje encriptado
QString desencriptarRSA(QString);//devuelve el código desencriptado
QStringList* getListaCPsRSA();//devuelve las claves públicas
//Funciones DES
QString encriptarDES(QString);//devuelve el mensaje encriptado

QString desencriptarDES(QString);//devuelve el código desencriptado
//Funciones Triple DES
QString encriptarTDES(QString);//devuelve el mensaje encriptado
QString desencriptarTDES(QString);//devuelve el código desencriptado
signals:
void encripta();//indica q ya se han elegido los parámetros de encriptado del algoritmo
void desencripta();//indica q ya se han elegido los parámetros de desencriptado
void tomaCPsListaRSA(QStringList*);//indica la lista de pares de claves públicasRSA
Cuadro de Código 1.7: Definición de la clase “micriptosistema” con Qt (Parte 1/3).

-22-
Capítulo 1: Introducción
private slots:
//Funciones RSA
void mostrarDiálogoEncriptarRSA();//muestra el diálogo para encriptar
void mostrarDiálogoDesencriptarRSA();//muestra el diálogo para desencriptar
void darListaClavesPúblicasRSA();//emite listaClavesPúblicasRSA
void ponerClavesPúblicasRSA(int, int);//pone las claves públicas
void ponerClavePrivadaRSA(int);//pone la clave privada
//Funciones DES
void mostrarDiálogoEncriptarDES();//muestra el diálogo para encriptar
void mostrarDiálogoDesencriptarDES();//muestra el diálogo para desencriptar
void ponerClavePrivadaDES(int);//pone la clave privada
//Funciones TDES
void mostrarDiálogoEncriptarTDES();//muestra el diálogo para encriptar
void mostrarDiálogoDesencriptarTDES();//muestra el diálogo para desencriptar
void ponerClavePrivadaTDES(int);//pone la clave privada
//Funciones RSA Digital
void mostrarDiálogoEncriptarRSADigital();//muestra el diálogo para encriptar
void mostrarDiálogoDesencriptarRSADigital();//muestra el diálogo para desencriptar
void cPrivadaDESRSAD(QString);//pone la clave privada
void cPrivadaTDESRSAD(QString);//pone la clave privada
void abandonar();//cierra los diálogos
private:
//Funciones
void crearDiálogoRSA();//crea el diálogo referente al algoritmo RSA
void crearDiálogoDES();//crea el diálogo referente al algoritmo DES
void crearDiálogoTDES();//crea el diálogo referente al algoritmo TDES
void crearDiálogoRSADigital();//crea el diálogo referente al algoritmo RSA Digital
void crearDiálogoAlgoritmos();//crea el diálogo referente a la elección de algoritmos
void posibleGuardarClaveRSAD();//diálogo anterior a guardarClaveRSAD
bool guardarClaveRSAD(QString);//guarda la clave privada simétrica de RSA Digital
//Diálogos
QDialog *dAlgoritmosEncriptado;//permite seleccionar entre los algoritmos disponibles
QDialog *dAlgoritmosDesencriptado;//permite seleccionar entre los algoritmos disponibles
MiGeneCargOSesiRSA *dEncriptarRSA;//permite generar las claves, cargarlas o usar sesión
MiGeneCargOSesiRSA *dDesencriptarRSA;//permite generar las claves, cargarlas o sesión
MiDefinirOInteriorDES *dEncriptarDES;//permite escribir la clave o usar la predefinida
MiDefinirOInteriorDES *dDesencriptarDES;//permite escribir la clave o usar la predefinida
MiDefinirOInteriorDES *dEncriptarTDES;//permite escribir la clave o usar la predefinida
MiDefinirOInteriorDES *dDesencriptarTDES;//permite escribir la clave o usar la predefinida
MiDESOTDES *dEncriptarRSADigital;//permite elegir DES o TDES
MiDESOTDES *dDesencriptarRSADigital;//permite elegir DES o TDES
//StringList
QStringList *listaCPsRSA;//lista de claves públicas usadas durante sesión

Cuadro de Código 1.7: Definición de la clase “micriptosistema” con Qt (Parte 2/3).

-23-
Aplicación Software para el Desarrollo de Tareas Criptográficas
//Time
QTime time;//registramos hora de uso de claves públicas RSA
//Manejador RSA
MiRsa *rsa;//algoritmos de RSA
//Manejador DES
MiDes *des;//algoritmos de DES
//Manejador TDES
MiTDes *tDes;//algoritmos de Triple DES
bool encriptar;//indica encriptar true, desencriptar false
int algoritmo;//indica el tipo de algoritmo (0: RSA, 1: DES, 2: Triple DES)
bool protocoloRSAD;//indica que estamos usando el protocolo RSA Digital,
QString cPrivadaSimetricaRSAD;//indica la clave privada del algoritmo Simétrico en RSADig
QString cPrividaSimetricaRSADCifrada;//indica la clave privada de RSA Digital
};
#endif
Cuadro de Código 1.7: Definición de la clase “micriptosistema” con Qt (Parte 3/3).

En lo que se refiere a las señales, “encripta” y “desencripta”, son
sumamente importantes pues saltan a la clase “miproject”. Cuando se activan
indican que se han terminado de seleccionar los parámetros para el encriptado o
desencriptado, delegando la finalización de la tarea a “miproject”.
Las diferencias entre el uso de claves de estos criptosistemas, aclarada
brevemente al principio de este apartado (para más detalle véase el Capítulo 2),
se puede apreciar en los métodos implementados en la parte de “private slots”.
En esta fase también se arreglaron una serie de problemas. Es el caso de
las limitaciones de longitud a la hora de seleccionar el texto, que se solucionó
gracias al uso de memoria dinámica y a la clase “lista” definida por Qt. Una vez
ilimitada la selección se comprobó que para el caso concreto de DES y TDES no
se cifraba bien el mensaje para longitudes grandes, nuevo error debido al uso de
arrays con el mensaje transformado.
Íntegramente en esta fase se hicieron las clases para la gestión de claves y
la clase TDES. La clase “micriptosistema” tuvo su primera implementación en la
fase 3 (fase de diseño y desarrollo de la interfaz) pero se ha querido incluir aquí
su comentario pues es en esta fase cuando adquirió mayor cuerpo. En el
Apartado 1.5 se podrán apreciar la relación entre las clases implementadas y las
fases de trabajo en forma de diagrama.
Todas las elaboraciones destacables llevadas a cabo durante esta cuarta
fase, la fase de gestión de claves e implementación de las clases TDES y RSA
Digital, se presentan en forma de esquema en la Figura 1.7.

-24-
Capítulo 1: Introducción

FASE 4

Gestión de Claves con RSA

Implementación
de Generar

Implementación
de Carga

Implementación
de usadas Sesión

Gestión de Claves con DES

Implementación
de Definir

Heredan

Implementación
de usar Interior

Elección de otro Algoritmo: TDES

Implementación del TDES
Hereda

Fundamentos
necesarios

Elección de otro Algoritmo: RSA Digital

Implementación del RSA Digital

Fundamentos
necesarios

Figura 1.7: Esquema del proceso de trabajo para la
Gestión de claves e implementación de las clases TDES y RSA Digital

1.3.5.- Incorporación de la Librería de Múltiple Precisión
Aritmética de GNU (GMP).
Terminada la fase 4, el software, al que se le bautizo como CriptoYenet, se
consideraba concluido, así que se paso a testearlo probando todas las
posibilidades que permite. Todo funcionaba a la perfección exceptuando un gran
problema que se descubrió relacionado con la seguridad que dota la longitud de la
clave.
En los criptosistemas ocurre que a mayor longitud de clave utilizada más
seguro es el sistema, pues aumenta el nivel de dificultad para averiguarla al
ampliarse exponencialmente el margen de posibilidades. Sin embargo en
CriptoYenet al aumentar la longitud resultaba que no se podía recuperar el
-25-
Aplicación Software para el Desarrollo de Tareas Criptográficas

mensaje. Tras numerosas investigaciones, se observó que este problema era
debido a que se sobrepasa el máximo número representable por la computadora.
Este número un entero (int) tiene un valor máximo, el cual si se sobrepasa se
vuelve a empezar por el mínimo valor. El tipo de problema no era nuevo pues ya
apareció algo similar en fases anteriores cuando se sobrepasaba el máximo valor
representable en código ASCII. Esto aportaba ciertas ideas, pero no una solución,
pues en este caso el arreglo aplicado anteriormente no era valido al tratarse de
números. Así que se pensó en utilizar enteros positivos (unsigned int) cuyo
margen es mayor u otros tipos de datos, pero también al final la limitación
resultaba un problema que tarde o temprano surgía. Se necesitaba representar
enteros positivos sin límite de longitud, por lo que se pensó en utilizar cadenas de
caracteres para representar los números y hacer las operaciones matemáticas
con ellas. Fácil planteamiento pero difícil realización, por lo que se opto por
buscar una librería que ya implementase esta funcionalidad. Se encontró
“BigNum”, pero desgraciadamente era para Java. Casi por desistir al no
encontrarse algo similar para C/C++, apareció gracias a un foro de programación,
la mejor y más rápida biblioteca de precisión aritmética, la GMP, y encima del
proyecto GNU con lo que se podría utilizar sin problemas y cumplía los requisitos
de desarrollo. Así que se dispuso a hacer lo necesario para utilizarla. Se
compilaron los códigos fuentes para Windows XP con MSYS creando las librerías
para el sistema y la declaración de esta. Luego se incluyeron los archivos
generados en el ámbito del compilador MinGW. Dentro de este en la carpeta para
librerías “lib” se introdujo “libgmpxx.a” y “libgmp.a” y en la parte de inclusión de
cabeceras “incluye” se introdujo “gmpxx.h”. Se cambiaron los enteros “int” por el
nuevo tipo “mpz_class”, se adaptaron todas las clases menos la principal
“miproject”, ya que solo en la parte esencialmente criptográfica eran necesarios
estos cambios, es decir, de la clase “micriptosistema” hacia abajo (ver Apartado
1.5). Realizados los nuevos ajustes ya solo queda incluir en el archivo “.pro”14 las
librerías GMP con su correspondiente dirección.
Esta parte trajo numerosos problemas de cara a la configuración del
sistema. La escasa información que se documentaba al respecto en la página
oficial y foros hizo que ante la imposibilidad de utilizar la biblioteca se viese la
necesidad de instalar Linux (Sistema GNU) como sistema compartido para poder
correr todas las herramientas que se usaban (Herramientas GNU) en vez de en
XP. Se debe mencionar que aunque las herramientas usadas en el marco de este
proyecto son multiplataforma, lógicamente existe más documentación y ayuda
para usuarios de sistemas GNU, que para usuarios de MS (“el enemigo”). Gracias
a innumerables pruebas se consiguió que funcionase. Por este engorroso trabajo
y con vistas a agilizar el proceso para futuros desarrolladores, se explica como
hacerlo en el Apartado 1.4.2. Esto no solo vale para “GMP+Qt+MS” sino para
cualquier biblioteca del proyecto GNU, es decir, sirve para hacer uso de
bibliotecas libres en plataformas Windows junto con Qt o similar.
La librería GMP posibilitó, a parte del trabajo con números
desproporcionados, aumentar la velocidad en algunos procesos, en su mayoría
asimétricos. Para el caso de uso del algoritmo de Euclides optimizado, el cual en
principio era bastante rápido para el cálculo del máximo común divisor, nos vimos
14

Es un tipo de archivo para indicar las cabeceras (definiciones de clases), las fuentes (código implementado
de la clase), otras fuentes (imágenes, bases de datos… de las que se surten las clases) y las librerías usadas,
todo de cara a la creación de la aplicación.

-26-
Capítulo 1: Introducción

obligados a sustituirlo por la función correspondiente proporcionada por GMP. Se
comprobó que la velocidad de ejecución de la función de GMP era 3/2 veces más
rápida que el algoritmo de Euclides utilizado (en un entorno de variables GMP). A
su vez, el cálculo del inverso para la obtención de la clave privada de RSA fue
cambiada. Con estas dos adaptaciones, se mejoró el tiempo de proceso en los
algoritmos de RSA dedicados a la generación de claves.
Los algoritmos dedicados al encriptado y desencriptado de RSA, también
sufrieron las mejoras proporcionadas por GMP. En primer lugar se optó por
ejecutar con la función correspondiente GMP el proceso de elevar el mensaje a la
clave y luego calcular el módulo. De esta forma comprobaríamos los márgenes
que permite esta librería, pero al igual que se explicó con el Cuadro de Código
1.2, esto no fue posible porque se debe ir haciendo el módulo y no dejarlo para el
final. Por ello se hizo uso de una función para el cálculo exponencial que
incorporase los módulos sucesivos.
Incorporadas estas mejoras, se quitó el límite existente para la elección de
primos, se usó una nueva función para su cálculo y se incorporaron márgenes
dinámicos para las elecciones de listas. El hecho de introducir todas las
posibilidades numéricas existentes, requiere muchos recursos. Sabemos que
reconocer si un número elevado es primo, es lento. Reconocer cuantos números
primos existen en una lista fijada en cero y con un máximo, es exponencialmente
más lento cuanto mayor es ese máximo. Es por eso que si el margen inferior junto
con el superior, se hacen dinámicos, se podría centrar el área de trabajo donde
sea más apetecible para la elección del número, sin necesidad de tener que
aumentar el listado por el simple hecho de buscar un primo de mayores
dimensiones. Aparte, para los casos de seleccionar márgenes reducidos, la
elección sería más rápida. El único problema que trae la implementación de un
margen dinámico, como este, con un límite superior y un límite inferior, es que a
priori no se saben las distancias entre primos. Un mismo margen centrado en un
rango de números pequeños podría dar “x” números primos, y si se centrase en
un rango de números más elevados daría “y” números primos, siendo “y<x” o
incluso ninguno. Es por este comportamiento (percibido en la ejecución), que se
propinó el uso de un límite inferior a partir del cual contar un número “n” de primos
para introducirlos en la lista de elección de usuario. Este algoritmo anterior
también fue reutilizado para el cálculo de la clave privada E en RSA.
Esta última liberación facilita al usuario la posibilidad de seleccionar
cantidades ingentes de texto con claves indefinidamente largas. El uso de GMP
que hacemos con Qt esta sujeto a unos limites. Así se definieron en base a una
serie de tests en ejecución unos máximos definidos para evitar sobrecargas. En
función del mensaje para DES y en función del mensaje y las claves para RSA.
Es con esta fase con la que se da por concluida la realización del software.
Para las nuevas ideas que surgieron y que serian interesantes llevar a cabo
véanse las Líneas Futuras de desarrollo en el Capítulo 4.

1.4.- Configuración del sistema.
Este apartado, dedicado a la configuración del sistema, proporciona los
-27-
Aplicación Software para el Desarrollo de Tareas Criptográficas

pasos necesarios para que el lector pueda configurar su equipo y trabajar con
C/C++ y cualquier librería GNU15. Para la configuración es necesario tener
conexión a Internet

1.4.1.- Linux.
La configuración del sistema para Linux, a parte de ser mínima, presenta
mayor y mejor documentación al respecto, al tratarse del uso de sus propias
librerías, puesto que este sistema operativo se encuentra dentro del proyecto
GNU. No obstante explicamos los pasos a seguir para configurar Linux.
Abrimos el gestor de paquetes16 (Menú Sistema/ Administración/ Gestor de
Paquetes – Synaptic). Buscamos Qt [B.R.2.11] y cargamos. Si no se encuentra la
última versión es debido a que tenemos configurado el SO como “estable”17,
habría que cambiarlo a “inestable” y repetir la búsqueda. El gestor de paquete se
encargará automáticamente de encontrar la versión para el sistema, de compilar e
instalar.
Para el caso de GMP [B.R.2.14] o cualquier otra librería que se requiera, se
hace exactamente igual, mediante el gestor de paquetes.
Una vez se dispongan de las librerías necesarias y con el supuesto
conocimiento sobre C/C++ [B.R.2.4], se escribe el código en el bloc de notas del
sistema o preferido. El archivo principal tiene que llamarse “main”.
Es necesario el compilador GCC [B.R.2.16]. Este suele venir instalado con
el sistema, pero sino volvemos al gestor de descargas.
Terminado el proyecto (código), nos situamos en un terminal de consola,
en la ruta de la carpeta de trabajo y escribimos: “qmake -project”, para crear un
proyecto Qt, “qmake”, para configurar los archivos que hacen uso de Qt antes de
la compilación y al final “make” para compilar. Si no ha habido errores, se creara
una carpeta con el ejecutable del proyecto.

1.4.2.- Windows XP.
La configuración del sistema para Windows, no es inmediata y presenta
escasa documentación al respecto. Es por ello que se facilitan los pasos a seguir
detalladamente, para el que fue en un 99% el entorno de trabajo durante todo el
proyecto.
Al no disponer de un gestor de paquetes como el de Linux, es necesario
descargarlo. Escribimos en la barra de direcciones,
http://trolltech.com/downloads/opensource, aquí podemos observar en el recuadro

15

La librería usada tiene que soportar el lenguaje de programación.
El gestor de paquetes del sistema GNU, se encarga de tener actualizado tanto el sistema como el resto de
software instalado. También permite la búsqueda e incorporación de nuevos softwares, ya se libre o no.
17
La configuración estable limita las últimas versiones del software libre hasta que no están liberadas como
estables por GNU.
16

-28-
Capítulo 1: Introducción

“Qt Open Source Edition for C++ Developers”, el enlace para bajarnos Qt según
el sistema poseído. También existe la alternativa no automática del gestor de
paquetes para Linux (X11). Pulsando sobre plataformas Windows, se nos
presenta una ventana con multitud de enlaces de descargas por zonas.
Independientemente de la zona, pulsamos sobre la que hace referencia a MinGW,
es decir, el auto instalable (qt-win-opensource-X.X.X-mingw.exe). Se iniciará la
descarga de Qt. Trolltech proporciona tanto los paquetes como un ejecutable.
Siempre que dispongamos del “install” lo utilizaremos, pues su uso es más fácil.
Para la instalación, seguimos detenidamente todos los pasos y cuando pregunte
si deseamos descargar MinGW afirmamos.
Qt proporciona un terminal para crear y compilar sus proyectos. Con la
ayuda de un bloc de notas, una vez terminado el proyecto seguiremos los mismos
pasos que en Linux, pero desde la consola de Qt. Ejecutaremos “qmake -project”,
“qmake”, “make” y listo.
Si se desea usar una versión diferente para MinGW [B.R.2.7], por ejemplo
entre las enlazadas en http://www.mingw.org/download.shtml, es necesario
indicarle a Qt cuando se este instalando, la carpeta raíz donde se encuentra
MinGW.
Caso de habernos bajado los paquetes de Qt (los archivos fuente),
necesitaremos compilarlos para Windows, es decir, tenemos que hacer, lo que el
gestor de paquetes de Linux hacía automáticamente con el código fuente.
Descargamos MSYS [B.R.2.8] desde el enlace del párrafo anterior. Este
proporcionará un entorno similar al de Linux. Una vez instalado, abriendo el
terminal de MSYS, nos situamos en la carpeta donde están las fuentes de Qt y
escribimos “make”, “make install”. Hecha la compilación, para crear los proyectos
solo tendremos que usar el terminal de MSYS de la misma forma que se usa el de
Qt.
A la hora de la ejecución del proyecto Qt, tendremos el inconveniente de
que no podremos acceder fuera del terminal de Qt o MSYS, debido a que estos
son los únicos en incluir en su “Path”18, la ruta de los comandos de la librería (lo
hacen automáticamente con el “make install”). Al desarrollador le interesaría que
en Windows, al igual que en Linux, se tuviese acceso al programa desde
cualquier parte. Para ello, necesitamos incluir las rutas dentro del “Path” de
Windows. Pulsamos “Mi PC” con el botón derecho/ Propiedades/ Opciones
Avanzadas/ Variables de Entorno/ Variables del Sistema/ Path/ Modificar y
añadimos en “Valor de la variable” las rutas necesarias separadas por “;”, lo que
en nuestro caso sería: C:MINGWBIN;C:QT4.3.2BIN;. Aceptando, podremos
acceder al compilador y a los proyectos de Qt, desde cualquier parte del sistema
operativo. Para ejecutar el programa en un sistema donde no se haya instalado
Qt, será necesario pasar las DLLs19 de Qt para el sistema junto con el ejecutable.
Supongamos que una vez configurado Qt, deseáramos trabajar con
algunas librerías de GNU, como por ejemplo GMP. Haciendo uso de MSYS
18

Variable que contiene las rutas donde se encuentran los comandos.
Significa biblioteca de enlace dinámico y es el término con el que se refiere a los archivos con código
ejecutable que se cargan bajo demanda del programa por parte del sistema operativo. Este archivo contiene
funciones que se pueden llamar desde aplicaciones u otras Dll. Los desarrolladores utilizan las Dll para poder
reciclar el código y aislar las diferentes tareas.
19

-29-
Aplicación Software para el Desarrollo de Tareas Criptográficas

ejecutaríamos “make” y “make install” en la carpeta donde hayamos
descomprimido los archivos fuente de GMP. Esto nos creará las librerías para
Windows “libgmp.a” y “libgmpxx.a”, y los archivos de cabecera “gmp.h” y
“gmpxx.h”, C y C++ respectivamente. Ambos tendríamos que incluirlos dentro de
la carpeta MinGW, concretamente en MinGW/lib las librerías y en MinGW/include
las cabeceras. A su vez las librerías que se incluyan dentro del proyecto Qt deben
tener su ruta de acceso especificada, dentro del archivo con nombre de proyecto
y extensión “pro” creado por “qmake”.
LIBS +=c:/MinGW/lib/libgmpxx.a. Hay que tener en cuenta que “proyecto.pro” se
genera cada vez que se ejecute “qmake”, por lo que se deberá revisar las librerías
incluidas.

1.4.3.- Mac OS.
La configuración del sistema para Mac, es similar a la de Windows. Pero al
no disponer de la computadora no se pudo correr Qt+GMP en un sistema Mac.
Al igual que con Windows, escribimos en la barra de direcciones,
http://trolltech.com/downloads/opensource, aquí podemos observar en “Qt Open
Source Edition for C++ Developers”, el enlace para bajarnos Qt para Mac.
Pulsando sobre la opción de esta plataforma, nos descargamos la versión de
paquetes, pues no dispone de un auto instalable. Una vez compilada la librería Qt
y todas las necesarias, usando GCC adaptado para MAC, actualizamos el “Path”
del sistema. Con esto se estaría en disposición para trabajar con Qt+GMP.
Los detalles de creación de proyectos son los mismos que en los sistemas
anteriores.
También es posible configuran una IDE [B.R.2.5-2.6] en los tres sistemas,
usando el compilador que adapta GCC al entorno en cada caso y referenciando
las librerías. Sin embargo sería necesario un terminal u otro acceso para ejecutar
“qmake -project” y “qmake”.

1.5.- Relación entre clases.
El fruto de las fases de trabajo fueron una serie de clases. El uso adecuado
sus objetos, la estructuración del conjunto y las comunicaciones entre los distintos
niveles, permiten la correcta ejecución del software, así como la integración de
nuevos métodos y objetos. En el presente apartado se pretende explicar la
jerarquía y comunicación entre las clases con ayuda de la Figura 1.8. En esta
figura se muestran los tipos de archivo, sus números de líneas de
implementación, sus relaciones por colores y los niveles de comunicación que
poseen. Existen 6 niveles de comunicación entre clases, de 0 a 5.
A través del Nivel 0, se le pasa a “main”, archivo principal, un objeto de la clase
“miproject”, clase principal para mostrar la aplicación y hacia abajo se pasan a
todas las clases los archivos exteriores que se utilizan (en su mayoría de tipo
imagen).
-30-
Capítulo 1: Introducción

El Nivel 1, comunica los criptosistemas con la clase principal (la interfaz).
La clase “micriptosistema” indica a “miproject” cuando esta lista para que se
proceda según sea el caso. Con la interfaz se pasa el algoritmo deseado y si se
quiere encriptar o desencriptar. Cuando “micripstosistema” este lista enviará la
señal para realizar y mostrar operación. En el caso de haber usado RSA, por si
solo o mediante el protocolo Digital, “micriptosistema” hará un registro de claves
que pasará a “miproject”, donde se guardará en un registro y/o archivo.
Con el Nivel 2 se desarrollan todas las comunicaciones entre los
criptosistemas y las gestiones de claves. Es únicamente en este nivel, donde se
realizan los cifrados y descifrados, para que después “micriptosistema” se
encargue de pasarlos a “miproject” y este los muestre. Se pueden distinguir 3
partes dentro de este nivel claramente diferenciadas: el uso del criptosistema RSA
con su correspondiente gestión de claves, el uso de los criptosistemas DES y
TDES con la misma gestión de claves para ambos y la parte de gestión de claves
del protocolo RSA Digital (el cual esta implementado dentro de “micriptosistema”).
La parte del Nivel 2 para la gestión de claves, pasará a “micriptosistema” las
claves necesarias obtenidas mediante generación, teclado o archivo para el caso
RSA; o de teclado o archivo para el resto de criptositemas. La clase
“micriptosistema” se encargará de hacer las llamadas pertinentes a los algoritmos
criptográficos para realizar las operaciones.
El Nivel 3 para el caso de DES, TDES y RSA Digital comunica con la
última clase de la jerarquía de estos, es decir, con aquella que da la clave privada.
Para el caso de RSA, el Nivel 3 pasará las claves necesarias, evitando la privada
en caso de encriptado.
Los siguientes niveles solo se presentan para el caso de RSA. Estos son
derivados del uso que este criptosistema hace de claves distintas para el cifrado y
descifrado. El Nivel 4 obtiene las claves a través de un archivo o por entrada de
teclado. Para terminar, el Nivel 5, es el equivalente al Nivel 3 para el caso de
DES, TDES y RSA Digital, es decir, comunica con la última clase de la jerarquía
de gestión de claves RSA y devuelve la clave privada.
Los posibles caminos de transito que se han comentado para los
criptosistemas y el protocolo, se muestran en la Figura 1.9, véase conjuntamente
con la Figura 1.8.
Vistas las interconexiones de las clases implementadas y con el
conocimiento adquirido en esta introducción sobre el trabajo desarrollado, se
continúa con el siguiente capítulo, donde confluirán teoría y código de los
criptosistemas desarrollados20.

20

Toda las veces que se refiera a criptosistemas desarrollados como conjunto de las posibilidades
criptograficas de CriptoYenet se esta incluyendo a RSAD aunque este sea un protocolo.

-31-
CRIPTOSISTEMAS

Interfaz Principal
14

30

68

81

488

mirsa
44

123

69

Nivel 0

520

miproject

522

mides

main

Nivel 1

mitdes

81

miparametro
130

612

micriptosistema

Nivel 2
55

103

mimargen

Gestión RSA

65

Gestión DES-TDES

144

53

103

Gestión RSAD

midefinirointeriordes

migenecargosesirsa

59

146

midesotdes

Nivel 3

80

304

56

migenerarrsa

115

mimanualoarchivorsa

59

158

miusarsesionrsa

50

105

micprivadades

Nivel 4

55

113

56

mimanualrsa

166

miarchivocpsrsa

45

83

micprivadarsa

49

107

micprivadadesrsad

Nivel 5

Figura 1.8: Relación entre las clases implementadas

44

130

miarchivocprivadarsad
Capítulo 1: Introducción

Elección de
DES en
“miproject”
Elección de
TDES en
“miproject”
Elección de
RSAD en
“miproject”

Nivel 1

Nivel 2

Nivel 3

Nivel 4

Nivel 1

Nivel 2

Nivel 3

Nivel 4

Nivel 1

Nivel 2

Nivel 3

Nivel 5

Nivel 1

Elección de
RSA en
“miproject”

Nivel 2

Nivel 3

Nivel 1

Nivel 2

Nivel 3

Nivel 1

Nivel 2

Nivel 1

Nivel 2

Nivel 1

Nivel 2

Nivel 1

Nivel 2

Nivel 5

Nivel 3

Nivel 3

Posibilidades
RSA

Figura 1.9: Caminos posibles para las comunicaciones de los criptosistemas y el protocolo.

-33-
CAPÍTULO 2
-Algoritmos Criptográficos Desarrollados-
Proyecto Fin de Carrera

Capítulo 2: Algoritmos Criptográficos Desarrollados

CAPÍTULO 2 - Algoritmos Criptográficos
Desarrollados.
Por sus ventajas y alcances, se empezó con la implementación de RSA y
DES, para después a partir de ellos desarrollar TDES y RSAD. Criptosistemas y
protocolo que son detallados en su implementación para el cifrado y descifrado,
así como para su generación de claves, en los siguientes apartados. La parte
correspondiente a la explicación de la gestión que se hizo de sus claves, se
reserva para el final del capítulo.

2.1.- RSA.
2.1.1.- Introducción.
Como ya se ha comentado brevemente en las Fases de Trabajo, el RSA es
un algoritmo asimétrico cifrador de bloques, que utiliza una clave pública, la cual
se distribuye (en forma autenticada preferentemente), y otra privada, la cual es
guardada en secreto por su propietario [B.R.1.1 y B.R.1.29-1.31]. Este sistema fue
desarrollado por Ronald Rivest, Adi Shamir, y Leonard Adleman, cuando eran
estudiantes en la MIT. Su esquema es bastante simple (Figura 2.1). El transmisor
o una red pública, disponen de las claves públicas con las que se cifra el mensaje.
El mensaje cifrado “c” se transmite al receptor. Este por medio de la red pública
obtiene la parte de la clave pública y la usa junto con su clave privada para
descifraran “c”, obteniendo el mensaje original “m”.

Figura 2.1: Sistema RSA

La clave pública esta formado por un par: “n” y “e”. Utilizadas para el cifrado. La
clave privada es “d” y se utiliza para el descifrado junto con la clave pública “n”.

-37-
Aplicación Software para el Desarrollo de Tareas Criptográficas

2.1.2 Generación de claves.
La generación de claves del algoritmo RSA, tuvo su primera
implementación en las fases del comienzo de lo que sería CriptoYenet. Sus
bases se sustentan en una función especial denominada función φ (n ) . Función
generadora de claves definida por la multiplicación de dos números primos
elevados, a los que se les sustrae la unidad. Dicha expresión viene dada por:

φ (n ) = ( p − 1)(q − 1) , siendo p ≠ q

(2.1)

La dinámica de esta generación, se inicializa escogiendo dos números
primos muy elevados (cuanto mayores sean más seguro será el sistema) de
forma que sean distintos entre si. El modo en el que se ha implementado la
elección de cada uno de ellos se puede ver en el Cuadro de Código 2.1, donde se
muestra el ejemplo concreto para el cálculo de “p”. Para el caso del primo “q”, el
proceso es el mismo, únicamente se quita “p” de la lista de los primos a elegir.

void MiGenerarRSA::elegirP(){
QStringList listaPrimosCarP;//lista de números primos almacenada como carácter
dLimitesLista->vaciar();//para los limites de la lista
dLimitesLista->ponerNombre(tr("Seleccione los parámetros para buscar los primos"));
mpz_class minList=1000;//valor por defecto para el comienzo de búsqueda
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 parámetros de búsqueda
if(dLimitesLista->getReady()){//si se aceptó continuamos
minList=dLimitesLista->getInferior();
cantidad=dLimitesLista->getCantidad();
mpz_class i=0;
while(i<cantidad){//vamos a calcular la cantidad de números primos
mpz_nextprime(minList.get_mpz_t(), minList.get_mpz_t());
listaPrimosCarP.append(QString::fromStdString(minList.get_str(10)));//lo almacenamos
i=i+1;//aumentamos la cantidad
}
dParametroEnRSA->vaciar();
dParametroEnRSA->ponerNombre(tr("Elija un número 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 Código 2.1: Cálculo de la lista de números primos

-38-
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas
Aplicación software para el desarrollo de tareas criptográficas

Contenu connexe

Similaire à Aplicación software para el desarrollo de tareas criptográficas

Haestn™ methodology
Haestn™ methodologyHaestn™ methodology
Haestn™ methodologyHDSLG
 
Tutorial Microprocesadores Pic iniciación rápida (Miguel Torres)
Tutorial Microprocesadores Pic  iniciación rápida  (Miguel Torres) Tutorial Microprocesadores Pic  iniciación rápida  (Miguel Torres)
Tutorial Microprocesadores Pic iniciación rápida (Miguel Torres) Aldo Corp
 
MiCroControladores
MiCroControladoresMiCroControladores
MiCroControladoresYahaira07
 
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...SANTIAGO PABLO ALBERTO
 
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010Instituto Tecnologico de Tepic
 
Proyecto final facultad de ingeniería.pdf
Proyecto final facultad de ingeniería.pdfProyecto final facultad de ingeniería.pdf
Proyecto final facultad de ingeniería.pdfceranobrian52
 
Investigacion formato aparato critico "Uso de Proteus professional 8
Investigacion formato aparato critico "Uso de Proteus professional 8Investigacion formato aparato critico "Uso de Proteus professional 8
Investigacion formato aparato critico "Uso de Proteus professional 8INTRONora
 
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010MaryMamaniQuispe1
 
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010DaniiCerro
 
Tutorial uso packet tracer y aplicaciones resueltas corpocides 2010
Tutorial uso packet tracer y aplicaciones resueltas corpocides 2010Tutorial uso packet tracer y aplicaciones resueltas corpocides 2010
Tutorial uso packet tracer y aplicaciones resueltas corpocides 2010Eduardo Sanchez Piña
 
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010Einer Moreno Hidalgo
 
Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)
Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)
Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)Miguel Angel Corona Lòpez
 
Microcontroladores pic diseño practico de aplicaciones
Microcontroladores pic diseño practico de aplicacionesMicrocontroladores pic diseño practico de aplicaciones
Microcontroladores pic diseño practico de aplicacionesCarlos Tovar
 

Similaire à Aplicación software para el desarrollo de tareas criptográficas (20)

Introduccion al desarrollo de software
Introduccion al desarrollo de softwareIntroduccion al desarrollo de software
Introduccion al desarrollo de software
 
Programacion
Programacion Programacion
Programacion
 
Formacion Sociedad Globalizadora
Formacion Sociedad GlobalizadoraFormacion Sociedad Globalizadora
Formacion Sociedad Globalizadora
 
Haestn™ methodology
Haestn™ methodologyHaestn™ methodology
Haestn™ methodology
 
Tutorial pic
Tutorial picTutorial pic
Tutorial pic
 
Tutorial pic
Tutorial picTutorial pic
Tutorial pic
 
Tutorial Microprocesadores Pic iniciación rápida (Miguel Torres)
Tutorial Microprocesadores Pic  iniciación rápida  (Miguel Torres) Tutorial Microprocesadores Pic  iniciación rápida  (Miguel Torres)
Tutorial Microprocesadores Pic iniciación rápida (Miguel Torres)
 
Tutorial pic
Tutorial picTutorial pic
Tutorial pic
 
MiCroControladores
MiCroControladoresMiCroControladores
MiCroControladores
 
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...
 
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
 
Proyecto final facultad de ingeniería.pdf
Proyecto final facultad de ingeniería.pdfProyecto final facultad de ingeniería.pdf
Proyecto final facultad de ingeniería.pdf
 
Investigacion formato aparato critico "Uso de Proteus professional 8
Investigacion formato aparato critico "Uso de Proteus professional 8Investigacion formato aparato critico "Uso de Proteus professional 8
Investigacion formato aparato critico "Uso de Proteus professional 8
 
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
 
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
 
Tutorial uso packet tracer y aplicaciones resueltas corpocides 2010
Tutorial uso packet tracer y aplicaciones resueltas corpocides 2010Tutorial uso packet tracer y aplicaciones resueltas corpocides 2010
Tutorial uso packet tracer y aplicaciones resueltas corpocides 2010
 
packet-tracer
packet-tracerpacket-tracer
packet-tracer
 
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
Tutorial uso-packet-tracer-y-aplicaciones-resueltas-corpocides-2010
 
Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)
Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)
Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)
 
Microcontroladores pic diseño practico de aplicaciones
Microcontroladores pic diseño practico de aplicacionesMicrocontroladores pic diseño practico de aplicaciones
Microcontroladores pic diseño practico de aplicaciones
 

Dernier

Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificialcynserafini89
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesEdomar AR
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzzAlexandergo5
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1ivanapaterninar
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfFernandoOblitasVivan
 

Dernier (20)

Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificial
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, Aplicaciones
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzz
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdf
 

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

  • 1. 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
  • 2.
  • 3. ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA DE TELECOMUNICACIÓN UNIVERSIDAD DE MÁLAGA Titulación: Ingeniería Telecomunicación Reunido el tribunal examinador en el día de la fecha, constituido por: D./Dª.__________________________________________________________ D./Dª.__________________________________________________________ D./Dª.__________________________________________________________ Para juzgar el Proyecto Fin de Carrera titulado: APLICACIÓN SOFTWARE PARA EL DESARROLLO DE TAREAS CRIPTOGRÁFICAS Del alumno D. Génesis García Morilla Dirigido por Dª. Mª Carmen Clemente Medina ACORDÓ POR ______________________________________ OTORGAR LA CALIFICACIÓN DE _______________________________________________ Y, para que conste, se extiende firmada por los componentes del tribunal, la presente diligencia Málaga, a ______ de __________________ de 2008 El/La Presidente/a El/La Vocal El/La Secretario/a Fdo.: _________________ Fdo.: _________________ Fdo.: _________________
  • 4.
  • 5. UNIVERSIDAD DE MÁLAGA ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA DE TELECOMUNICACIÓN APLICACIÓN SOFWARE PARA EL DESARROLLO DE TAREAS CRIPTOGRÁFICAS REALIZADO POR: Génesis García Morilla DIRIGIDO POR: Mª Carmen Clemente Medina DEPARTAMENTO DE: Ingeniería de Comunicaciones TITULACIÓN: Ingeniería Técnica de Telecomunicación Sistemas de Telecomunicación PALABRAS CLAVES: Criptografía, RSA, DES, TDES, RSA Digital, Software, Lenguaje C++, Gráficos Qt, Precisión Aritmética GMP. RESUMEN: 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. Málaga, Febrero de 2008
  • 6.
  • 7. A mis padres Antonio y Paqui, Y a mis hermanas Lidia y Anay.
  • 8.
  • 9. Índice PREFACIO CAPÍTULO 1 - Introducción…………………………………..1 1.1.- Objetivos…………………………………………….4 1.2.- Requisitos……………………………………………4 1.3.- Fases del trabajo……………………………………...5 1.4.- Configuración del sistema…………………………..27 1.4.1.- Linux………………………………………………………..28 1.4.2.- Windows XP………………………………………………..28 1.4.3.- Mac OS……………………………………………………..30 1.5.- Relación entre clases………………………………...30 CAPÍTULO 2 - Algoritmos Criptográficos Desarrollados…..35 2.1.- RSA………………………………………………….37 2.1.1.- Introducción………………………………………………..37 2.1.2.- Generación de claves………………………………………38 2.1.3.- Cifrado……………………………………………………..41 2.1.4.- Descifrado………………………………………………….42 2.1.5.- Conclusiones……………………………………………….44 2.2.- DES………………………………………………….46 2.2.1.- Introducción………………………………………………..46 2.2.2.- Generación de claves………………………………………46 2.2.3.- Cifrado……………………………………………………..48 2.2.4.- Descifrado………………………………………………….53 2.2.5.- Conclusiones……………………………………………….53 2.3.- Triple DES…………………………………………..57 2.3.1.- Introducción………………………………………………..57 2.3.2.- Cifrado y descifrado………………………………………..57 2.3.3.- Conclusiones……………………………………………….58 2.4.- RSA Digital…………………………………………60 2.4.1.- Introducción………………………………………………..60 2.4.2.- Cifrado y descifrado………………………………………..61 2.4.3.- Firmado digital……………………………………………..61 2.4.4.- Conclusiones……………………………………………….62 I
  • 10. 2.5.- Gestión de Claves de los Algoritmos Desarrollados..63 2.5.1.- Introducción………………………………………………..63 2.5.2.- Gestión de claves en RSA…………………………………63 2.5.3.- Gestión de claves en DES y TDES………………………..66 2.5.3.- Gestión de claves en RSA Digital…………………………66 CAPÍTULO 3 - Descripción de la Aplicación………………...69 3.1.- Introducción…………………………………………71 3.2.- Pantalla Principal……………………………………71 3.3.- Menú Algoritmo Criptográfico……………………...75 3.3.1- Menú RSA………………………………………………….76 3.3.2- Menú DES y TDES………………………………...………83 3.3.3- Menú RSA Digital………………………………………….84 CAPÍTULO 4 - Conclusiones, líneas futuras y limitaciones...89 4.1.- Conclusiones………………………………………...91 4.2.- Líneas futuras………………………………………..92 4.3.- Limitaciones…………………………………………95 APÉNDICE 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 Digital………………………………105 APÉNDICE B - Conceptos básicos sobre Criptografía…….109 B.1.- Historia…………………………………………….111 B.2.- Criptología…………………………………………113 B.3.- Terminología………………………………………113 B.4.- Canal de información……………………………...114 B.5.- Criptosistemas……………………………………..115 B.6.- Algoritmo criptográfico…………………………...116 B.7.- Clave criptográfica………………………………...116 B.8.- Longitud de clave………………………………….117 B.9.- Base Matemática RSA…………………………….117 B.10.- Base Matemática DES……………………………120 APÉNDICE C - Criptosistemas.……………………………..123 C.1.- Clasificación……………………………………….125 II
  • 11. C.2.- Criptosistemas Simétricos…………………………126 C.3.- Criptosistemas Asimétricos………………………..129 Índices extraordinarios………………………………………...135 I.1.- Cuadros de Código…………………………………137 I.2.- Figuras……………………………………………...138 I.3.- Tablas………………………………………………141 I.4.- Ecuaciones………………………………………….141 BIBLIOGRAFÍA - REFERENCIA….………………………...143 B.R.1.- Criptografía……………………………………...145 B.R.2.- Programación……………………………………148 B.R.3.- Matemáticas……………………………………..150 B.R.4.- Software similar…………………………………150 B.R.5.- Diseño…………………………………………...150 III
  • 12.
  • 13. PREFACIO Este proyecto fue elegido a razón del interés propio sobre la realización software y la curiosidad aportada por el mundo de la criptografía. Se le ofrece la posibilidad al lector de adentrarse en ambos campos, con los siguientes capítulos que comprenden la documentación propia del software criptográfico realizado. A su vez, existe una documentación extra formada por una serie de apéndices para complementar los capítulos, unos índices extraordinarios y la bibliografíareferencia consultada al final del libro. En el Capítulo 1, se ofrece una breve introducción comentando cuando y por qué se usa la criptografía, los sistemas más adecuados según el uso y los inconvenientes de la criptografía. Se exponen cuales fueron los objetivos y requisitos para la realización del software. Se detallan las fases de trabajo, así como la configuración del sistema necesaria para ello. Además se indica esquemáticamente las relaciones existentes entre las clases obtenidas al final del trabajo. En el Capítulo 2, se explican todos y cada uno de los algoritmos criptográficos realizados, a través de una introducción al criptosistema, su generación de claves, cifrado y descifrado. Se detallan las partes más relevantes del código implementado de estos, se indican sus ventajas e inconvenientes, y uso actual que acarrean. El final de este capítulo hace referencia a las implementaciones para la gestión de claves de cada uno de los algoritmos desarrollados. En el Capítulo 3, se describe la aplicación software haciendo uso de los diferentes menús que la componen. En principio se presenta una visión general de la aplicación, para luego ir adentrándose en las posibilidades criptográficas que ofrece gracias a los menús característicos de cada criptosistema implementado. En el Capítulo 4, se exponen las conclusiones del desarrollo de la aplicación, sus posibles mejoras y adaptaciones futuras, así como sus limitaciones de uso. En el Apéndice A, se encuentra el manual de usuario de la aplicación. Se muestran los pasos comunes e independientes de la tarea criptográfica a realizar y los pasos necesarios para el uso concreto de cada tarea, de forma que pueda sacársele el máximo partido. Este apéndice complementa al capítulo 3. En el Apéndice B, se presenta un breve resumen histórico de la criptografía y los conceptos presupuestos necesarios de cara a este proyecto. Estos conceptos son los referentes a terminología usada, algoritmo criptográfico, canal, claves y bases matemáticas. Este apéndice complementa al capítulo 1 y 2, y se recomienda su lectura en caso de déficit de conocimiento criptográfico básico del lector.
  • 14. En el Apéndice C, se introduce la clasificación de los criptosistemas junto con sus bases y se listan muy brevemente los más importantes. Este apéndice complementa al capítulo 1, 2, 4, y se recomienda su lectura. En los Índices Extraordinarios, aparecen las listas con referencia de página de cuadros de código, figuras, tablas y ecuaciones mostradas a lo largo del libro. En la Bibliografía-Referencia, se indica toda la documentación sobre criptografía, programación, matemáticas, aplicaciones similares a la realizada y programas para el diseño, que se consultó en enlaces de Internet y libros, así como libros extras para la profundización sobre temas criptográficos. Junto a la este libro se obsequia un CD-ROM con el libro para su consulta en formato pdf, el código fuente y el ejecutable del software realizado.
  • 16.
  • 17. Proyecto Fin de Carrera Capítulo 1: Introducción CAPÍTULO 1 – Introducción. La seguridad y protección de datos se han convertido en cuestiones de vital importancia para las comunicaciones electrónicas. Desde navegar por Internet hasta hacer la compra, requieren de criptosistemas y protocolos que oculten la información, verifiquen quienes somos, con quien nos comunicamos y que canal es seguro. Esta seguridad y protección es necesaria para la expansión y desarrolló de la sociedad de la información, puesto que provee los medios para que se realicen comunicaciones legales sin necesidad de la presencia física del individuo y permiten guardar información deseada para acceso y uso exclusivo de estos. Las ramas al frente del uso de la criptografía son básicamente las formadas por los sistemas simétricos y los asimétricos (véase Apéndice C). Los simétricos, son aquellos algoritmos criptográficos que usan una clave para todo, motivo por el cual se conocen también como sistemas de clave secreta. Estos algoritmos son rápidos, hacen uso de recursos matemáticos básicos y fueron los primeros en integrarse. Sin embargo, desde la aparición de los sistemas asimétricos están en decadencia. Los asimétricos, son aquellos algoritmos criptográficos que usan una clave pública para cifrar y otra privada para descifrar, motivo por el cual se conocen también como sistemas de clave pública. Estos algoritmos son más lentos, debido al uso de una base matemática compleja, y requieren mayores recursos de procesado, pero añaden mayor seguridad y protección que los sistemas simétricos. En principio, el uso de los asimétricos estaba muy limitado en la década de los 70s y 80s, pero a medida que aumentaba la capacidad computacional, iban suplantando en algunos ámbitos a los algoritmos simétricos. En la actualidad se suelen usar los algoritmos de clave asimétrica para asegurar la identificación de usuarios y proteger las transmisiones de pequeñas cantidades de datos. Los simétricos se usan para la protección 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 criptografía implique solo ventajas: mensajes por e-mails, archivos compartidos, formularios y contraseñas en la navegación por Internet…. Todos ellos cifrados para salvar las intercepciones en las comunicaciones. ¿Pero quienes interceptan las comunicaciones? En la mayoría 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 serán detectados, por lo que una vez dentro de la computadora pueden hacer inservible la seguridad y protección proporcionada por nuestro software criptográfico. 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 protección de datos, no solo basta con el uso de software criptográfico adecuado, este debe ser complementado 1 Programa malicioso capaz de alojarse en computadoras y permitir el acceso a usuarios externos, a través de una red local o de Internet, con el fin de recabar información o controlar remotamente a la máquina anfitriona -3-
  • 18. Aplicación Software para el Desarrollo de Tareas Criptográficas con un antivirus y firewall2. Además se requiere por parte del usuario de un uso responsable y consciente de la información, 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 realización de una aplicación software, para proporcionar la capacidad de cifrar y descifrar texto de forma muy intuitiva. Para ello, se ha diseñado una interfaz que permite realizar las operaciones criptográficas más conocidas y sus correspondientes gestiones de claves, a través de un entorno similar al de un editor de texto. Los criptosistemas soportados por esta aplicación son de clave pública 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 debía requerir ejecución multiplataforma, evitar dependencias a software externo, uso de software libre para su realización y disponer de la extracción de la complejidad criptográfica, 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 elección del SO en el que se sienta más cómodo 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, librerías del proyecto GNU4, lo que tiene unas repercusiones legales inmediatas, y económicas, tanto para uso personal como para comercial. Sin embargo con respecto al aspecto que presenta la aplicación desarrollada, se utilizó una librería (de código abierto) de interfaces gráficas 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, permitiéndolas o prohibiéndolas según las políticas de red que haya definido la organización 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 filosofía es la de desarrollar y compartir un sistema, programas, librerías… de código abierto y uso libre (B.R.2.12). -4-
  • 19. Capítulo 1: Introducción El último requisito importante con el que se contó fue el descarte del acceso a la configuración de parámetros irrelevantes. Esto disminuyó con consideración, la complejidad de manejo del proceso criptográfico 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, incorporación y adaptación de librerías, comunicación con el usuario y mejoras que iban surgiendo a medida que aumentaba el código. 1.3.1.- Implementación de la clase RSA y la clase DES en modo consola usando C++. La Implementación 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 Criptografía básica en general, a través de Wikipedias5. También para un aporte más extenso se recurrió a la lectura del libro, Técnicas Criptográficas de Protección de Datos [B.R.1.1]. Tras su lectura, se optó por uno de los algoritmos criptográficos a implementar, el RSA. Elección debida no solo a la visión que ofrece el libro de sencillez y potencia, sino a que en cualquiera de las Wikipedias consultadas también se detallaba a este algoritmo como el más conocido y usado de los sistemas de clave pública, el más rápido de ellos, presentando todas las ventajas de los sistemas asimétricos e incluyendo la firma digital. Por lo que el RSA forma uno de los pilares de la criptografía y de este proyecto [B.R.1.29-1.31]. Una vez hecha la elección del algoritmo criptográfico, se pasó a la elección del lenguaje de programación para implementarlo. Parte importante en la cual influyó la opinión 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 opción 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 matemática que incorpora un lenguaje adaptado específico que carece de la multitud de librerías como las disponibles para C y Java. Además se ralentiza al trabajar con número desproporcionadamente enormes (claves) o en el caso no permite su uso. También 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 gráfica para el usuario, aspecto estético y de manejo que constituye gran parte del éxito de las aplicaciones. Otra opción más reñida, fue la posibilidad de hacer la implementación del RSA en Java ,Python o C. Lógicamente los programadores consultados defendían su lenguaje de mayor uso, coincidiendo en que Java y Python son más sencillos 5 Documentación-Librerías online aportada, seleccionada y mantenida por usuarios de Internet de forma libre y gratuita. -5-
  • 20. Aplicación Software para el Desarrollo de Tareas Criptográficas que C, pero al ser lenguajes interpretados son más 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 ningún problema. Por lo que en principio parecían 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 elección adecuada como base. Si saltamos de C a Python o Java es mucho más 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 interpretación. Python es muy rápido de programar y el más sencillo, pero permite multitud de acciones que en los otros lenguajes darían errores. Además cada uno de los programadores consultados había programado o programaba en C, y todos ellos coincidían en que ese lenguaje es el más versátil para controlarlo todo (bajo y alto nivel), aunque para cosas especificas podría ser necesario otro que resultase más rápido y sencillo. C aparte de que produce códigos muy eficientes, proporciona modularidad. Está considerado como el lenguaje de programación universal y si existen bibliotecas para lo que sea en un lenguaje concreto, es seguro de que existirán en C, algo por ejemplo muy interesante con vistas al trabajo con números 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 librerías del proyecto GNU en Windows y las API’s6 de Microsoft. Tanto una IDE como la otra, disponen de interfaces similares, simples y fáciles de usar. Únicamente influyeron en la elección mínimos detalles de estética recargados e idioma, pues la configuración del área de trabajo y la imposición del inglés como único idioma en el CodeBlocks, hicieron al Dev-Cpp nuestro entorno de desarrollo integrado preferido. También se vio por encima la posibilidad de Visual C++, pero quedó rápidamente descartado porque VC++ está especialmente diseñado para el desarrollo y depuración de código 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 implementación, el RSA en modo consola con un menú básico para la navegación entre las posibilidades que se ofrecía (Figura 1.1). Se implementaron varias funciones necesarias dentro del RSA como son el cálculo de un número primo y el mínimo común divisor con Euclides. También fueron necesarias muchas otras para el correcto funcionamiento del proceso de cifrado y descifrado, así como para la visualización del menú. Las cabeceras de estas funciones y procedimientos, se detallan en el Cuadro de Código 1.0, no obstante evitamos de poner todo el código pues se trata de 281 líneas de implementación obsoleta, y solo algunas bases se mantienen en el desarrollo final. Las partes más relevantes referentes al RSA se verán con detalle en el Capítulo 2. 6 La API es la Interfaz de Programación de Interfaces, es decir, el conjunto de funciones y procedimientos que ofrece cierta librería para ser utilizada por otro software con capacidad de abstracción. -6-
  • 21. Capítulo 1: Introducción Figura 1.1: Menú consola RSA (1ª Versión de la Aplicación 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 Código 1.1: Cabecera de funciones y procedimientos de la 1ª Versión de la Aplicación. 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 cálculo del número inverso modular, para la clave privada, que hacía 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 cálculo del resto a sucesivos productos en vez de aplicarlo a una exponencial al final (Cuadro de Código 1.2). while(j<=e){ mensaje_cifrado[i]=(mensaje_cifrado[i]*(int(mensaje[i])))%n; j=j+1; } Cuadro de Código 1.2: Cálculo del resto “%” a sucesivos productos en Cifrar_Mensaje. Solucionadas estas deficiencias se buscó otro algoritmo para implementar que no fuese asimétrico como el RSA. Así que dentro de los algoritmos criptográficos simétricos sobre los que se hace especialmente hincapié en el libro de Técnicas Criptográficas de Protección de Datos [B.R.1.1], recurrimos al que es sin duda el más conocido de los sistemas de clave privada, el DES. Este aunque ya no se considere un sistema seguro, multitud de descendientes comparten similitudes con el, lo que lo hace muy interesante. Representa la base del Triple DES, el cual si es seguro, pues la aplicación sucesiva de este algoritmo mejora su seguridad. Presenta todas las ventajas de los sistemas simétricos, y su combinación con sistemas asimétricos permite topologías como las usadas en 7 Sobre carga de datos, salimos del margen de datos representable para el tipo definido. -7-
  • 22. Aplicación Software para el Desarrollo de Tareas Criptográficas SSL y PGP8. Por lo que a nivel de estudio el DES se considera una base dentro de la criptografía y otro de los criptosistemas que no podría faltar en la aplicación desarrollada. Con el objetivo de ampliar el menú anterior, añadiendo las opciones referidas a la utilización del DES junto con las del RSA, a priori se hizo una implementación aparte donde tuviéramos el DES cifrando y descifrando perfectamente. Una vez comprobada la ausencia de errores se adaptaría al menú realizado. En la primera implementación del DES, se trató la parte de encriptación y constaba únicamente de la introducción del mensaje a cifrar, usando una clave interna predefinida para ocultarlo (Figura 1.2). Figura 1.2: Cifrado DES (1ª Versión de la Aplicación DES) En lo que se refiere a la implementación del código, las operaciones utilizadas en el criptosistema DES son mucho mas sencillas que las usadas en el RSA, sin embargo, el proceso hasta obtener el mensaje cifrado es mucho más largo9. Por ello, se subdividió el proceso de encriptado en varios subprocesos para facilitar la programación y la reutilización de código. Las cabeceras de estos se detallan en el Cuadro de Código 1.3. El número de líneas de código del que se constaba eran de 453 y las librerías utilizadas al igual que con RSA son las básicas de C necesarias para el uso de streams y entrada y salida de datos, entre otras. Las partes más relevantes referentes al DES a la hora de implementarlo en su versión final se verán junto a la teoría con detalle en el Capítulo 2. Durante el desarrollo de esta primera versión del DES en la encriptación, se encontraron mayor número de problemas que con la versión del RSA. Problemas en su mayoría en el traspaso de los procedimientos del DES descritos por el libro al código C, pues con muchas líneas de código y sin errores de compilación, un simple error al adaptar, resultaba tedioso de encontrar. Algunos de ellos fueron los debidos a los desplazamientos necesarios dentro del procedimiento para las claves de ronda “generarClavesDeRonda” que producían claves inválidas para cifrar el mensaje, y que tuvo que ser desmenuzado paso a paso para encontrar el error existente en las variables controladoras. Se puede 8 SSL (Seguridad de la Capa de Transporte, B.R.4.2) y PGP (Privacidad Bastante Buena, B.R.4.1), protocolo y programa, respectivamente, cuya finalidad es proteger la información distribuida a través de Internet. PGP a parte proporciona protección para datos que no estén en transito. 9 En DES el proceso es más largo, tenemos más líneas de código, pero al utilizar operaciones sencillas como sustituciones, permutaciones y XOR, el tiempo de proceso es menor que en RSA, donde tenemos menos líneas de código pero operaciones más complejas, tales como el calculo exponencial y el mínimo común múltiplo entre otras. -8-
  • 23. Capítulo 1: Introducción nombrar también el referente a cuando se programaba la Función de Feistel10, en el entrecruce de las partes del mensaje, concretamente en el entrecruce que se hacia en la última vuelta, el cual no debía hacerse y que conllevo cambios innecesarios hasta su detección. Por comentar uno más, destacar el error dentro del procedimiento “sustitución” donde se dispone de unas tablas fijas denominadas S-Box las cuales a partir de una entrada especificada por una fila y columna sustituyen unos bits por otros, aquí el problema fue que las coordenadas se mantenían siempre constantes independientemente del valor de entrada, por lo cual la salida no podía ser correcta, gracias a la depuración y visualización paso a paso del proceso, este y otros muchos problemas se solucionaron. void permutacionTipo1(); //usada en generarClavesDeRonda void permutacionTipo2(); //usada en generarClavesDeRonda void generarClavesDeRonda(); //calcula las claves de ronda a partir de una clave predefinida void permutacionInicial(); //facilita la carga de los bits de información en bloques de 8 bits void expansion(); //expansión de la parte derecha del mensaje void xorTipo1E(int); //xor de la expansión de la parte derecha con la clave de ronda void sustitucion(); //sustitución de unos bits por otros según tablas definidas void permutacion(); //permutación fija void xorTipo2(); //xor de la parte izquierda con el resultado de las trasformaciones de la parte derecha void inversa(); //inversa de la permutación Inicial Cuadro de Código 1.3: Cabecera de procedimientos de la 1ª Versión de la Aplicación DES. Terminada la parte del DES para la encriptación, quedaba poder recuperar el mensaje desencriptandolo. Parte en principio sin aparente dificultad pues el DES al estar basado en una Función de Feistel tiene la propiedad de que si se aplica de nuevo el proceso se obtiene en mensaje en claro. De este modo se completo el criptosistema DES presentándolo en modo consola con una comunicación entrada salida básica (Figura 1.3). Al ser el proceso prácticamente el mismo, podemos reutilizar todo el código anterior (para las cabeceras de los procedimientos, véase Cuadro de Código 1.3), resultando mínimo el aumento de número de líneas. Y solucionados los problemas anteriores no tendría por que haberlos aquí. Únicamente existió uno debido a copiar el algoritmo de encriptado en el de desencriptado sin hacer variaciones. Pues al ir haciendo la “xorTipo1E” de la expansión de la parte derecha con la consecuente copia de subClave (clave de ronda) tenía que ir hacia atrás, en vez de cómo en el encriptado. Habría que usar “subClave[16-ronda][i]” en vez de lo que se tenía “subClave[ronda-1][i]”. Se diseñó el procedimiento “xorTipo1D” para el desencriptado dejando “xorTipo1E” para el encriptado. 10 Se trata de un algoritmo criptográfico simétrico por rondas. 1º Se selecciona una cadena N, de 64 o 128 bits, se divide en 2 subcadenas, L (izquierda) y R (derecha), de igual longitud (N/2). 2º Se toma una función F y una subclave Ki. 3º Se realizan una serie de operaciones con F y Ki y con L o R (solo uno de ellos). 4º La cadena obtenida se cambia por la cadena con la que no se han realizado operaciones y se siguen haciendo rondas. -9-
  • 24. Aplicación Software para el Desarrollo de Tareas Criptográficas Figura 1.3: Cifrado y Descifrado DES (2ª Versión de la Aplicación DES) Llegados a este punto y debido a la cantidad de código generado, y de funciones y procesos que debieran reutilizarse, se optó por el traspaso a una programación orientada a objetos. Se pasó de C a C++, lo cual no presentó dificultad alguna con la ayuda de la documentación necesaria [B.R.2.4]. De este modo se creó la clase DES y la clase RSA con sus respectivos métodos. El siguiente paso sería incluir ambas dentro de un nivel superior con integración de gráficos. Todas las elaboraciones destacables llevadas a cabo durante esta fase inicial de implementación de la clase RSA y la clase DES en modo consola usando C++, se presenta en forma de esquema en la Figura 1.4. 1.3.2.- Adaptación de RSA y DES a Qt. Las limitaciones gráficas y de movilidad que ofrecían las aplicaciones desarrolladas (Menú RSA y DES), así como la organización tediosa del código a la hora de querer añadir nuevas funcionalidades, propinó la optimización de este a la vez que la búsqueda de una librería gráfica de usuario. El objetivo era transformar lo que teníamos a una aplicación de escritorio, mucho más intuitiva que las de modo consola. La biblioteca para desarrollar interfaces gráficas de usuario tenía que cumplir con los mismos requisitos que se plantearon al principio. Posibilidad de integración multiplataforma, ausencia de dependencias y ser software libre. Requisitos que cumple la librería Qt de Trolltech [B.R.2.10-2.11], la que es sin duda la mejor librería dentro de su campo y cuyo uso está muy extendido en plataformas Linux. Hoy en día y gracias a las adaptaciones que se hicieron para facilitar el uso de Qt en Windows, sin necesidad de configurar una IDE o trabajar con Cygwin o Msys11, ocurre que entren cada vez más programadores a formar parte de los desarrolladores que trabajan con Qt y MS. Es necesario aclarar que el requisito de ser software libre no es del todo aplicable para Qt, pues esta requiere de licencia para uso comercial. No obstante, si permite su uso para el ámbito personal y para el presente marco de desarrollo. 11 Entornos de desarrollo muy similar al de Unix que permiten el uso de herramientas de desarrollo GNU (autotools, make, gcc…) en Windows (B.R.2.8-B.R.2.9). -10-
  • 25. Capítulo 1: Introducción FASE 1 Técnicas Criptográficas de protección de datos Documentación sobre Criptosistemas 3ª Edición Rama Wikipedias Páginas y Foros dedicados Elección de Algoritmo RSA Lenguajes de Programación Documentación sobre Recursos para su implementación Librerías Elección de C en Dev-Cpp Apuntes de C Implementación del RSA en Modo Consola Software de Capacidad numérica e IDEs Fundamentos Matemáticos necesarios Elección de otro Algoritmo: DES Apuntes de C Implementación del DES en Modo Consola Fundamentos Matemáticos necesarios Cambio del lenguaje de programación Apuntes de C++ Traspaso de Implementaciones de C a C++ Figura 1.4: Esquema del proceso de trabajo para la Implementación de la clase RSA y la clase DES en modo consola usando C++ A la hora de adaptar el código a Qt se substrayeron los cometidos referidos a la entrada y salida de datos en la comunicación con el usuario, dejando únicamente las variables y métodos propiamente de los criptosistemas. La clase -11-
  • 26. Aplicación Software para el Desarrollo de Tareas Criptográficas RSA y la clase DES obtenidas no son las versiones definitivas. A parte se prescinde de mostrar todo el código y se muestran únicamente las definiciones de las clases (Cuadro de Código 1.4 y 1.5, “mirsa.h” y “mides.h” respectivamente), junto con breves comentarios, ya que en el Capítulo 2 se entrará en más detalle. #ifndef MIRSA_H #define MIRSA_H //Las clases definidas por Qt empiezan por “Q” seguidas de un nombre identificativo en inglés #include <QWidget> class QString; //igual que un include, pero hace la compilación más rápida, solo para punteros class MiRsa : public QWidget{ Q_OBJECT //referente a los meta datos, necesario en todas las clases Qt public: MiRsa(QWidget *parent=0); //constructor //Funciones QStringList encriptar(QString); //devuelve un QStringList con el encriptado QString desencriptar(QStringList); //devuelve un QString con el desencriptado bool esPrimo(int); //devuelve si un número es primo int mcdEuclides(int, int); //devuelve el máximo común divisor de dos números //Variables int p,q; //números primos int e,n; //clave Pública int d; //clave Privada }; #endif Cuadro de Código 1.4: Definición de la clase “mirsa” con Qt. Aunque la declaración de la clase DES pueda parecer muy distinta a la de RSA, no lo es. Ambas declaraciones contienen en su parte pública los métodos que deben caracterizar a todo algoritmo criptográfico: una función para encriptar y otra para desencriptar. Particularmente en la definición de la clase DES toda la parte privada es básicamente la descrita en el Cuadro de Código 1.3, con la única diferencia de que se han creado funciones nuevas para la gestión de claves y de que en este caso mostramos las variables y arrays que se usan en cada parte del proceso. La definición de la clase RSA es pública íntegramente. Estas decisiones en la implementación fueron tomadas con vistas a una idea concreta para la gestión de claves, basada en un diálogo de menús emergentes que guiara al usuario hasta obtener el mensaje cifrado o descifrado (véase Fase 4: Apartado 1.3.4). Se debe aclarar que la ausencia de destructores de clase se sustenta en la utilización únicamente de punteros a objetos de las clases Qt. Estos poseen la propiedad de llamar a sus propios destructores. Para cualquier otro tipo de objetos que utilicen memoria dinámica es necesario declarar e implementar un destructor, de lo contrario se generarian espacios de memoria inutilizables. Todas las elaboraciones destacables llevadas a cabo durante esta segunda fase, la fase de adaptación de la clase RSA y la clase DES a Qt, se presentan en forma de esquema en la Figura 1.5. -12-
  • 27. Capítulo 1: Introducción #ifndef MIDES_H #define MIDES_H #include <QWidget> #include <QString> class MiDes : public QWidget{ Q_OBJECT //referente a los meta datos, necesario en todas las clases Qt public: MiDes(QWidget *parent=0); //constructor //Funciones QStringList encriptar(QString); //devuelve un QStringList con el encriptado QString desencriptar(QStringList); //devuelve un QString con el desencriptado bool adaptarDefinidaOk(unsigned int); //sustituye clave interna por la definida private: //Funciones void permutaciónInicial(); //facilita carga en bloques (usada en Cifrado-Descifrado) void Expansión(); //hace una expansión de la parte derecha (E-D 16 Rondas) void xorTipo1E(int); // XOR de la expansión de la parte derecha con las subclaves (E 16 R) void xorTipo1D(int); // XOR de la expansión de la parte derecha con las subclaves (D 16 R) void sustitución(); //hace una sustitución haciendo uso de las S-Box (E-D 16 Rondas) void permutación(); //cambio simple de unos bits por otros (E-D 16 Rondas) void xorTipo2(); //XOR con la parte derecha y la izquierda actuales (E-D 16 Rondas) void inversa(); //invierte la permutación inicial (E-D) void permutaciónTipo1(); //usada en Keygen void permutaciónTipo2(); //usada en keygen void keygen(); //genera las subClaves de rondas void restaurarCPrivada(); //vuelve a poner la clave interna //Variables auxiliares int permuTipo1[56]; //para la permutacionTipo1 de claveIni[64] int mitadA_pT1[28]; //para la primera mitad de permuTipo1[56] int mitadB_pT1[28]; //para la segunda mitad de permuTipo1[56] int a[48]; //para la permutacionTipo2 de mitadA_pT1[28] y mitadB_pT2[28] int subClave[16][48]; //para las subClaves de las rondas, subClave[0][k]=a[k]... int mensajeEnBinario[64]; //para el mensaje en formato binario int permuInicial[64]; //para facilitar la carga de mensajeEnBinario[64] en bloques de 8 bits int left[32]; //para la parte izquierda del mensajeEnBinario una vez hecha la permuInicial int right[32]; //para la parte derecha del mensajeEnBinario una vez hecha la permuInicial int temp[64]; //para las partes left[32] y right[32] int expansion[48]; //para la expansion de la parte derecha right[32] int xor1[48]; //para la xorTipo1, xor con la expansion de la parte derecha y las sublclaves int sus[32]; //para la sustitucion mediante las S-Box de xor1 int per[32]; //para la permutacion de sus[32] int xor2[32]; //para la xorTipo2 de left[32] y per[32] int inv[8][8];//para la inversa de la concatenación de left[32] y right[32], terminadas las rond int clave[64]; //para alojar la clave que se utilizara, definida o interior }; #endif Cuadro de Código 1.5: Definición de la clase “mides” con Qt. 1.3.3.- Diseño y desarrollo de la Interfaz. Las limitaciones de un diseño para consola suscitaron la elección de la -13-
  • 28. Aplicación Software para el Desarrollo de Tareas Criptográficas biblioteca Qt (Apartado 1.3.2). Sin embargo antes de implementar la interfaz se deben tener claras ideas como la funcionalidad que se ofrecerá de cara al usuario final y el compromiso entre diseño atrayente y ameno, y la facilidad de uso que se pretenden, pues tampoco se quiere complicar al usuario con una recarga de elementos de valor estético únicamente. Un triunfo asegurado seria imitar el estilo de la mayoría de las aplicaciones de escritorio. Estilo que todo el mundo usa y que proporciona cierto conocimiento sobre donde pueden estar las opciones necesarias del programa. Este es el caso de navegadores, procesadores de texto, programas de diseño… entre otros, que comparten los elementos básicos característicos de toda aplicación: la Barra de Menús, la Barra de Herramientas, el Área de Trabajo y la Barra de Estado. No obstante se optó por la opción arriesgada de innovar. Para ello se creo un Widget (elemento base en Qt) formado por varias partes movibles que reaccionaban al pulsar ciertos botones y al situarse sobre ciertas partes de la interfaz (1ª Versión de la Aplicación conjunta RSA-DES). Básicamente era una barra que guiaba al usuario a través de las dos posibles opciones para lo que en principio se implemento: el encriptado con RSA o DES. Esta aplicación se abría (efecto muy conseguido) al seleccionar cada opción mostrando las nuevas posibilidades en su caso, y en el paso de un estado a otro, la barra se cerraba mostrando un texto explicativo de la operación que se estaba realizando. El aspecto que puede suscitar a primera vista es el de un reproductor de sonido (Figura 1.6. Barra Dinámica) y la navegación que proporcionaba no fue la esperada, así como la falta de espacio a la hora de querer incorporar nuevas acciones por tratarse de un diseño tan compacto. Dimensiones que a su vez daban la impresión de que la aplicación aportarse pocos recursos. Por todos estos motivos se paro el proceso de desarrollo y se busco una interfaz más común. Una interfaz básica de aplicación de escritorio como la que se comentaba al principio del párrafo. La nueva aplicación de escritorio diseñada (2ª Versión de la Aplicación conjunta RSA-DES) integra las propiedades y herramientas básicas de un editor de texto. En principio solo permitía un área para redactar y las funciones en su estado simple de cifrar y descifrar. Paso a paso se fueron implementando las funciones de copiar, cortar, pegar, seleccionar… realizables por menús, teclado o ratón. Esta última para el caso de seleccionar proporciona gran comodidad, pues mediante doble clic o arrastrando el cursor se pueden indicar de forma muy rápida las partes del texto escrito a las que se desea aplicarle uno de los dos criptosistema. En base a las ejecuciones, la ejecución del DES era inmediata, pues se sustentaba en una clave fija predefinida. Sin embargo para la ejecución del RSA se configuró un menú en el que poder elegir los números primos necesarios de una lista, así como el resto de parámetros necesarios (claves públicas n y e, y clave privada d). Cada parte que se iba realizando era testeada en ejecución real y hasta que no funcionase perfectamente no se pasaba a la siguiente implementación. Se hacía un constante bombardeo de pruebas que en muchos casos requerían repetir pasos o volver al estado anterior, obligando a borrar todo y empezar de nuevo. Así por motivos de realización apareció la necesidad de un “deshacer” en el menú principal, ya que cada vez que se quería repetir una de las fases había que repetir todos los pasos de nuevo. Esta funcionalidad se dejó también para el usuario final ya que un “deshacer” es muy interesante para cualquier software (posteriormente también se crearía el “rehacer”). -14-
  • 29. Capítulo 1: Introducción FASE 2 Personal Informático Desarrolladores de Interfaces Documentación sobre librerías Gráficas Foros de C++ Elección de Qt como librería Qt Designer Documentación sobre Recursos para su implementación Qt a nivel de Programación Elección de Qt a nivel de Programación www.qtforum.org Adaptación de RSA a Qt Referencia de la API www.qtforum.org Adaptación de DES a Qt Referencia de la API Ideas y estructuras para gestión de claves Figura 1.5: Esquema del proceso de trabajo para la Adaptación de la clase RSA y la clase DES a Qt A medida que se avanzaba en el código aparecían más detalles necesarios de implementar. La posibilidad de guardar y cargar archivos, crear nuevos documentos, o gestionar la posición y dimensiones de la aplicación para que el usuario pueda cambiarlas y se mantengan en ese estado para las próximas veces que se ejecute. Estas y el resto de las acciones junto con el resto de la interfaz base se pueden ver en su declaración en el Cuadro de Código 1.6, clase “miproject”, la cual se puede considerar como el “container” de todas las demás clases existentes de la aplicación, es decir, la clase principal en la que se sujetan las demás. La parte de la implementación ha sido omitida pues son 520 líneas de código de las cuales solo se mostraran algunas partes más relevantes en la siguiente fase de trabajo (Apartado 1.3.4) y en el Capítulo 3. Gracias al bombardeo de pruebas se pudieron advertir la existencia de defectos en las implementaciones de RSA y DES desarrolladas en las fases -15-
  • 30. Aplicación Software para el Desarrollo de Tareas Criptográficas anteriores. Defectos como la imposibilidad de recuperar el mensaje en claro en RSA a partir del texto codificado (en código ASCII). Cuando se calcula el código de cifrado de una letra (según los parámetros de las claves generadas que se han seleccionado), este valor puede salirse del máximo representable de la tabla ASCII. Así actuaría como un cálculo del módulo en función de la longitud máxima del código y no podríamos saber cuantas vueltas a dado recuperando algo distinto del mensaje original. Para solventar semejante defecto se paso de la representación alfabética a la numérica, siendo diferenciada las partes encriptadas por puntos. Con DES se hizo lo mismo, pero este criptosistema presentaba aparte otro error debido a un desplazamiento en la codificación en bloques de 8 bits. Según se seleccionase un texto u otro en DES, si su longitud no era múltiplo de 8, su resto representaría el número de espacios hasta el siguiente carácter. Para solventar este otro problema simplemente se sustrajo a la longitud del descifrado obtenido el resto, eliminándose así todos los posibles espacios del final. La definición de la clase “miproject” presentada (Cuadro de Código 1.6), muestra al igual que en todos los cuadros de código, breves comentarios sobre la funcionalidad de sus métodos y variables así como el uso de los objetos que adopta de otras clases. A diferencia del resto de clases en la que existe un constructor y varias funciones públicas necesarias, aquí solo se presenta el constructor pues no son necesarios ningún tipo de comportamiento o configuración, un objeto de esta clase nos da la presentación de la aplicación. Además se posibilita la opción en el constructor de empezar la aplicación con la carga de un archivo por defecto. Al observar el código puede presentar dudas el hecho de que aparezcan por primera vez métodos con sus cabeceras en inglés, pudiendo definirlas en español como hasta ahora. La cuestión es que no se puede. No son iguales que el resto de métodos, pues representan al ámbito de funciones en Qt para el control de eventos, que pueden ser reimplementadas (cuyas cabeceras son fijas). Tales eventos como clickeos de ratón, entradas de teclado, eventos comunes de las aplicaciones como abrir, cerrar… disponen de estos métodos específicos para tratarlos. Todos ellos permiten utilizar otras funciones existentes en la clase o reimplementar todo el código en la medida de lo que sea necesario. Tratándose del diseño de cada botón de la barra de herramientas. Pese a que Qt ofrece buenos resultados y rápidos para pintar degradados, bordes, algunos sombreados…, (acabados simples) se debe recordar que su cometido no es para la realización de dibujos en general, aunque sea una herramienta dentro del ámbito gráfico. Qt puede permitir acabados de dibujos realmente buenos pero estos más que nada dependen de la pericia del diseñador, pues para la mayoría de usuarios de Qt esta tarea resulta extremadamente engorrosa. Es por ello que las herramientas propias de dibujo de Qt, así como la posibilidad de configuración mediante StyleSheet (a través de código CSS12) que incorpora, pueden limitar al diseñador en estos casos particulares, por lo que se opta por herramientas de diseño gráfico como Gimp (software libre) o Photoshop (software propietario)13, 12 CSS es un lenguaje formal de hojas de estilo en cascada (Cascading Style Sheets) que describe como se va a mostrar un documento en pantalla. Utilizado para definir la presentación de documentos en HTML o XML 13Aunque las posibilidades de Photoshop (B.R.5.1-5.2), motivadas por inversiones de millones de dólares, superan con creces a las de Gimp (B.R.5.3), , Gimp gana terreno a paso de gigante gracias a las colaboraciones que se hacen a través de usuarios y programadores de todo el mundo (Filosofía GNU) -16-
  • 31. Capítulo 1: Introducción para crear los dibujos que irán en botones, barras, o áreas concretas de la aplicación. #ifndef MIPROJECT_H #define MIPROJECT_H #include <QMainWindow> class QAction;class QMenu;class QTextEdit; #include "micriptosistema.h" class MiProject : public QMainWindow{ Q_OBJECT public: MiProject();//constructor base MiProject(const QString & nombreArchivo);//constructor que carga archivo protected: //Función reimplementada void closeEvent(QCloseEvent *evento);//guarda los settings y aviso guardar cuando cerramos private slots: void nuevo();//crea un nuevo archivo void abrir();//abre un archivo existente con extensión bool guardar();//permite guardarArchivo (sinTitulo) o guardarComo(!sinTitulo) bool guardarComo();//guarda el archivo caso de estar ya guardado void encriptar();//pasos previos al encriptado del texto seleccionado void encriptando();//encripta con los parámetros seleccionados void desencriptar();//paso previo al desencriptado del código seleccionado void desencriptando();//desencripta con la clave privada void documentoModificado();//pone setWindowModifed(true) void acercaDeCriptoYenet();//muestra en que consiste la Aplicación private: void iniciar();//configuración de parámetros básicos //Actuan sobre los elementos básicos de la Aplicación void crearAcciones();//crea las acciones que me permite hacer la Aplicación void crearMenus();//crea accesos a las acciones en los menús Archivo, Edición... void crearBarraDeHerramientas();//crea accesos rápidos a las acciones void crearBarraDeEstados();//crea una barra de información //Actúan sobre el aspecto de la Aplicación a nivel de usuario void leerParametros();//lee y pone la pos y el size guardados en settings o la x defecto void escribirParametros();//escribe la pos y el size que hemos puesto en settings //Abrir y Guardar bool posibleSalvar();//salva o no cambios pendientes en el documento void cargarArchivo(const QString &nombreArchivo);//carga un archivo bool guardarArchivo(const QString & nombreArchivo);//guarda el archivo donde indiquemos Cuadro de Código 1.6: Definición de la clase “miproject” con Qt (Parte 1/2). -17-
  • 32. Aplicación Software para el Desarrollo de Tareas Criptográficas //Actuan en el caso de usar RSA void posibleSalvarClavesRSA();//salva o no las claves públicas generadas bool guardarClavesPúblicasRSA(const QString nombreArchivo);//guarda n y e //Actualiza titulo y pone flags de documento modificado a false void actualizarArchivo(const QString & nombreArchivo); //Devuelve el nombre del documento QString darNombreArchivo(const QString & nombreArchivo); //Para encontrar el archivo fileName de entre los abiertos MiProject *encontrarMiProject(const QString & nombreArchivo); //Menus QMenu *menuArchivo;//contiene acNuevo, acAbrir, acGuardar, acGuardarComo, acCerrarV y acSalir QMenu *menuEdicion;//contiene acDeshacer acRehacerac, Cortar, acCopiar, acPegar y SelectAll QMenu *menuCriptosistema;//contiene acEncriptar y acDesencriptar QMenu *menuAyuda;//contiene acAcercaDeCriptoYenet, acAcercaDeRsa y acAcercaDeDes //Barras de Herramientas QToolBar *barraArchivo;//contiene acNuevo, acAbrir y acGuardar QToolBar *barraEdicion;//contiene acDeshacer acRehacerac, Cortar, acCopiar, acPegar y SelectAll QToolBar *barraCriptosistema;//contiene acEncriptar y acDesencriptar //Acciones QAction *acNuevo;QAction *acAbrir; QAction *acGuardar;QAction *acGuardarComo; QAction *acCerrarVentana;QAction *acSalir; QAction *acDeshacer;QAction *acRehacer; QAction *acCortar;QAction *acCopiar;QAction *acPegar; QAction *acSelectAll; QAction *acEncriptar;QAction *acDesencriptar; QAction *acAcercaDeCriptoYenet; //Mi editor de Texto QTextEdit *editorTexto; //QStrings QString text;//para el mensaje a encriptar QString codigo;//para el codigo a descifrar QString archivoActual;//nombre del archivo actual QString archivoCPActual;//nombre del archivo de las claves públicas actuales //Boleanas bool sinTitulo;//indica si el documento tiene titulo o no //Manejadores QClipboard *portapapeles;//lo utilizamos en encriptar y desencriptar MiCriptosistema *cripto;//permite encriptar/desencriptar usando rsa o des… }; #endif Cuadro de Código 1.6: Definición de la clase “miproject” con Qt (Parte 2/2). No obstante, para lo que se necesita ambos programas dentro del presente desarrollo, estos aportan las mismas prestaciones. Se optó por Photoshop (en -18-
  • 33. Capítulo 1: Introducción una versión limitada pero libre, entrando así dentro de los requisitos que se plantearon para el desarrollo de la aplicación) por ser el software al que se esta más acostumbrado. Tras la integración de los dibujos en el background de los botones y finalizada las nuevas implementaciones que propinó la interfaz seleccionada, se contaba con el aspecto base final de la aplicación. Todas las elaboraciones destacables llevadas a cabo durante esta tercera fase, la fase de diseño y desarrollo de la interfaz, se presentan en forma de esquema en la Figura 1.6. FASE 3 Diseño de posibles Interfaces Photoshop Estilo Barra Dinámica Estilo Aplicación Windows XP Mínima Implementación Elección de Estilo Aplicación Windows XP www.qtforum.org Implementación de funciones básicas de un editor de texto e incorporación de las propias de todo sistema criptográfico Referencia de la API de Qt Diseño de botones Figura 1.6: Esquema del proceso de trabajo para el Diseño y desarrollo de la Interfaz de la Aplicación -19-
  • 34. Aplicación Software para el Desarrollo de Tareas Criptográficas 1.3.4.- Gestión de claves e implementación de la clase TDES y RSA Digital. A finales de la fase anterior se consiguió una versión de la aplicación con las prestaciones que se definieron para el cifrado y descifrado de texto. Sin embargo la parte del acceso y configuración de las claves necesitaba de una adecuada implementación para su gestión. La gestión de claves realizadas para los criptosistemas desarrollados son diferentes, debido a su naturaleza en las claves. Con el caso de RSA (algoritmo de clave pública) se usan un par de claves públicas y una clave privada mientras que para el caso de DES (algoritmo de clave secreta) se usa únicamente una clave privada. Especificando para el caso de RSA se han implementado 3 opciones. La primera de ellas es la posibilidad de Generar las claves. Con sus comienzos en las primeras fases, pues según se planteó la generación a partir de primos (“creación desde cero”) es necesario seguir una secuencia característica del RSA hasta obtener el par de claves públicas y la clave privada, que permiten el cifrado y descifrado. Diseñadas las elecciones de los números primos, así como el cálculo del divisor “n”, la elección del exponente “e” y por último del cálculo del exponente privado “d”, se hicieron dos mejoras en la generación: una necesaria para solventar la demora en el cálculo del mínimo común divisor y la otra se trató de la incorporación de un deshacer. En el caso de la primera, el cálculo del “mcd” presentaba varias posibles implementaciones para su uso, siendo la más adecuada para realizar en una computadora la referente al método iterativo [B.R.2.15]. Esta suplanto a la versión formal desarrollada por Euclides que se tenía. Terminados los cambios en la implementación del “menú generar”, se detectó que una vez guardado un documento cifrado, si este se quería descifrar en otra sesión de la aplicación, no se podía al menos que se repitiera exactamente el mismo proceso de generar las claves con el que se cifró el mensaje. Consecuencia que representaba una gran deficiencia, pues no facilitaba las comunicaciones con usuarios que dispongan del programa, a menos que se pasen los números primos y las elecciones, lo cual rompería la seguridad. Esta limitación se solventó gracias a la implementación de un detector de claves (usadas durante la sesión) que guarda las claves en un archivo a petición del usuario, y al desarrollo de la segunda opción de gestión de claves implementada en el “menú cargar”. Esta última, la del “menú cargar”, dispone de una parte en la que se puede introducir el par de claves públicas de manera manual y en la otra a través de archivo (cargando el archivo generado con el detector de claves usadas). También se ideó un “menú sesión” (3ª opción), surgido de manera automática como consecuencia del detector, pues se vio la necesidad de que en algún momento el usuario podría desear reutilizar claves de una misma sesión. Tanto la parte de encriptar como la de desencriptar en RSA disponen de los mismos menús, pues son igualmente necesarios. Así lo que se hizo fue reutilizar código y para el caso concreto del desencriptado activar un menú final en el que se pidiera la clave secreta de usuario para recuperar el mensaje. -20-
  • 35. Capítulo 1: Introducción El otro caso, el de la gestión de claves del criptosistema DES, es bien distinto. Aquí no existe un proceso para generar la clave privada sustentado en los entresijos matemáticos, como la multiplicación de primos elevados o las propiedades de la modularidad al orden de la criptografía. Tampoco son necesarias unas claves para cifrar y otras para cifrar. Simplemente se define una clave privada de longitud fija (64 bits) que es utilizada en ambos procesos. Lo que se hizo fue mantener el recurso de clave implementado en inversiones anteriores. Es decir, el uso de una clave fija predefinida a nivel de programación (clave interior). Esta ahora sería útil para una comunicación entre todos los poseedores del programa, pero no se garantizaría la seguridad por la intersección de terceros. La que verdaderamente aportaría seguridad fue la adición de la posibilidad de elegir la clave, mediante la implementación del “menú definir”. Otra diferencia con el diálogo de menús de gestión de RSA es que en DES la parte de cifrado es exactamente la misma que la de descifrado, debido a que se usa una clave para todo. Para facilitar la navegación a través de estos diálogos emergentes que guían al usuario, se implementó un “avanzar” y un “retroceder” que permiten saltar entre las distintas opciones. Se puede ver la declaración de la clase que controla estos diálogos haciendo la gestión de claves y que también permite el uso de los criptosistemas en el Cuadro de de Código 1.7. Dicha clase denominada “micriptosistema” es en la que la clase principal “miproject” delega el cometido propio del uso de los criptosistemas. La parte de implementación de “micriptosistema” posee 600 líneas y es la que ha sufrido más incorporaciones y reajustes durante la realización del software. De esta se introducirán varias partes de código en el Capítulo 2. Llegados a este punto y debido al diseño reutilizable de las clases implementadas, resurgió una idea de implementación aparecida en las primeras fases de documentación: La implementación de Triple DES. La cual con tan solo algunos ajustes puede reutilizar todo el código de DES. Ambas declaraciones son iguales con lo que se puede recordar el Cuadro de Código 1.5. En su implementación únicamente se aumentó la longitud de clave y se introdujo todo el proceso de sustituciones, permutaciones y XORs dentro de un bucle de 3 vueltas que utiliza claves de longitud DES (64bits). Esta clave de 64 bits correspondientes a trozos de la clave de longitud TDES (192). La última incorporación al “menú criptosistemas” surgió tras la lectura de un artículo [B.R.4.1] en el que se comentaba el poder del uso de la criptografía simétrica y asimétrica usada en las topologías SSL y PGP (brevemente comentadas en apartados anteriores). Concretamente hablaba del sobre RSA Digital, un protocolo bastante potente que usa RSA para ocultar la clave privada de DES y transmitirla, y DES para la comunicación de información. Se aprovechan las mayores ventajas de cada parte: RSA es lento pero proporciona un canal seguro y DES es rápido pero no dispone de un canal seguro por lo que se complementan perfectamente. Así que aprovechando que se tenía implementada la clase RSA y DES se conformó este protocolo dentro de la clase “micriptosistema”. No se implemento una clase aparte como con RSA, DES y TDES porque al tratarse de un protocolo su desarrollo resultaba mucho más sencillo dentro de la clase “micriptosistema”, cuya estructura requería de mínimos ajustes que favorecían la incorporación en este sentido. -21-
  • 36. Aplicación Software para el Desarrollo de Tareas Criptográficas Implementada RSA Digital con RSA y DES, no se podía desaprovechar la oportunidad de incorporar RSA Digital con RSA y TDES habiendo implementado TDES. Algunas partes referentes a este código dentro de la clase “micriptosistema” se verán en el Capitulo 2, para las definiciones referentes a RSA Digital y los objetos de la clase TDES dentro de esta, ver Cuadro de Código 1.7. Como se puede apreciar en el Cuadro de Código 1.7, cada elemento de la declaración de la clase “micriptosistema” aparece brevemente comentado al igual que cualquier otro cuadro de código. Se pueden destacar las similitudes de los métodos pertenecientes a RSA, DES, TDES y RSA Digital, los cuales permiten la introducción de valores adecuados, y la comunicación con las respectivas clases de cada algoritmo mediante los manejadores de objetos declarados al final (RSA Digital utiliza la combinación de dos de ellos según sea el caso) y los diálogos creados. Estos diálogos son los objetos para la gestión de claves; están definidos en “private” en la parte de “Diálogos” (se han intentado que los nombre de sus clases y las del resto sean identificativos). #ifndef MICRIPTOSISTEMA_H #define MICRIPTOSISTEMA_H #include <QWidget> #include <QTime> class QDialog;class QPushButton;class QLabel;class QStringList; #include "mirsa.h" #include "mides.h" #include "mitdes.h" #include "migenecargosesirsa.h" #include "midefinirointeriordes.h" #include "midesotdes.h" class MiCriptosistema : public QWidget{ Q_OBJECT public: MiCriptosistema(QWidget *parent= 0); //Funciones Generales void elegirAlgoritmoEncriptado();//permite seleccionar el algoritmo para el encriptado void elegirAlgoritmoDesencriptado();//permite seleccionar el algoritmo para el desencriptado int getAlgoritmo();//me devuelve el numero identificativo del algoritmo seleccionado //Funciones RSA QString encriptarRSA(QString);//devuelve el mensaje encriptado QString desencriptarRSA(QString);//devuelve el código desencriptado QStringList* getListaCPsRSA();//devuelve las claves públicas //Funciones DES QString encriptarDES(QString);//devuelve el mensaje encriptado QString desencriptarDES(QString);//devuelve el código desencriptado //Funciones Triple DES QString encriptarTDES(QString);//devuelve el mensaje encriptado QString desencriptarTDES(QString);//devuelve el código desencriptado signals: void encripta();//indica q ya se han elegido los parámetros de encriptado del algoritmo void desencripta();//indica q ya se han elegido los parámetros de desencriptado void tomaCPsListaRSA(QStringList*);//indica la lista de pares de claves públicasRSA Cuadro de Código 1.7: Definición de la clase “micriptosistema” con Qt (Parte 1/3). -22-
  • 37. Capítulo 1: Introducción private slots: //Funciones RSA void mostrarDiálogoEncriptarRSA();//muestra el diálogo para encriptar void mostrarDiálogoDesencriptarRSA();//muestra el diálogo para desencriptar void darListaClavesPúblicasRSA();//emite listaClavesPúblicasRSA void ponerClavesPúblicasRSA(int, int);//pone las claves públicas void ponerClavePrivadaRSA(int);//pone la clave privada //Funciones DES void mostrarDiálogoEncriptarDES();//muestra el diálogo para encriptar void mostrarDiálogoDesencriptarDES();//muestra el diálogo para desencriptar void ponerClavePrivadaDES(int);//pone la clave privada //Funciones TDES void mostrarDiálogoEncriptarTDES();//muestra el diálogo para encriptar void mostrarDiálogoDesencriptarTDES();//muestra el diálogo para desencriptar void ponerClavePrivadaTDES(int);//pone la clave privada //Funciones RSA Digital void mostrarDiálogoEncriptarRSADigital();//muestra el diálogo para encriptar void mostrarDiálogoDesencriptarRSADigital();//muestra el diálogo para desencriptar void cPrivadaDESRSAD(QString);//pone la clave privada void cPrivadaTDESRSAD(QString);//pone la clave privada void abandonar();//cierra los diálogos private: //Funciones void crearDiálogoRSA();//crea el diálogo referente al algoritmo RSA void crearDiálogoDES();//crea el diálogo referente al algoritmo DES void crearDiálogoTDES();//crea el diálogo referente al algoritmo TDES void crearDiálogoRSADigital();//crea el diálogo referente al algoritmo RSA Digital void crearDiálogoAlgoritmos();//crea el diálogo referente a la elección de algoritmos void posibleGuardarClaveRSAD();//diálogo anterior a guardarClaveRSAD bool guardarClaveRSAD(QString);//guarda la clave privada simétrica de RSA Digital //Diálogos QDialog *dAlgoritmosEncriptado;//permite seleccionar entre los algoritmos disponibles QDialog *dAlgoritmosDesencriptado;//permite seleccionar entre los algoritmos disponibles MiGeneCargOSesiRSA *dEncriptarRSA;//permite generar las claves, cargarlas o usar sesión MiGeneCargOSesiRSA *dDesencriptarRSA;//permite generar las claves, cargarlas o sesión MiDefinirOInteriorDES *dEncriptarDES;//permite escribir la clave o usar la predefinida MiDefinirOInteriorDES *dDesencriptarDES;//permite escribir la clave o usar la predefinida MiDefinirOInteriorDES *dEncriptarTDES;//permite escribir la clave o usar la predefinida MiDefinirOInteriorDES *dDesencriptarTDES;//permite escribir la clave o usar la predefinida MiDESOTDES *dEncriptarRSADigital;//permite elegir DES o TDES MiDESOTDES *dDesencriptarRSADigital;//permite elegir DES o TDES //StringList QStringList *listaCPsRSA;//lista de claves públicas usadas durante sesión Cuadro de Código 1.7: Definición de la clase “micriptosistema” con Qt (Parte 2/3). -23-
  • 38. Aplicación Software para el Desarrollo de Tareas Criptográficas //Time QTime time;//registramos hora de uso de claves públicas RSA //Manejador RSA MiRsa *rsa;//algoritmos de RSA //Manejador DES MiDes *des;//algoritmos de DES //Manejador TDES MiTDes *tDes;//algoritmos de Triple DES bool encriptar;//indica encriptar true, desencriptar false int algoritmo;//indica el tipo de algoritmo (0: RSA, 1: DES, 2: Triple DES) bool protocoloRSAD;//indica que estamos usando el protocolo RSA Digital, QString cPrivadaSimetricaRSAD;//indica la clave privada del algoritmo Simétrico en RSADig QString cPrividaSimetricaRSADCifrada;//indica la clave privada de RSA Digital }; #endif Cuadro de Código 1.7: Definición de la clase “micriptosistema” con Qt (Parte 3/3). En lo que se refiere a las señales, “encripta” y “desencripta”, son sumamente importantes pues saltan a la clase “miproject”. Cuando se activan indican que se han terminado de seleccionar los parámetros para el encriptado o desencriptado, delegando la finalización de la tarea a “miproject”. Las diferencias entre el uso de claves de estos criptosistemas, aclarada brevemente al principio de este apartado (para más detalle véase el Capítulo 2), se puede apreciar en los métodos implementados en la parte de “private slots”. En esta fase también se arreglaron una serie de problemas. Es el caso de las limitaciones de longitud a la hora de seleccionar el texto, que se solucionó gracias al uso de memoria dinámica y a la clase “lista” definida por Qt. Una vez ilimitada la selección se comprobó que para el caso concreto de DES y TDES no se cifraba bien el mensaje para longitudes grandes, nuevo error debido al uso de arrays con el mensaje transformado. Íntegramente en esta fase se hicieron las clases para la gestión de claves y la clase TDES. La clase “micriptosistema” tuvo su primera implementación en la fase 3 (fase de diseño y desarrollo de la interfaz) pero se ha querido incluir aquí su comentario pues es en esta fase cuando adquirió mayor cuerpo. En el Apartado 1.5 se podrán apreciar la relación entre las clases implementadas y las fases de trabajo en forma de diagrama. Todas las elaboraciones destacables llevadas a cabo durante esta cuarta fase, la fase de gestión de claves e implementación de las clases TDES y RSA Digital, se presentan en forma de esquema en la Figura 1.7. -24-
  • 39. Capítulo 1: Introducción FASE 4 Gestión de Claves con RSA Implementación de Generar Implementación de Carga Implementación de usadas Sesión Gestión de Claves con DES Implementación de Definir Heredan Implementación de usar Interior Elección de otro Algoritmo: TDES Implementación del TDES Hereda Fundamentos necesarios Elección de otro Algoritmo: RSA Digital Implementación del RSA Digital Fundamentos necesarios Figura 1.7: Esquema del proceso de trabajo para la Gestión de claves e implementación de las clases TDES y RSA Digital 1.3.5.- Incorporación de la Librería de Múltiple Precisión Aritmética de GNU (GMP). Terminada la fase 4, el software, al que se le bautizo como CriptoYenet, se consideraba concluido, así que se paso a testearlo probando todas las posibilidades que permite. Todo funcionaba a la perfección exceptuando un gran problema que se descubrió relacionado con la seguridad que dota la longitud de la clave. En los criptosistemas ocurre que a mayor longitud de clave utilizada más seguro es el sistema, pues aumenta el nivel de dificultad para averiguarla al ampliarse exponencialmente el margen de posibilidades. Sin embargo en CriptoYenet al aumentar la longitud resultaba que no se podía recuperar el -25-
  • 40. Aplicación Software para el Desarrollo de Tareas Criptográficas mensaje. Tras numerosas investigaciones, se observó que este problema era debido a que se sobrepasa el máximo número representable por la computadora. Este número un entero (int) tiene un valor máximo, el cual si se sobrepasa se vuelve a empezar por el mínimo valor. El tipo de problema no era nuevo pues ya apareció algo similar en fases anteriores cuando se sobrepasaba el máximo valor representable en código ASCII. Esto aportaba ciertas ideas, pero no una solución, pues en este caso el arreglo aplicado anteriormente no era valido al tratarse de números. Así que se pensó en utilizar enteros positivos (unsigned int) cuyo margen es mayor u otros tipos de datos, pero también al final la limitación resultaba un problema que tarde o temprano surgía. Se necesitaba representar enteros positivos sin límite de longitud, por lo que se pensó en utilizar cadenas de caracteres para representar los números y hacer las operaciones matemáticas con ellas. Fácil planteamiento pero difícil realización, por lo que se opto por buscar una librería que ya implementase esta funcionalidad. Se encontró “BigNum”, pero desgraciadamente era para Java. Casi por desistir al no encontrarse algo similar para C/C++, apareció gracias a un foro de programación, la mejor y más rápida biblioteca de precisión aritmética, la GMP, y encima del proyecto GNU con lo que se podría utilizar sin problemas y cumplía los requisitos de desarrollo. Así que se dispuso a hacer lo necesario para utilizarla. Se compilaron los códigos fuentes para Windows XP con MSYS creando las librerías para el sistema y la declaración de esta. Luego se incluyeron los archivos generados en el ámbito del compilador MinGW. Dentro de este en la carpeta para librerías “lib” se introdujo “libgmpxx.a” y “libgmp.a” y en la parte de inclusión de cabeceras “incluye” se introdujo “gmpxx.h”. Se cambiaron los enteros “int” por el nuevo tipo “mpz_class”, se adaptaron todas las clases menos la principal “miproject”, ya que solo en la parte esencialmente criptográfica eran necesarios estos cambios, es decir, de la clase “micriptosistema” hacia abajo (ver Apartado 1.5). Realizados los nuevos ajustes ya solo queda incluir en el archivo “.pro”14 las librerías GMP con su correspondiente dirección. Esta parte trajo numerosos problemas de cara a la configuración del sistema. La escasa información que se documentaba al respecto en la página oficial y foros hizo que ante la imposibilidad de utilizar la biblioteca se viese la necesidad de instalar Linux (Sistema GNU) como sistema compartido para poder correr todas las herramientas que se usaban (Herramientas GNU) en vez de en XP. Se debe mencionar que aunque las herramientas usadas en el marco de este proyecto son multiplataforma, lógicamente existe más documentación y ayuda para usuarios de sistemas GNU, que para usuarios de MS (“el enemigo”). Gracias a innumerables pruebas se consiguió que funcionase. Por este engorroso trabajo y con vistas a agilizar el proceso para futuros desarrolladores, se explica como hacerlo en el Apartado 1.4.2. Esto no solo vale para “GMP+Qt+MS” sino para cualquier biblioteca del proyecto GNU, es decir, sirve para hacer uso de bibliotecas libres en plataformas Windows junto con Qt o similar. La librería GMP posibilitó, a parte del trabajo con números desproporcionados, aumentar la velocidad en algunos procesos, en su mayoría asimétricos. Para el caso de uso del algoritmo de Euclides optimizado, el cual en principio era bastante rápido para el cálculo del máximo común divisor, nos vimos 14 Es un tipo de archivo para indicar las cabeceras (definiciones de clases), las fuentes (código implementado de la clase), otras fuentes (imágenes, bases de datos… de las que se surten las clases) y las librerías usadas, todo de cara a la creación de la aplicación. -26-
  • 41. Capítulo 1: Introducción obligados a sustituirlo por la función correspondiente proporcionada por GMP. Se comprobó que la velocidad de ejecución de la función de GMP era 3/2 veces más rápida que el algoritmo de Euclides utilizado (en un entorno de variables GMP). A su vez, el cálculo del inverso para la obtención de la clave privada de RSA fue cambiada. Con estas dos adaptaciones, se mejoró el tiempo de proceso en los algoritmos de RSA dedicados a la generación de claves. Los algoritmos dedicados al encriptado y desencriptado de RSA, también sufrieron las mejoras proporcionadas por GMP. En primer lugar se optó por ejecutar con la función correspondiente GMP el proceso de elevar el mensaje a la clave y luego calcular el módulo. De esta forma comprobaríamos los márgenes que permite esta librería, pero al igual que se explicó con el Cuadro de Código 1.2, esto no fue posible porque se debe ir haciendo el módulo y no dejarlo para el final. Por ello se hizo uso de una función para el cálculo exponencial que incorporase los módulos sucesivos. Incorporadas estas mejoras, se quitó el límite existente para la elección de primos, se usó una nueva función para su cálculo y se incorporaron márgenes dinámicos para las elecciones de listas. El hecho de introducir todas las posibilidades numéricas existentes, requiere muchos recursos. Sabemos que reconocer si un número elevado es primo, es lento. Reconocer cuantos números primos existen en una lista fijada en cero y con un máximo, es exponencialmente más lento cuanto mayor es ese máximo. Es por eso que si el margen inferior junto con el superior, se hacen dinámicos, se podría centrar el área de trabajo donde sea más apetecible para la elección del número, sin necesidad de tener que aumentar el listado por el simple hecho de buscar un primo de mayores dimensiones. Aparte, para los casos de seleccionar márgenes reducidos, la elección sería más rápida. El único problema que trae la implementación de un margen dinámico, como este, con un límite superior y un límite inferior, es que a priori no se saben las distancias entre primos. Un mismo margen centrado en un rango de números pequeños podría dar “x” números primos, y si se centrase en un rango de números más elevados daría “y” números primos, siendo “y<x” o incluso ninguno. Es por este comportamiento (percibido en la ejecución), que se propinó el uso de un límite inferior a partir del cual contar un número “n” de primos para introducirlos en la lista de elección de usuario. Este algoritmo anterior también fue reutilizado para el cálculo de la clave privada E en RSA. Esta última liberación facilita al usuario la posibilidad de seleccionar cantidades ingentes de texto con claves indefinidamente largas. El uso de GMP que hacemos con Qt esta sujeto a unos limites. Así se definieron en base a una serie de tests en ejecución unos máximos definidos para evitar sobrecargas. En función del mensaje para DES y en función del mensaje y las claves para RSA. Es con esta fase con la que se da por concluida la realización del software. Para las nuevas ideas que surgieron y que serian interesantes llevar a cabo véanse las Líneas Futuras de desarrollo en el Capítulo 4. 1.4.- Configuración del sistema. Este apartado, dedicado a la configuración del sistema, proporciona los -27-
  • 42. Aplicación Software para el Desarrollo de Tareas Criptográficas pasos necesarios para que el lector pueda configurar su equipo y trabajar con C/C++ y cualquier librería GNU15. Para la configuración es necesario tener conexión a Internet 1.4.1.- Linux. La configuración del sistema para Linux, a parte de ser mínima, presenta mayor y mejor documentación al respecto, al tratarse del uso de sus propias librerías, puesto que este sistema operativo se encuentra dentro del proyecto GNU. No obstante explicamos los pasos a seguir para configurar Linux. Abrimos el gestor de paquetes16 (Menú Sistema/ Administración/ Gestor de Paquetes – Synaptic). Buscamos Qt [B.R.2.11] y cargamos. Si no se encuentra la última versión es debido a que tenemos configurado el SO como “estable”17, habría que cambiarlo a “inestable” y repetir la búsqueda. El gestor de paquete se encargará automáticamente de encontrar la versión para el sistema, de compilar e instalar. Para el caso de GMP [B.R.2.14] o cualquier otra librería que se requiera, se hace exactamente igual, mediante el gestor de paquetes. Una vez se dispongan de las librerías necesarias y con el supuesto conocimiento sobre C/C++ [B.R.2.4], se escribe el código en el bloc de notas del sistema o preferido. El archivo principal tiene que llamarse “main”. Es necesario el compilador GCC [B.R.2.16]. Este suele venir instalado con el sistema, pero sino volvemos al gestor de descargas. Terminado el proyecto (código), nos situamos en un terminal de consola, en la ruta de la carpeta de trabajo y escribimos: “qmake -project”, para crear un proyecto Qt, “qmake”, para configurar los archivos que hacen uso de Qt antes de la compilación y al final “make” para compilar. Si no ha habido errores, se creara una carpeta con el ejecutable del proyecto. 1.4.2.- Windows XP. La configuración del sistema para Windows, no es inmediata y presenta escasa documentación al respecto. Es por ello que se facilitan los pasos a seguir detalladamente, para el que fue en un 99% el entorno de trabajo durante todo el proyecto. Al no disponer de un gestor de paquetes como el de Linux, es necesario descargarlo. Escribimos en la barra de direcciones, http://trolltech.com/downloads/opensource, aquí podemos observar en el recuadro 15 La librería usada tiene que soportar el lenguaje de programación. El gestor de paquetes del sistema GNU, se encarga de tener actualizado tanto el sistema como el resto de software instalado. También permite la búsqueda e incorporación de nuevos softwares, ya se libre o no. 17 La configuración estable limita las últimas versiones del software libre hasta que no están liberadas como estables por GNU. 16 -28-
  • 43. Capítulo 1: Introducción “Qt Open Source Edition for C++ Developers”, el enlace para bajarnos Qt según el sistema poseído. También existe la alternativa no automática del gestor de paquetes para Linux (X11). Pulsando sobre plataformas Windows, se nos presenta una ventana con multitud de enlaces de descargas por zonas. Independientemente de la zona, pulsamos sobre la que hace referencia a MinGW, es decir, el auto instalable (qt-win-opensource-X.X.X-mingw.exe). Se iniciará la descarga de Qt. Trolltech proporciona tanto los paquetes como un ejecutable. Siempre que dispongamos del “install” lo utilizaremos, pues su uso es más fácil. Para la instalación, seguimos detenidamente todos los pasos y cuando pregunte si deseamos descargar MinGW afirmamos. Qt proporciona un terminal para crear y compilar sus proyectos. Con la ayuda de un bloc de notas, una vez terminado el proyecto seguiremos los mismos pasos que en Linux, pero desde la consola de Qt. Ejecutaremos “qmake -project”, “qmake”, “make” y listo. Si se desea usar una versión diferente para MinGW [B.R.2.7], por ejemplo entre las enlazadas en http://www.mingw.org/download.shtml, es necesario indicarle a Qt cuando se este instalando, la carpeta raíz donde se encuentra MinGW. Caso de habernos bajado los paquetes de Qt (los archivos fuente), necesitaremos compilarlos para Windows, es decir, tenemos que hacer, lo que el gestor de paquetes de Linux hacía automáticamente con el código fuente. Descargamos MSYS [B.R.2.8] desde el enlace del párrafo anterior. Este proporcionará un entorno similar al de Linux. Una vez instalado, abriendo el terminal de MSYS, nos situamos en la carpeta donde están las fuentes de Qt y escribimos “make”, “make install”. Hecha la compilación, para crear los proyectos solo tendremos que usar el terminal de MSYS de la misma forma que se usa el de Qt. A la hora de la ejecución del proyecto Qt, tendremos el inconveniente de que no podremos acceder fuera del terminal de Qt o MSYS, debido a que estos son los únicos en incluir en su “Path”18, la ruta de los comandos de la librería (lo hacen automáticamente con el “make install”). Al desarrollador le interesaría que en Windows, al igual que en Linux, se tuviese acceso al programa desde cualquier parte. Para ello, necesitamos incluir las rutas dentro del “Path” de Windows. Pulsamos “Mi PC” con el botón derecho/ Propiedades/ Opciones Avanzadas/ Variables de Entorno/ Variables del Sistema/ Path/ Modificar y añadimos en “Valor de la variable” las rutas necesarias separadas por “;”, lo que en nuestro caso sería: C:MINGWBIN;C:QT4.3.2BIN;. Aceptando, podremos acceder al compilador y a los proyectos de Qt, desde cualquier parte del sistema operativo. Para ejecutar el programa en un sistema donde no se haya instalado Qt, será necesario pasar las DLLs19 de Qt para el sistema junto con el ejecutable. Supongamos que una vez configurado Qt, deseáramos trabajar con algunas librerías de GNU, como por ejemplo GMP. Haciendo uso de MSYS 18 Variable que contiene las rutas donde se encuentran los comandos. Significa biblioteca de enlace dinámico y es el término con el que se refiere a los archivos con código ejecutable que se cargan bajo demanda del programa por parte del sistema operativo. Este archivo contiene funciones que se pueden llamar desde aplicaciones u otras Dll. Los desarrolladores utilizan las Dll para poder reciclar el código y aislar las diferentes tareas. 19 -29-
  • 44. Aplicación Software para el Desarrollo de Tareas Criptográficas ejecutaríamos “make” y “make install” en la carpeta donde hayamos descomprimido los archivos fuente de GMP. Esto nos creará las librerías para Windows “libgmp.a” y “libgmpxx.a”, y los archivos de cabecera “gmp.h” y “gmpxx.h”, C y C++ respectivamente. Ambos tendríamos que incluirlos dentro de la carpeta MinGW, concretamente en MinGW/lib las librerías y en MinGW/include las cabeceras. A su vez las librerías que se incluyan dentro del proyecto Qt deben tener su ruta de acceso especificada, dentro del archivo con nombre de proyecto y extensión “pro” creado por “qmake”. LIBS +=c:/MinGW/lib/libgmpxx.a. Hay que tener en cuenta que “proyecto.pro” se genera cada vez que se ejecute “qmake”, por lo que se deberá revisar las librerías incluidas. 1.4.3.- Mac OS. La configuración del sistema para Mac, es similar a la de Windows. Pero al no disponer de la computadora no se pudo correr Qt+GMP en un sistema Mac. Al igual que con Windows, escribimos en la barra de direcciones, http://trolltech.com/downloads/opensource, aquí podemos observar en “Qt Open Source Edition for C++ Developers”, el enlace para bajarnos Qt para Mac. Pulsando sobre la opción de esta plataforma, nos descargamos la versión de paquetes, pues no dispone de un auto instalable. Una vez compilada la librería Qt y todas las necesarias, usando GCC adaptado para MAC, actualizamos el “Path” del sistema. Con esto se estaría en disposición para trabajar con Qt+GMP. Los detalles de creación de proyectos son los mismos que en los sistemas anteriores. También es posible configuran una IDE [B.R.2.5-2.6] en los tres sistemas, usando el compilador que adapta GCC al entorno en cada caso y referenciando las librerías. Sin embargo sería necesario un terminal u otro acceso para ejecutar “qmake -project” y “qmake”. 1.5.- Relación entre clases. El fruto de las fases de trabajo fueron una serie de clases. El uso adecuado sus objetos, la estructuración del conjunto y las comunicaciones entre los distintos niveles, permiten la correcta ejecución del software, así como la integración de nuevos métodos y objetos. En el presente apartado se pretende explicar la jerarquía y comunicación entre las clases con ayuda de la Figura 1.8. En esta figura se muestran los tipos de archivo, sus números de líneas de implementación, sus relaciones por colores y los niveles de comunicación que poseen. Existen 6 niveles de comunicación entre clases, de 0 a 5. A través del Nivel 0, se le pasa a “main”, archivo principal, un objeto de la clase “miproject”, clase principal para mostrar la aplicación y hacia abajo se pasan a todas las clases los archivos exteriores que se utilizan (en su mayoría de tipo imagen). -30-
  • 45. Capítulo 1: Introducción El Nivel 1, comunica los criptosistemas con la clase principal (la interfaz). La clase “micriptosistema” indica a “miproject” cuando esta lista para que se proceda según sea el caso. Con la interfaz se pasa el algoritmo deseado y si se quiere encriptar o desencriptar. Cuando “micripstosistema” este lista enviará la señal para realizar y mostrar operación. En el caso de haber usado RSA, por si solo o mediante el protocolo Digital, “micriptosistema” hará un registro de claves que pasará a “miproject”, donde se guardará en un registro y/o archivo. Con el Nivel 2 se desarrollan todas las comunicaciones entre los criptosistemas y las gestiones de claves. Es únicamente en este nivel, donde se realizan los cifrados y descifrados, para que después “micriptosistema” se encargue de pasarlos a “miproject” y este los muestre. Se pueden distinguir 3 partes dentro de este nivel claramente diferenciadas: el uso del criptosistema RSA con su correspondiente gestión de claves, el uso de los criptosistemas DES y TDES con la misma gestión de claves para ambos y la parte de gestión de claves del protocolo RSA Digital (el cual esta implementado dentro de “micriptosistema”). La parte del Nivel 2 para la gestión de claves, pasará a “micriptosistema” las claves necesarias obtenidas mediante generación, teclado o archivo para el caso RSA; o de teclado o archivo para el resto de criptositemas. La clase “micriptosistema” se encargará de hacer las llamadas pertinentes a los algoritmos criptográficos para realizar las operaciones. El Nivel 3 para el caso de DES, TDES y RSA Digital comunica con la última clase de la jerarquía de estos, es decir, con aquella que da la clave privada. Para el caso de RSA, el Nivel 3 pasará las claves necesarias, evitando la privada en caso de encriptado. Los siguientes niveles solo se presentan para el caso de RSA. Estos son derivados del uso que este criptosistema hace de claves distintas para el cifrado y descifrado. El Nivel 4 obtiene las claves a través de un archivo o por entrada de teclado. Para terminar, el Nivel 5, es el equivalente al Nivel 3 para el caso de DES, TDES y RSA Digital, es decir, comunica con la última clase de la jerarquía de gestión de claves RSA y devuelve la clave privada. Los posibles caminos de transito que se han comentado para los criptosistemas y el protocolo, se muestran en la Figura 1.9, véase conjuntamente con la Figura 1.8. Vistas las interconexiones de las clases implementadas y con el conocimiento adquirido en esta introducción sobre el trabajo desarrollado, se continúa con el siguiente capítulo, donde confluirán teoría y código de los criptosistemas desarrollados20. 20 Toda las veces que se refiera a criptosistemas desarrollados como conjunto de las posibilidades criptograficas de CriptoYenet se esta incluyendo a RSAD aunque este sea un protocolo. -31-
  • 46. CRIPTOSISTEMAS Interfaz Principal 14 30 68 81 488 mirsa 44 123 69 Nivel 0 520 miproject 522 mides main Nivel 1 mitdes 81 miparametro 130 612 micriptosistema Nivel 2 55 103 mimargen Gestión RSA 65 Gestión DES-TDES 144 53 103 Gestión RSAD midefinirointeriordes migenecargosesirsa 59 146 midesotdes Nivel 3 80 304 56 migenerarrsa 115 mimanualoarchivorsa 59 158 miusarsesionrsa 50 105 micprivadades Nivel 4 55 113 56 mimanualrsa 166 miarchivocpsrsa 45 83 micprivadarsa 49 107 micprivadadesrsad Nivel 5 Figura 1.8: Relación entre las clases implementadas 44 130 miarchivocprivadarsad
  • 47. Capítulo 1: Introducción Elección de DES en “miproject” Elección de TDES en “miproject” Elección de RSAD en “miproject” Nivel 1 Nivel 2 Nivel 3 Nivel 4 Nivel 1 Nivel 2 Nivel 3 Nivel 4 Nivel 1 Nivel 2 Nivel 3 Nivel 5 Nivel 1 Elección de RSA en “miproject” Nivel 2 Nivel 3 Nivel 1 Nivel 2 Nivel 3 Nivel 1 Nivel 2 Nivel 1 Nivel 2 Nivel 1 Nivel 2 Nivel 1 Nivel 2 Nivel 5 Nivel 3 Nivel 3 Posibilidades RSA Figura 1.9: Caminos posibles para las comunicaciones de los criptosistemas y el protocolo. -33-
  • 48.
  • 50.
  • 51. Proyecto Fin de Carrera Capítulo 2: Algoritmos Criptográficos Desarrollados CAPÍTULO 2 - Algoritmos Criptográficos Desarrollados. Por sus ventajas y alcances, se empezó con la implementación de RSA y DES, para después a partir de ellos desarrollar TDES y RSAD. Criptosistemas y protocolo que son detallados en su implementación para el cifrado y descifrado, así como para su generación de claves, en los siguientes apartados. La parte correspondiente a la explicación de la gestión que se hizo de sus claves, se reserva para el final del capítulo. 2.1.- RSA. 2.1.1.- Introducción. Como ya se ha comentado brevemente en las Fases de Trabajo, el RSA es un algoritmo asimétrico cifrador de bloques, que utiliza una clave pública, la cual se distribuye (en forma autenticada preferentemente), y otra privada, la cual es guardada en secreto por su propietario [B.R.1.1 y B.R.1.29-1.31]. Este sistema fue desarrollado por Ronald Rivest, Adi Shamir, y Leonard Adleman, cuando eran estudiantes en la MIT. Su esquema es bastante simple (Figura 2.1). El transmisor o una red pública, disponen de las claves públicas con las que se cifra el mensaje. El mensaje cifrado “c” se transmite al receptor. Este por medio de la red pública obtiene la parte de la clave pública y la usa junto con su clave privada para descifraran “c”, obteniendo el mensaje original “m”. Figura 2.1: Sistema RSA La clave pública esta formado por un par: “n” y “e”. Utilizadas para el cifrado. La clave privada es “d” y se utiliza para el descifrado junto con la clave pública “n”. -37-
  • 52. Aplicación Software para el Desarrollo de Tareas Criptográficas 2.1.2 Generación de claves. La generación de claves del algoritmo RSA, tuvo su primera implementación en las fases del comienzo de lo que sería CriptoYenet. Sus bases se sustentan en una función especial denominada función φ (n ) . Función generadora de claves definida por la multiplicación de dos números primos elevados, a los que se les sustrae la unidad. Dicha expresión viene dada por: φ (n ) = ( p − 1)(q − 1) , siendo p ≠ q (2.1) La dinámica de esta generación, se inicializa escogiendo dos números primos muy elevados (cuanto mayores sean más seguro será el sistema) de forma que sean distintos entre si. El modo en el que se ha implementado la elección de cada uno de ellos se puede ver en el Cuadro de Código 2.1, donde se muestra el ejemplo concreto para el cálculo de “p”. Para el caso del primo “q”, el proceso es el mismo, únicamente se quita “p” de la lista de los primos a elegir. void MiGenerarRSA::elegirP(){ QStringList listaPrimosCarP;//lista de números primos almacenada como carácter dLimitesLista->vaciar();//para los limites de la lista dLimitesLista->ponerNombre(tr("Seleccione los parámetros para buscar los primos")); mpz_class minList=1000;//valor por defecto para el comienzo de búsqueda 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 parámetros de búsqueda if(dLimitesLista->getReady()){//si se aceptó continuamos minList=dLimitesLista->getInferior(); cantidad=dLimitesLista->getCantidad(); mpz_class i=0; while(i<cantidad){//vamos a calcular la cantidad de números primos mpz_nextprime(minList.get_mpz_t(), minList.get_mpz_t()); listaPrimosCarP.append(QString::fromStdString(minList.get_str(10)));//lo almacenamos i=i+1;//aumentamos la cantidad } dParametroEnRSA->vaciar(); dParametroEnRSA->ponerNombre(tr("Elija un número 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 Código 2.1: Cálculo de la lista de números primos -38-