ESCUELA TÉCNICA SUPERIOR DE
INGENIERÍA DE TELECOMUNICACIÓN

UNIVERSIDAD DE MÁLAGA

PROYECTO FIN DE CARRERA

APLICACIÓN SOFTWARE PARA EL DESARROLLO DE
TAREAS CRIPTOGRÁFICAS

INGENIERÍA DE TELECOMUNICACIÓN

MÁLAGA, 2008

GÉNESIS GARCÍA MORILLA
Aplicación software para el desarrollo de tareas criptográficas
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.: _________________
Aplicación software para el desarrollo de tareas criptográficas
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
Aplicación software para el desarrollo de tareas criptográficas
A mis padres Antonio y Paqui,
Y a mis hermanas Lidia y Anay.
Aplicación software para el desarrollo de tareas criptográficas
Í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
Aplicación software para el desarrollo de tareas criptográficas
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 -
Aplicación software para el desarrollo de tareas criptográficas
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-
Aplicación software para el desarrollo de tareas criptográficas
CAPÍTULO 2
-Algoritmos Criptográficos Desarrollados-
Aplicación software para el desarrollo de tareas criptográficas
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-
Capítulo 2: Algoritmos Criptográficos Desarrollados

A la vista del método implementado, resulta muy interesante situarlo
dentro de la clase en la Figura 1.8, para ver en que nivel del proceso se encuentra
y entender su comportamiento. Básicamente se va buscando los primos
consecutivos a partir de un límite inferior. La lista de primos estará completa
cuando se complete la cantidad definida por el usuario. El resto de código hace
referencia a los ajustes de etiquetas, botones y otros parámetros que no influyen
de manera directa con el procesado matemático del criptosistema. Su uso adecua
la interfaz y la correcta comunicación con el usuario, estos no se omiten por su
aporte a la comprensión del proceso, pero se comentarán tan solo a línea de
código21.
Obtenidos “p” y “q”, se calcula su producto, es decir, la clave pública que se
utilizara para el cifrado y el descifrado “n”. Su implementación en el Cuadro de
Código 2.2., se resume en una línea.

void MiGenerarRSA::calcularN(){
rsa->n= rsa->p*rsa->q;
labelN->setText(QString::fromStdString(rsa->n.get_str(10)));//ponemos como texto en labelN
botonN->setEnabled(false); botonE->setEnabled(true);//desactivamos N, activamos E
}
Cuadro de Código 2.2: Cálculo del producto de los números primos (clave pública “n”)

El siguiente paso es la elección de la clave pública “e”, presentada en una
lista. Para ello es necesario el cálculo previo de φ (n ) (véase la Expresión 2.1).
Esta clave debe cumplir la condición de primo relativo con φ (n ) (solo así tendrá
inversa modular y se podrá recuperar la señal más adelante). Así “e” debe
cumplir: 1 < e < φ (n ) y no tener ningún número menor que lo divida. Utilizando el
máximo común divisor con Euclides en su versión iterativa (véase Cuadro de
Código 2.3), se hizo una primera implementación al servicio de “e”. Debido a la
lentitud de este método con forme se manejaban números más grandes, se hizo
uso de una función especifica aportada por GMP [B.R.2.14]. Las claves públicas
obtenidas con esa función, se almacenarán en una lista según el Cuadro de
Código 2.4, para la posterior elección de “e”.

mpz_class MiRsa::mcdEuclides(mpz_class a, mpz_class b){
mpz_class t;
while(a>0){ t=a; a=b%a; b=t; }
return b; }
Cuadro de Código 2.3: Mínimo Común Divisor por Euclides en su forma iterativa

El par de claves públicas que deberá transmitir el usuario o que deberán
colocarse en una red pública, estará formado por la elección de la clave pública
“n” (según los primos) y de la clave pública “e” (seleccionada de la lista).
21

Esta aclaración es igualmente valida para el resto de los métodos comentados, por lo que se
omitirá en los subsecuentes Cuadros de Código.

-39-
Aplicación Software para el Desarrollo de Tareas Criptográficas
void MiGenerarRSA::elegirE(){
mpz_class o=(rsa->p-1)*(rsa->q-1);
QStringList listaClavesE;//lista de posibles claves públicas e, almacenada como carácter
dLimitesLista->vaciar();//para los limites de la lista
dLimitesLista->ponerNombre(tr("Seleccione los parámetros para buscar las claves públicas
E"));
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 gcd;//para el máximo común divisor
mpz_class i=0;
while((i<cantidad)&&(minList<(o-1))){//vamos a calcular la cantidad de claves públicas
mpz_gcd (gcd.get_mpz_t(), minList.get_mpz_t(), o.get_mpz_t());
if(gcd==1){//si existe inversa
listaClavesE.append(QString::fromStdString(minList.get_str(10)));//almacenamos
i=i+1;//aumentamos la cantidad
}
minList=minList+1;//probamos el siguiente
}
dParametroEnRSA->vaciar();
dParametroEnRSA->ponerNombre("Elija una Clave Pública de la lista");
dParametroEnRSA->ponerLista(listaClavesE);
dParametroEnRSA->exec();
if(dParametroEnRSA->listo()){
//Guardamos QString como mpz_class
rsa->e.set_str(dParametroEnRSA->extraer().toAscii().data(),10);
labelE->setText(dParametroEnRSA->extraer());//ponemos el texto en labelP
botonE->setEnabled(false);//desactivamos este paso
botonD->setEnabled(true);//activamos el siguiente paso
}
}
}
Cuadro de Código 2.4: Cálculo de la lista de claves públicas “e”

Lo siguiente es el cálculo de la inversa de la clave elegida “e”, a la que se
le llamará “d”, esta será la clave privada. Su cometido junto con “n” es el
descifrado. Para su cálculo, el cual es posible gracias a la comprobación de su
existencia en el Cuadro de Código 2.4, se tiene que despejar “d” de la siguiente
expresión:
de ≡ 1(mod φ (n))

(2.2)

Este caso, el de la clave privada en la generación de claves en RSA, se
traduce, al igual que los anteriores pasos, literalmente a nivel de programación.
Su método esta presentado en el Cuadro de Código 2.5.
-40-
Capítulo 2: Algoritmos Criptográficos Desarrollados

En primer lugar, se hizo uso de un bucle para la clave privada “d”, que
multiplicada por la clave pública “e” modulo “phi” resultase 1. El inconveniente de
la lentitud que presentaba este proceso para el cálculo de la inversa, propino es
uso de un método especifico de GMP.

void MiGenerarRSA::calcularD(){
mpz_class o=(rsa->p-1)*(rsa->q-1);
//Calculamos la inversa de “e” y la almacenamos en “d”
mpz_invert(rsa->d.get_mpz_t(),rsa->e.get_mpz_t(),o.get_mpz_t());
labelD->setText(QString::fromStdString(rsa->d.get_str(10)));//ponemos en labelP
botonD->setEnabled(false);//desactivamos este paso
aceptar->setEnabled(true);//activamos el boton que verifica terminado
}
Cuadro de Código 2.5: Cálculo de la clave privada “d”

Resumiendo, se tiene un número “e” (un exponente) que sale de φ (n ) , un
número “d” (otro exponente) que sale de φ (n ) y el número “n” (un modulo). Como
ya se ha comentado en varias ocasiones con ”e” y ”n” se puede cifrar y con “d” y
“n” se puede descifrar, con lo que ya no es necesario el generador de claves,
φ (n ) .
Si alguien quisiera generar nuestra clave privada de nuevo, tendría que
recuperar φ (n ) . Y es aquí donde radica la seguridad del RSA, en la imposibilidad
de factorizar para recuperar el generador. Si alguien quisiera recuperar φ (n ) para
sacar la clave privada calculando la inversa de la pública, solo conoce ”n”, no
conoce “p” ni ”q”. Así que tendría que empezar a dividir ”n” entre números primos
gigantes para adivinar ”p” y ”q” y luego poder hacer (p-1)(q-1) que es φ (n ) . Lo cual
presenta dos dificultades, una es que ir dividiendo requiere muchos recursos, y
otra es saber si el número por el que se divide es primo, por lo que la factorización
de ”n” (que así se llama a encontrar “p” y ”q”) se vuelve un problema intratable.
En caso de duda para este y otros apartados se recomienda el Apéndice B,
donde se presenta la base criptográfica básica, así como la matemática.
Concretamente para el sistema RSA véase el Apartado 9 del Apéndice B.

2.1.3 Cifrado.
Para cifrar, lo único que se hace es elevar lo que se quiere cifrar a ”e” (el
exponente de la clave pública) y calcular su modulo “n”, es decir, según la
expresión:
c ≡ m e (mod n)

(2.3)

El paso a nivel de programación del cifrado (Cuadro de Código 2.6.), no es
tan inmediato como en la generación de claves, pudiendo dar problemas como los
-41-
Aplicación Software para el Desarrollo de Tareas Criptográficas

vistos en el Capítulo 1, Apartado 1.3.1. La implementación del cifrado parte de los
caracteres que conforman el mensaje. Coge sus estados numéricos elevándolos
dentro de un bucle a razón de “e”, mientras se va multiplicando los resultado
sucesivos y se calcula el modulo “n” en cada vuelta del bucle. Al final, cada
número obtenido correspondiente al cifrado de un carácter, es almacenado dentro
de una lista como cadena de caracteres numéricos decimales para su posterior
muestra. La misma implementación (véase Cuadro de Código 1.2), fue sustituida
en las últimas fases del proyecto por su análoga en GMP, “mpz_powm”,
aumentando la velocidad en el proceso.

QStringList MiRsa::encriptar(QString mensaje){
mpz_class encriptado[mensaje.size()];//array de mpz_class para almacenar el encriptado
QStringList encriptadoQStrList;//lista de QString para almacenar los car Encriptados
mpz_class carClaro;//para los caracteres del mensaje en unicode
//Encriptamos tal que ((mensaje)^e)mod n
for(int i=0;i<mensaje.size();i++){
//Pasamos a unicode el caracter
carClaro=mensaje[i].unicode();
//Se encripta a razon de ((caracter)^e)mod n
mpz_powm(encriptado[i].get_mpz_t(),carClaro.get_mpz_t(),e.get_mpz_t(),n.get_mpz_t());
//Vamos copiando mi encriptado en un QStringLis
encriptadoQStrList.insert(i,QString::fromStdString(encriptado[i].get_str(10)));
}
return(encriptadoQStrList);//devolvemos QStringList
}
Cuadro de Código 2.6: Cifrado RSA

2.1.4 Descifrado.
Para descifrar es un poco más complicado. Como se ha visto, las claves
vienen calculadas en módulo φ (n ) , y nada tienen que ver a priori con “n”, son dos
segmentos de números distintos. Pues a partir de una propiedad que dice que si
se multiplica un número ”a” (distinto de cero) por si mismo φ (n ) veces, el resultado
da 1 en módulo “n” con lo que se puede recuperar el mensaje (véase
demostración en la Figura 2.2). Es en esta propiedad en la que se basa todo el
algoritmo RSA, haciendo que el código implementado para el descifrado funcione
(véase Cuadro de Código 2.7). Para mayor entendimiento se expone la
demostración en la Figura 2.2., y un ejemplo práctico al finalizar.
Se tiene que el descifrado en RSA obedece a la expresión:
m ≡ c d (mod n)

(2.4)

La Expresión 2.4 presenta la misma forma que la del encriptado
(Expresión 2.3) y su implementación según el Cuadro de Código 2.7, (partiendo
de la propiedad comentada para recuperar el mensaje), no ofrece ningún secreto.
Lo que si cambia es que ahora se parte de la lista de números cifrados, que están
-42-
Capítulo 2: Algoritmos Criptográficos Desarrollados

representados como listas de caracteres. Se quiere obtener el número en el
código Unicode que lo representaba, para adjuntarlo todo (carácter a carácter
recuperado) en la cadena que se devuelve.

QString MiRsa::desencriptar(QStringList encriptadoList){
//Para el desencriptado
mpz_class desencriptado[encriptadoList.size()];//array de mpz_class para almacenar el
desencriptado
QString desencriptadoQStr;//QString para almacenar los car Desencriptados
mpz_class carCifrado;//para los caracteres cifrados
//Desencriptamos tal que ((mensaje)^d)mod n
for(int i=0;i<encriptadoList.size();i++){
//Pasamos a mpz_class la cadena del caracter
carCifrado.set_str(encriptadoList[i].toStdString(),10);
//Se desencripta a razon de ((caracter)^d)mod n
mpz_powm(desencriptado[i].get_mpz_t(),carCifrado.get_mpz_t(),d.get_mpz_t()
,n.get_mpz_t());
//Vamos copiando mi encriptado en un QString
desencriptadoQStr[i]=QChar(QString::fromStdString(desencriptado[i].get_str(10)).toInt());
}
return(desencriptadoQStr);//devolvemos QString
}

Cuadro de Código 2.7: Descifrado RSA

Vistos el cifrado y el descifrado en RSA, para concluir que mejor forma que
mediante un ejemplo práctico para ambos en el que se afiance lo explicado. En
este se han elegido números pequeños para facilitar los cálculos, los cuales no
presentan seguridad alguna pero ilustran muy bien el proceso criptográfico.
1) Para el principio de la generación de claves el usuario obtiene la clave pública
”n”, como se dijo en el Apartado 2.1.2, según la multiplicación de los primos “p” y
“q” que escogió, por ejemplo: n = 5 * 11.

2) Con la elección de los primos se calcula el generador de claves a partir de la
expresión (2.1), obteniendo: φ (n ) = 4 * 10 = 40.
3) El siguiente paso es la elección de una clave pública “e” que sea primo relativo
con 40 (véase el uso del método del Cuadro de Código 2.3 en el Cuadro de
Código 2.4), por ejemplo: e = 7.
4) El último paso es la generación de la clave privada “d” a partir de “e”, es decir,
el cálculo de su inversa módulo 40, que es 23: 7*23 = 161 = 1 módulo 40.
Obteniéndose d = 23.
Se ha conseguido la clave pública formada por (55, 7) y la privada (23). Si
ahora se quiere cifrar, por ejemplo, el número 2, bastará con calcular 2^7 = 128 =
18 módulo 55. Y para su descifrado, se elevará 18 a 23 módulo 55 y da 2, el
mensaje recuperado.
-43-
Aplicación Software para el Desarrollo de Tareas Criptográficas

Continuando con la propiedad de recuperación del mensaje en RSA, la
cual, “como acto de fe” se dio por valida, se expone su demostración a través del
siguiente diagrama representado en la Figura 2.2. En ella se ha omitido el modulo
“n” para los cálculos al no sufrir cambios durante el proceso.

e

Partiendo del cifrado, sustituimos el valor de este en la expresión 2.4

c=m
m = (me ) d

Quedando el descifrado tal y como se muestra aquí.

d ⋅ e mod φ (n) = 1

Utilizando la propiedad de que “e” y “d” son inversa

d ⋅ e = k ⋅ φ (n) + 1

Escribimos la expresión de esta forma para usarla al final

Por último aplicando reglas matemáticas normales y la
siguiente propiedad:

aφ ( n ) = 1

Obtenemos
m

m = m e⋅d = m k ⋅φ ( n ) +1 = ( mφ ( n ) ) k ⋅ m1 = 1k ⋅ m
Figura 2.2: Demostración del Descifrado en RSA

2.1.5 Conclusiones.
Las conclusiones tras el desarrollo y estudio de RSA, demuestran que
como método criptográfico a implementar es bastante sencillo si se tienen los
conocimientos de programación y bases criptográficas necesarias. Referente a las
ventajas y desventajas, algunas de las cuales se comentaron en el Capítulo 1,
apartado 1.3.1, se puntualizan en los subsecuentes renglones terminando con un
esbozo que explica el uso actual de tal algoritmo.
Las ventajas que dotan a RSA de entre las mejores elecciones para la
protección y seguridad de datos, se deben a que dentro de los algoritmos
asimétricos se muestra como el más rápido. A su vez gracias a las longitudes de
claves usadas en la actualidad es prácticamente imposible romperlo, es decir, no
hay tiempo ni recursos como para que sea factible.
Su uso no requiere de claves secretas para el cifrado del mensaje, evitando
-44-
Capítulo 2: Algoritmos Criptográficos Desarrollados

la intersección de terceros en el canal proporcionando. En el caso de trabajo junto
a algoritmos simétricos habilita un medio seguro (véase Apartado 2.4, RSA
Digital). Otro uso que también acomete es el firmado digital, evitando las
suplantaciones de identidad. Permite además la detección de alteraciones y
errores en la transmisión de documentos. Por todo ello, RSA conforma un
estándar internacional y “de facto” en la industria del software.
Sin embargo, cuenta con dos desventajas mínimas a destacar. La primera
es propia de su grupo, pues al ser un algoritmo asimétrico es mucho más lento y
complejo, precio que se paga a favor de un mayor aporte de seguridad. La
segunda es la producida por el uso indebido de longitudes de clave pequeñas.
Esto convierte al RSA en una simple herramienta de transposición, es decir, si
(m)^e es menor a la longitud de la codificación ASCII, UNICODE… RSA no aporta
seguridad. Para demostrar semejante desventaja se recurre al siguiente ejemplo:
Con la base de codificación UTF22 para la representación de los
caracteres a cifrar por RSA (en cuyo caso la máxima longitud representable sería
2^24) y del uso de una red pública que proporciona la clave pública e=3. Se
quiere cifrar el mensaje en claro formado por los caracteres ‘a’,’b’ y ‘c’ (97,98,99
respectivamente usando UTF). El cifrado resulta (97)^3=912673, (98)^3=941192,
(99)^3=970299, para cada uno de los cuales el valor numérico es menor que
2^24. Entonces sabiendo el exponente “e” (público) y el módulo “n” (público) se
puede recuperar el mensaje sin necesidad de la clave privada “d”. Si la clave “e”
hubiese sido por ejemplo 329, no se hubiese producido esa transposición pues se
sale del máximo valor representable por la codificación y hubiese sido necesario
aplicar el proceso de la Figura 2.2, el descifrado mediante “n” y “d”.
Para concluir con este algoritmo criptográfico desarrollado, comentar que la
utilización del sistema RSA está experimentando una rápida expansión y puede
llegar a ser omnipresente en los próximos años. Hoy en día, se utiliza en una gran
variedad de productos, plataformas e industrias del mundo entero. Se encuentra
en productos comerciales de software y se planea una expansión mayor. RSA
está incluido en sistemas Apple, Microsoft, Netscape, Novell, Sun…, actuales y
futuros. En cuanto al hardware, el sistema RSA se puede encontrar en teléfonos
seguros, en tarjetas de redes Ethernet y en tarjetas inteligentes.
El RSA se utiliza también en muchos organismos estatales, grandes
compañías, laboratorios y universidades. La adopción del sistema RSA parece
utilizarse más rápidamente para autenticación (firmas digitales) que para una
mayor privacidad (encriptado). Quizá, esto se deba a que los productos para
autenticación son más fáciles de exportar.
En los que se refiere a los estándares usados, el sistema RSA forma parte
de muchos estándares oficiales en todo el mundo. El estándar ISO23 9796, incluye
al RSA como un algoritmo criptográfico, como así también el CCITT24, mediante el
estándar de seguridad X.509. También forma parte de los estándares de
SWIFT25, de los estándares de ETEBAC 5 del sistema financiero francés y del
22

Forma de representar caracteres UNICODE e ISO/IEC 10646 como una serie de palabras de 16 y 24 bits.
ISO, Organización Internacional de Estándares.
24
CCITT, Comité Internacional de Consulta en Telegrafía y Telefonía.
25
SWIFT, Sociedad para las Telecomunicaciones Financieras Interbancarias Mundiales.
23

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

borrador del estándar ANSI X9.31 del sistema bancario estadounidense.También
el estándar australiano de administración de claves, AS2805.6.5.3 especifica
RSA. Otros estándares están en etapa de desarrollo y se anunciarán dentro de
los próximos años. Se espera que muchos incluyan el RSA como sistema
adicional o recomendado para autenticación y/o privacidad.

2.2 DES
2.2.1 Introducción.
Como ya se ha comentado brevemente en las Fases de Trabajo (Apartado
1.3), el DES es un algoritmo simétrico cifrador de bloques que utiliza una clave
secreta para todo que debe proporcionarse por un canal seguro. En este caso, el
algoritmo toma la información en bloques de 64 bits produciendo un bloque de
texto cifrado también de 64 bits (véase Apartado 2.2.3., Figura 2.4). Este sistema
fue desarrollado por Horst Feistel, cuando trabajaba para IBM. Las claves
utilizadas por DES son de 56 bits, aunque se suelen distribuir en forma de un
número de 64 bits, donde cada octavo bit (el bit menos significativo) de cada uno
de los ocho bytes de la clave es un bit de paridad (Figura 2.3).

Byte 1

Byte 2

7 bits

Byte 8
…

7 bits
Paridad

Paridad

7 bits
Paridad

Figura 2.3: Clave DES

2.2.2 Generación de Claves.
La generación de claves del algoritmo DES, la cual tuvo su primera
implementación en las primera aplicación DES desarrollada para consola, no tiene
ningún secreto, pues restringiendo su longitud a 64 bits es la que el usuario
desee. Esta clave es la que comúnmente se llamará clave original, a partir de la
cual se generan una serie de subclaves de ronda distintas “Ki” (según el Cuadro
de Código 2.8), que se irán combinando con la parte derecha expandida del
bloque de mensaje según se muestra en la Figura 2.5 al final del Apartado 2.2.4
para obtener el bloque cifrado después de la inversión al final de la última ronda.
Aunque para algunos lectores puede quedar explicado con los breves
comentarios en las líneas de código y el uso de declaraciones intuitivas, el cuadro
anterior deja muchas lagunas si no se esta acostumbrado a interpretar código. Se
expresa de manera más detallada en los subsecuentes renglones, lo que se
tradujo a nivel de programación de las tablas y expresiones presentadas en las
referencias [B.R.1.1 y B.R.1.4-1.7].
-46-
Capítulo 2: Algoritmos Criptográficos Desarrollados
void MiDes::keygen(){//Partiendo de la clave[64] aplicamos una serie de permutaciones
//Realizamos una permutación fija de clave[64] para distribuir todos los bits quedándonos solo
//con 56 de estos (se descartan los de paridad), (pemutacionTipo1())
permutacionTipo1();//primera permutación. Obtenemos permuTipo1[56]
int i,k=0;
for(i=0;i<28;i++){//introducimos la primera mitad de permuTipo1[56] en mitadA_pT1[28]
mitadA_pT1[i]=permuTipo1[i];
}
for(i=28;i<56;i++){//introducimos la segunda mitad de en mitadA_pT1[28]
mitadB_pT1[k]=permuTipo1[i]; permuTipo1[56]
k++;
}
int desplazamiento=0,ronda;
//Repetimos 16 veces, 16 rondas (característico DES), queremos una subclave para cada una
for(ronda=1;ronda<=16;ronda++){//elegimos el desplazamiento según la ronda
if(ronda==1||ronda==2||ronda==9||ronda==16) desplazamiento=1;
else
desplazamiento=2;
while(desplazamiento>0){
int t; t=mitadA_pT1[0];
for(i=0;i<28;i++)//desplazamos hacia la izquierda la primera mitad
mitadA_pT1[i]=mitadA_pT1[i+1];
mitadA_pT1[27]=t; t=mitadB_pT1[0];
for(i=0;i<28;i++)//desplazamos hacia la izquierda la segunda mitad
mitadB_pT1[i]=mitadB_pT1[i+1];
mitadB_pT1[27]=t; desplazamiento--;
}
//De los 56 bits que forman mitadA_pT1[28] y mitadB_pT1[28]
//se seleccionan 48 modificando su orden (permutacionTipo2())
permutacionTipo2();//segunda permutación. Obtenemos a[48]
for(i=0;i<48;i++)//metemos la clave a[58] en cada ronda
subClave[ronda-1][i]=a[i];//subClaves generadas
}
}
Cuadro de Código 2.8: Generación de subClaves en DES

Tal y como se introdujo al principio del apartado, en cada ronda se genera una
subclave “Ki” distinta. Según el Cuadro de Código 2.8., con la primera
permutación “permutacionTipo1()” de los 64 bit de la clave, se descartan los 8 bits
de paridad quedando una clave de 56 bits. Esta se realiza mediante la Tabla 2.1.

57 49 41 33 25 17 09 01 58 50 42 34 26 18
10 02 59 51 43 35 27 19 11 03 60 52 44 36
63 55 47 39 31 23 15 07 62 54 46 38 30 22
14 06 61 53 45 37 29 21 13 05 28 20 12 04
Tabla 2.1: Permutación Tipo 1.

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

Se puede observar, que no aparecen los bits 8, 16, 24, 32, 40, 48, 56 ni 64,
que son los que hacen la función de bits de paridad (Figura 2.3). La clave
resultante se divide en dos mitades de 28 bits, “mitadA_pT1” y “mitadB_pT1”
(véase Cuadro de Código 2.8), para luego alimentar unos registros que rotan
hacia la izquierda según un número de bits que viene determinado por la ronda en
la que se encuentra el proceso (recordar que en el DES existen 16 rondas). Este
desplazamiento para las mitades es el contenido en la Tabla 2.2.

Ronda

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16

Desplazamiento

1

1

2

2

2

2

2

2

1

2

2

2

2

2

2

1

Tabla 2.2: Desplazamiento de “mitadA_pT1” y “mitadB_pT1”, según la ronda

De los 56 bits resultantes se seleccionan 48 modificando su orden. Esta
operación es denominada permutación de compresión y se adjunta en la Tabla
2.3.
14 17 11 24 01 05 03 28 15 06 21 10
23 19 12 04 26 08 16 07 27 20 13 02
41 52 31 37 47 55 30 40 51 45 33 48
44 49 39 56 34 53 46 42 50 36 29 32
Tabla 2.3: Permutación Tipo 2.

En la salida de la permutación de compresión según el último bucle se
obtiene la subclave ”Ki” de 48 bits correspondiente a la ronda i-ésima del
algoritmo.

2.2.3 Cifrado.
Para el cifrado el algoritmo se basa en una Red de Feistel delimitada entre
la permutación inicial y final (Figura 2.4, mostrada al final de este apartado), la
cual presenta la ventaja de ser reversible por lo que ya se puede adelantar que la
función de descifrado será idéntica, requiriendo únicamente invertir el orden de las
subclaves utilizadas. Así, una vez se haya entendido el cifrado, el descifrado no
presentará mayores complicaciones. Se presenta en primer lugar la
implementación en el Cuadro de Código 2.9, para luego pasar a su explicación en
detalle y terminar con el diagrama de la parte propia del DES.
Antes de empezar con el proceso de cifrado hay que tener en cuenta que
solo se pueden coger bloques de 64 en 64 bits, por lo que el mensaje es
necesario ir cogiéndolo trozo a trozo. Para este cometido se implementó el bucle
principal a razón del tamaño del mensaje inicial. Una vez cogido el bloque hay
que generar las subClaves de rondas necesarias mediante el método “keygen()”
(Cuadro de Código 2.8). Todas las líneas anteriores a este método son para la
definición de variables de alcance, tamaños de arrays y correcta finalización del
-48-
Capítulo 2: Algoritmos Criptográficos Desarrollados

mensaje inicial. Tras generar las subClaves se pasa a la codificación del bloque
del mensaje a binario pues este se encuentra como cadena de caracteres. Para
ello una vez que es convertido a su expresión numérica en UNICODE se pasa de
formato decimal a binario mediante divisiones por dos en la que se va guardando
el resto. Obtenido el bloque de mensaje en binario ya es posible aplicarle el
criptosistema DES (Figura 2.4).
Lo primero que se realiza en la parte propiamente del algoritmo
criptográfico es una permutación de los 64 bits del bloque de entrada, lo que a
línea de código se puede identificar como “permutacionInicial()”. Realmente, esta
permutación presentada en la Tabla 2.4., no añade seguridad alguna y su
principal función es la de facilitar la carga de los bits de información en bloques de
8 bits a un chip especializado en DES26. Al final del algoritmo hay otra
permutación que es la inversa de esta, lo que vuelve a dejar a los bits en su
posición inicial.

QStringList MiDes::encriptar(QString mensajeIni){
unsigned int m;
int i,a1,j,nB,iB,k,K,B[8],n,d,ronda;
//Para el encriptado
int longitudEncriptado= (mensajeIni.size()/8)*8+8;// encriptamos en bloques de 8
int encriptado[longitudEncriptado];//array de enteros para almacenar el encriptado
QStringList encriptadoList;//lista de QString para almacenar los números del Encriptado
i=mensajeIni.size();
int mc=0;
a1=i%8;
if(a1!=0) for(j=0;j<8-a1;j++,i++) mensajeIni[i]=' '; mensajeIni[i]='0';
keygen();//generamos las subClaves de rondas
//Repetimos (Longitud del Texto)/8 veces
for(iB=0,nB=0,m=0;m<(mensajeIni.size()/8);m++){
for(iB=0,i=0;i<8;i++,nB++){
n= mensajeIni[nB].unicode();
for(K=7;n>=1;K--){
B[K]=n%2;//pasamos a Formato Binario, de 8-Bytes a 64-bits
n/=2;
}
for(;K>=0;K--) B[K]=0;
for(K=0;K<8;K++,iB++) mensajeEnBinario[iB]=B[K];/obtenemos mensajeEnBinario[64]
}
permutacionInicial();//hacemos la permutación inicial fija, permuInicial[64]
//Copiamos permuInicial[64] en mensajeEnBinario[64]
for(i=0;i<64;i++) mensajeEnBinario[i]=permuInicial[i];
//Dividimos mensajeEnBinario[64] en 2 partes
for(i=0;i<32;i++) left[i]=mensajeEnBinario[i];//parte izquierda
for(;i<64;i++) right[i-32]=mensajeEnBinario[i];//parte derecha
Cuadro de Código 2.9: Cifrado DES (parte 1/2)

26

Debido a que el desarrollo del DES es anterior a los procesadores de 16 o 32 bits.

-49-
Aplicación Software para el Desarrollo de Tareas Criptográficas
for(ronda=1;ronda<=16;ronda++){//Repetimos 16 veces, 16 rondas
Expansion();//expandimos la parte derecha right[32], obtenemos expansion[48]
xorTipo1E(ronda);//xor con expansion[48] y subClave[ronda-1][48], obtenemos xor1[48]
sustitucion();//sustituimos xor1[48], obtenemos sus[32]
permutacionP();//permutamos sus[32], obtenemos per[32]
xorTipo2();//xor con la parte izquierda, left[32] y per[32], obtenemos xor2[32]
//La parte de la derecha de esta ronda right[i] pasará a ser la parte izquierda de la
//siguiente left[i] en ronda++ y el resultado de la XOR anterior, xor2[i] pasará a ser
//la parte derecha de la ronda siguiente right[i] en ronda++
for(i=0;i<32;i++) left[i]=right[i];
for(i=0;i<32;i++) right[i]=xor2[i];
}//en la ultima ronda no se produce este entrecruce
//Almacenamos ambas partes en temp[i]
for(i=0;i<32;i++) temp[i]=right[i];
for(;i<64;i++) temp[i]=left[i-32];
inversa();//invertimos los bits de temp[64], obtenemos inv[8][8]
//Mensaje Cifrado
k=128;d=0;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
d=d+inv[i][j]*k;
k=k/2;
}
encriptado[mc++]=d;
k=128; d=0;
}
}//ya hemos encriptado todo el texto
//Copiamos mi encriptado en un QStringList
for(int i=0;i<mc;i++){
encriptadoList.insert(i,QString::number(encriptado[i]));
}//si lo hacemos en el encriptado da error
restaurarCPrivada();
return(encriptadoList);
}
Cuadro de Código 2.9: Cifrado (parte DES 2/2)

58 50 42 34 26 18 10 02 60 52 44 36 28 20 12 04
62 54 46 38 30 22 14 06 64 56 48 40 32 24 16 08
57 49 41 33 25 17 09 01 59 51 43 35 27 19 11 03
61 53 45 37 29 21 13 05 63 55 47 39 31 23 15 07
Tabla 2.4: Permutación Inicial

-50-
Capítulo 2: Algoritmos Criptográficos Desarrollados

Esta tabla debe leerse de izquierda a derecha y de arriba a bajo. Esto
quiere decir, que el primer bit a la salida de la permutación es el que en la entrada
ocupa la posición 58; el segundo, el que ocupaba la 50; y así sucesivamente.
Después de esta permutación inicial, los 64 bits resultantes se dividen en dos
partes de 32 bits cada una: “left” y “right”. Partes que pasarán a la disposición de
un bucle que se repite 16 veces aplicando una serie de transformaciones.
La primera de las transformaciones que añade seguridad es a la que se
hace referencia en el código con el nombre de “Expansion()”, este método coge la
mitad derecha “right” (Ri) y la introduce en una función (f) donde es combinada
con la subClave de ronda que se había generado. Mediante esta permutación de
expansión, se expanden los 32 bits de “Ri” a 48 bits (repitiendo alguno de los bits)
cambiando, además, su posición. Esto se hace para que este operando tenga el
mismo tamaño que la subclave de la ronda, y además hace que los bits del
criptograma dependan todavía con más fuerza de los bits de la entrada. Este
hecho se conoce como el efecto avalancha: un pequeño cambio en el mensaje de
entrada provoca grandes modificaciones en la secuencia de bits de salida. Las
transformaciones a las que hace referencia esta permutación están presentadas
en la Tabla 2.5.

32 01 02 03 04 05 04 05 06 07 08 09
08 09 10 11 12 13 12 13 14 15 16 17
16 17 18 19 20 21 20 21 22 23 24 25
24 25 26 27 28 29 28 29 30 31 32 01
Tabla 2.5: Permutación de Expansión

El segundo método “xorTipo1E(ronda)” efectúa una simple XOR con el
resultado anterior (f) y con la mitad izquierda del bloque de mensaje binario, “left”
(Li).
El tercer método “sustitucion()” introduce los 48 bits resultantes de la XOR
entre la parte derecha “Ri” expandida y la subclave “Ki” y los introduce de seis en
seis en ocho bloques que son conocidos como S-Box, de tal manera que el primer
bloque de 6 bits se introduce en la S-Box 1, el segundo en la S-Box 2, y así
sucesivamente. Como cada S-Box toma 6 bits como entrada y produce 4 bits
como salida, al final obtenemos 32 bits (8 S-Box · 4 bits/S-Box = 32 bits).
Cada S-Box es una tabla de cuatro filas y dieciséis columnas, donde cada
posición de la tabla es un número de 4 bits. De los 6 bits de la entrada b1 b2 b3
b4 b5 b6, los bits b1 y b6 indican la fila, mientras que los otros cuatro indican la
columna. Es decir, si la entrada de una S-Box es 35, esto en binario es 100011, lo
que significa que hemos de tomar el valor de la fila 3 (11) y columna 1 (0001). El
contenido de cada una de las S-Box es distinta del de las demás y se mantuvo en
alto secreto por el gobierno de Estados Unidos hasta que el DES fue roto. Las
llamadas S-Boxs encontradas en la referencia [B.R.1.6]. Se presenta como
ejemplo la Tabla 2.6, correspondiente a la S-Box 1. El resto de tablas hasta la SBox 8, presentan el mismo formato.
-51-
Aplicación Software para el Desarrollo de Tareas Criptográficas
14 04 13 01 02 15 11 08 03 10 06 12 05 09 00 07
00 15 07 04 14 02 13 01 10 06 12 11 09 05 03 08
04 01 14 08 13 06 02 11 15 12 09 07 03 10 05 00
15 12 08 02 04 09 01 07 05 11 03 14 10 00 06 13
Tabla 2.6: S-Box 1

El cuarto método “permutacionP()”, se encarga de los 32 bits resultantes de
la anterior operación, en esta transformación los bits son permutados otra vez
(Tabla 2.7), pero esta vez no se eliminan ni añaden bits como se había hecho en
las permutaciones de compresión y expansión.

16 07 20 21 29 12 28 17 01 15 23 26 05 18 31 10
02 08 24 14 32 27 03 09 19 13 30 06 22 11 04 25
Tabla 2.7: Permutación P

Para finalizar la ronda, se ejecuta el método quinto, “xorTipo2()”, que coge
la salida de la permutación P para alimentar una XOR en la que el otro operando
es la parte izquierda “left” (Li). Si no se esta en la ronda 16, el resultado de la XOR
anterior se convierte en la parte derecha de la siguiente ronda Ri+1, y la parte
derecha de la ronda en la que estamos Ri pasará a ser la parte izquierda del
siguiente Li+1. Y así sucesivamente hasta completar las 16 rondas. Este
entrecruce se expone mediante las siguientes expresiones:
Li+1=Ri

(2.5)

Ri+1= Li XORƒ(Ri ,ki)

(2.6)

La única excepción a este proceso está en la última ronda, en la que el
entrecruce de las dos partes no se produce.
Una vez fuera del bucle para las rondas característico del DES, la
concatenación de L16 y R16 se introduce en una permutación final, que ya se
había comentado al inicio de la explicación del algoritmo. Esta permutación es la
inversa de la permutación inicial (Tabla 2.4) quedando de la manera que se
muestra en la Tabla 2.8.

40 08 48 16 56 24 64 32 39 07 47 15 55 23 63 31
38 06 46 14 54 22 62 30 37 05 45 13 53 21 61 29
36 04 44 12 52 20 60 28 35 03 43 11 51 19 59 27
34 02 42 10 50 18 58 26 33 01 41 09 49 17 57 25
Tabla 2.8: Permutación Final (inversa de la Permutación Inicial)

-52-
Capítulo 2: Algoritmos Criptográficos Desarrollados

Se podría haber hecho que en la ronda final se intercambiaran las partes
derecha e izquierda, y adaptar la permutación final para que tuviera en cuenta
este intercambio de más. Pero no se hizo porque de esta manera se puede utilizar
el mismo algoritmo tanto para el cifrado como para el descifrado.
De toda esta explicación sobre el Cuadro de Código 2.9, referente al
cifrado DES y sus correspondientes ajustes de implementación, se presenta en la
Figura 2.4 el diagrama referido al cifrado propiamente dicho, centrándose dentro
del bucle para las rondas, en los entrecruces y en el uso de la función “f”
explicada. Cada uno de los elementos que aparecen, han sido referenciados con
anterioridad por lo que no debe suponer ninguna perdida, sino un resumen
esquematizado que ayude a la comprensión del código.
La parte central de la Figura 2.4, correspondiente a la incursión de la
subclave de ronda en la función “f” a lo largo de las 16 vueltas, se detalla en la
Figura 2.5. Para la cual también se ha visto conveniente desarrollar el esquema
de generación de las subclaves de ronda (lado derecho), explicado con
anterioridad en el Apartado 2.2.2. Haciendo referencia al código, en la figura se
muestran “keygen()” y el bucle de rondas (con la ausencia de “xorTipo2()”), es
decir, “Expansion()”, “xorTipo1E(ronda)”, ”sustitucion()” y “permutacionP()”. La
figura puede suscitar que las subclaves se van obteniendo a medida que van
siendo efectuadas las rondas en el bucle, lo que no es cierto, pues la ejecución de
“keygen()” se finaliza en una fase anterior almacenando todas las subclaves para
su posterior utilización con “xorTipo1()”.

2.2.4 Descifrado.
El algoritmo de descifrado es el mismo que el de cifrado (véanse cuadros
de código y figuras del Apartado 2.2.3), con la única matización de que las
subclaves deben utilizarse en el orden inverso. Es decir, si en el algoritmo de
cifrado las subclaves de cada ronda eran K1, K2,…, K16, en el descifrado las
subclaves son K16, K15,..., K1, entendiendo que la primera subclave (K1 en el
cifrado y K16 en el descifrado) es la que se utiliza en la primera ronda; la segunda
subclave (K2 en el cifrado y K15 en el descifrado), en la segunda ronda, y así
sucesivamente. Además, el algoritmo mediante el cual se generan las subclaves
es circular. Así que para generar las subclaves necesarias para el descifrado, los
registros de rotación en lugar de desplazar hacia la izquierda, lo deben hacer
hacia la derecha y el número de desplazamientos viene dado por la Tabla 2.9.

Ronda

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16

Desplazamiento 0

1

2

2

2

2

2

2

1

2

2

2

2

2

2

1

Tabla 2.9: Desplazamiento de las mitades según la ronda para el descifrado

2.2.5 Conclusiones.
Las conclusiones tras el desarrollo y estudio de DES, demuestran que
como método criptográfico a implementar es bastante más complejo que RSA
pese a utilizar operaciones más sencillas. El problema no reside en la base
-53-
Aplicación Software para el Desarrollo de Tareas Criptográficas

criptográfica sino en el aumento de líneas de código, ya que en programación
aumentan los descuidos según aumenta el número de horas y “líneas picadas” a
lo que se suma la dificultad para encontrarlos si no se detectan por el compilador.
Referente a las ventajas, algunas de las cuales se comentaron en el Capítulo 1,
apartado 1.3.1, se puntualizan en los subsecuentes renglones terminando con la
descripción de las desventajas que lo llevaron a su desuso.
Las ventajas que posee DES, son aquellas mismas que en sus tiempos lo
hicieron estar a la cabeza de la criptografía, es decir, la facilidad que posee para
su implementación hardware proporcionada por la sencillez de las operaciones
que utiliza en su cifrado y descifrado. Operaciones como las permutaciones, que
se pueden conseguir simplemente cambiando el orden de las pistas; el uso de las
XORs, las cuales disponen de circuitos integrados que ejecutan dicha función; o
el recurrido indexado de tablas, que puede conseguirse mediante ROM's.
Esta cualidad junto con su uso de eficiencia en aplicaciones en las que la latencia
es un factor importante, así como la robustez de su sistema que hacen que la
seguridad no dependa del conocimiento del algoritmo si no de clave, terminaron
por llevarlo a la base en la seguridad de algunos gobiernos.
Sin embargo, cuenta con grandes desventajas. Entre ellas la existencia de
claves débiles (Tabla 2.10). Pues debido al modo en el que se generan las
subclaves para las diferentes rondas, existen una serie de claves que no son
aptas para ser utilizadas. Las primeras de estas claves son conocidas como
claves débiles. La debilidad de estas claves es que todos los bits de cada una de
las dos mitades que entran en los registros de rotación son todo unos o todo
ceros. Entonces, por mucho que se roten estas palabras de bits, siempre se
obtendrá la misma subclave.

Claves Débiles

Subclave

101010101010101

0000000 0000000

1F1F1F1F0E0E0E0E

0000000 FFFFFFF

E0E0E0E0F1F1F1F1

FFFFFFF 0000000

FEFEFEFEFEFEFEFE FFFFFFF FFFFFFF
Tabla 2.10: Mismas subclaves para cada Clave Débil

´
También es posible encontrar pares de claves de tal manera que el
criptograma generado por una de las claves del par puede ser descifrado por la
otra clave. O lo que es lo mismo, las dos claves del par generan el mismo
criptograma a partir del mismo texto en claro. Esto se debe a que esas claves, en
lugar de generar 16 subclaves distintas, sólo generan dos subclaves, y cada una
es usada ocho veces. A estas claves se le llaman claves semidébiles y existen 12
claves que cumplen esta condición.
Para finalizar, existen otras claves que producen únicamente cuatro
subclaves distintas, que son usadas cuatro veces cada una. Estas son conocidas
como claves posiblemente débiles. De este tipo de claves, existen 48. Pero a
pesar de la existencia de estas 64 claves débiles (4 + 12 + 48), hay que decir que
-54-
Capítulo 2: Algoritmos Criptográficos Desarrollados

son una minúscula porción de las 256 = 72.057.594.037.927.936 claves que
puede utilizar el DES. No obstante con la fuerza de computo de hoy en día el DES
por si solo ya no es seguro, su longitud de clave se ha quedado insuficiente. Es
por este ultimo detalle que desde que se rompió el DES, empezó a caer en
desuso.

Figura 2.4: Cifrado en DES

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

Figura 2.5: Esquema de la función (f) y la generación de las subclaves

-56-
Capítulo 2: Algoritmos Criptográficos Desarrollados

2.3 Triple – DES
2.3.1.- Introducción.
TDES fue desarrollado por IBM, consecuencia directa de su antecesor, el
DES. Básicamente se puede resumir como la triple aplicación del DES. No llega a
ser un cifrado múltiple, porque no son independientes todas las subclases. Este
hecho se basa en que DES tiene la característica matemática de no ser un grupo,
lo que implica que si se cifra el mismo bloque dos veces con dos claves diferentes
se aumenta el tamaño efectivo de la clave.
Conocidos los entresijos del DES, desarrollados en Apartado 2.2, el TDES
no presentará problema alguno, pues todos los algoritmos usados son los
mismos, únicamente se hacen algunas adiciones en el encriptado y el
desencriptado DES, como consecuencia directa de su triple aplicación así como
un cambio pertinente en la gestión de clave que permita la nueva longitud (192
bits = 3*64).

2.3.2.- Cifrado y Descifrado.
La variante más simple de TDES, es la que se ha implementado,
mostrándose únicamente las partes que han cambiado con respecto a DES
(Cuadros de Código 2.10 y 2.11). Para su definición en el cifrado, se tiene la
expresión:
K3
K2
K1
c ≡ E DES ( E DES ( E DES ( M )))

(2.7)

Para el descifrado el proceso es el mismo, solo que el orden al colocar las
claves es el inverso. Véase la Figura 2.6, para ambos.

for(int vuelta=0;vuelta<3;vuelta++){//vamos cogiendo parte de la claveT y coligándola
switch(vuelta){
case 0: for(i=0;i<64;i++) clave[i]=claveT[i];
break;
case 1: for(i=64;i<128;i++) clave[i-64]=claveT[i];
break;
case 2: for(i=128;i<192;i++) clave[i-128]=claveT[i];
break;
}
Cuadro de Código 2.10: Adición al principio del cifrado DES para conformar TDES

Como se puede observar en el Cuadro 2.10 ha sido necesaria la
declaración de una nuevo array denominado “claveT[i]”. Este contiene la clave
original y con su ayuda se sustrae lo que seria la clave inicial en DES, para luego
continuar con el proceso según se explico en el Apartado 2.2.
-57-
Aplicación Software para el Desarrollo de Tareas Criptográficas
mensajeIni.clear();//Borramos para encriptar ahora el texto encriptado
for(int i=0;i<mc;i++){
mensajeIni.append(QChar(encriptado[i]));//ahora el mensaje es este
if(vuelta==2)
encriptadoList.insert(i,QString::number(encriptado[i]));//copiamos mi encriptado
}
Cuadro de Código 2.11: Adición al final del cifrado DES para conformar TDES

Con Cuadro de Código 2.11, se hace referencia a la adición necesaria al
final del proceso, pues con cada vuelta en TDES, habrá que ir adjuntando el
cifrado y limpiando la variable usada. El resultado de la transformación del
mensaje no se devolverá hasta no haberlo cifrado tres veces consecutivas con
claves diferentes.
Una última nota acerca del Cuadro de Código 2.11, es el hecho de que
esta implementación posibilita la supresión de huecos de desplazamiento que
surgían al pasar a cadena de carácter los bloques de 64 bits (problema
comentado en el Apartado de las Fases de Trabajo).

2.3.3.- Conclusiones.
Las conclusiones tras el desarrollo y estudio de TDES, demuestran que
como método criptográfico a implementar es muy sencillo partiendo de la
reutilización de su antecesor, el DES. Y si este funciona perfectamente, también
lo hará su triple aplicación. Referente a las ventajas, algunas de las cuales se
comentaron en el Capítulo 1, Apartado 1.3.4, se puntualizan en los subsecuentes
renglones terminando con la descripción de las desventajas que lo están llevando
poco a poco a su desuso.
Cuando se descubrió que una clave de 56 bits no era suficiente para evitar
un ataque de fuerza bruta, TDES fue elegido como forma de agrandar el largo de
la clave sin necesidad de cambiar de algoritmo de cifrado. Este método de cifrado
es inmune al ataque por encuentro a medio camino, doblando la longitud efectiva
de la clave, pero en cambio es preciso triplicar el número de operaciones de
cifrado, haciendo este método muchísimo más seguro que el DES. Sin embargo
está desapareciendo lentamente, siendo reemplazado por el algoritmo AES
(Apéndice C, Apartado 2), pese a que la mayoría de las tarjeta de crédito y otros
medios de pago electrónico tienen como estándar el algoritmo Triple DES
(anteriormente usaban el DES). Por el diseño de DES y por lo tanto también el de
TDES, estos sistemas son lentos, dentro de los criptosistemas asimétricos y si se
compara con AES, este último puede llegar a ser hasta 6 veces más rápido y a
día de hoy aun no se encontró ninguna vulnerabilidad.

-58-
Capítulo 2: Algoritmos Criptográficos Desarrollados

Figura 2.6: Esquema del algoritmo Triple DES

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

2.4 RSA Digital
2.4.1. Introducción.
Habiéndose explicado el sistema RSA, DES y TDES, puede suscitar que
sea obligatorio escoger una de las dos alternativa, simétrica o asimétrica,
reemplazando una por otra según el caso que más convenga al usuario. Pero
nada más desencaminado, pues gracias a la implementación de la posibilidad de
elegir RSAD, se permite el uso conjunto de ambos, lo que los complementa
solventando sus mayores deficiencias. El DES proporcionará cifrado para
encriptado masivo de datos mientras que el RSA creará un medio seguro de
comunicaciones.
El RSA agrega dos funciones importantes que no proporciona el sistema
DES: el intercambio seguro de claves sin un previo intercambio de claves
secretas y la firma digital que verifica que el transmisor dice ser quien es. Para
encriptar mensajes, se utiliza RSA y DES en combinación según se pasa a
explicar a continuación.
En primer lugar se encripta el mensaje con una clave DES elegida por el
transmisor. Antes de enviarlo por un medio poco seguro, se encripta la clave DES
por medio del RSA. Para finalizar, se envían juntos, el mensaje DES encriptado y
la clave DES encriptada a través del RSA.
Este protocolo se conoce como RSA Digital y en CriptoYenet a parte de la
implementación con DES se ha ofrecido la posibilidad de elegir también TDES.
Se podría preguntar el motivo por el cual no se utiliza el sistema RSA para
encriptar el mensaje directamente y así evitar el uso del sistema DES. Aunque
podría aplicarse a mensajes cortos, el DES (u otro sistema de encriptado) es
preferible en el caso de un mensaje largo ya que es mucho más veloz que el
RSA.
En algunas situaciones, RSA no es necesario y basta con DES. Esto
incluye a los entornos con multiusuarios donde es posible intercambiar claves
DES en forma segura, por ejemplo, si ambas partes se reúnen en privado. El
sistema RSA es poco necesario en un entorno con un solo usuario, por ejemplo,
si se desea mantener encriptados los archivos personales, solo se necesita el
sistema DES. El RSA y la criptografía con clave pública, en general, se aplican
mejor en entornos con multiusuarios. Cualquier sistema que utilice firmas digitales
necesita del RSA o de algún otro sistema con clave pública.
Es verdad que se ha comentado que el DES no es seguro, pero también
depende de la reutilización de claves que se haga y de las necesidades del
usuario. Es decir, un ataque no es algo inmediato y si a esto se añade el
desconocimiento del algoritmo y del uso que hace de este un particular, la
seguridad es la adecuada (aunque no infranqueable). Una opción recomendada y
probablemente la mejor que deba existir y que se menciona entre las posibles
líneas futuras de CriptoYenet (Capítulo 4) seria el uso de AES (irrompible hasta la
fecha y 6 veces más rápido que DES) junto con RSA.

-60-
Capítulo 2: Algoritmos Criptográficos Desarrollados

2.4.2. Cifrado y Descifrado.
Para el cifrado y el descifrado la utilización de RSA Digital como protocolo
para utilizar en la práctica esta muy extendido, refiriéndose al paquete formado
por la clave y el mensaje como “sobre digital RSA. Aunque ya se ha comentado el
protocolo, a continuación se reitera su explicación de manera detallada para el
uso de dos usuarios (A y B) identificando las claves. El contexto es el siguiente:
El usuario A (transmisor) desea enviar un mensaje encriptado al usuario B
(receptor). Para ello elige una clave privada al azar (clave en DES) con la que
cifrar el mensaje. Dicha clave es encriptada con la clave pública de B (exponente
“e” en RSA), la cual esta presente en una red pública. El mensaje encriptado
mediante el sistema DES y la clave DES encriptada mediante el sistema RSA,
forman el sobre digital RSA y se envían al usuario B. Una vez recibido el sobre
digital, B desencripta la clave DES con su clave privada (exponente “d” en RSA) y
luego utiliza esa clave DES para desencriptar el mensaje.
Este proceso ha sido implementado dentro de la clase “micriptosistema”
(véase Cuadro de Código 1.7), encaminando tal y como se acaba de detallar el
uso de las clases de los criptosistemas implementados que utiliza a excepción de
cifrar el mensaje primero, cosa que se deja para el final anteponiendo el
encriptado asimétrico de la clave simétrica. Este cambio, sin consecuencias en el
protocolo, se realizó para que confluyera con el resto de procesos en el que
únicamente al final se muestra el resultado de la operación criptográfica.

2.4.3. Firmado Digital.
Aunque no es propósito de CriptoYenet, merece la pena comentar el uso
de RSA como firma digital, pues como ya se ha comentado en varias ocasiones
este tipo de uso esta muy extendido y a decir verdad, aunque no este
implementado en si, el firmado digital esta presentado con el sobre RSA Digital,
pues solo el usuario B se identifica con la clave privada “d” de B. Para entender
mejor esto véase el siguiente ejemplo en el que el usuario A desea enviar un
mensaje firmado al usuario B.
En primer lugar el usuario A hace un resumen del mensaje27 que usará
como firma y lo encripta con su clave privada (exponente “d”), formando la firma
digital que enviará junto con el mensaje al usuario B. Este recibe la firma digital y
la desencripta con la clave pública de A (exponente “e”) luego hace un resumen
del mensaje con la misma función utilizada por A y lo compara con el descifrado.
Si son iguales, la firma queda verificada y se puede comprobar que el mensaje
proviene de A. Si no son iguales el mensaje no fue enviado por A, es falso.
Se debe tener en cuenta que para la autenticación o firma digital, los roles
27

Los resúmenes del mensaje que se hacen para utilización como huella digital son realizados por lo que se
conoce como funciones de “hash”. Se debe aclarar que no es probable que alguien encuentre un mensaje
cuyo "hash" arroje un valor predeterminado o dos mensajes cuyos "hash" arrojen el mismo valor. Si alguna
de estas alternativas fuera posible, un intruso podría adjuntar un mensaje falso a la firma de A. Las funciones
de "hash" como MD4 y MD5 se han diseñado específicamente para demostrar que encontrar un número
duplicado es casi imposible y se las considera apropiadas para utilizarlas en criptografía.

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

de las claves pública y privada son los opuestos que en el encriptado, donde la
clave pública se utiliza para encriptar y la privada para desencriptar. En la
práctica, el exponente público es mucho menor que el exponente privado. Esto
significa que la verificación de una firma se efectúa más rápidamente que la firma
misma. Es mejor así, ya que un mensaje o documento será firmado por un
individuo una vez, en cambio, la firma será verificada varias veces.
Para aumentar la fiabilidad, la firma digital puede estar acompañada por
uno o más certificados28. Su propósito es evitar que una persona se haga pasar
por otra utilizando una clave pública fraudulentamente registrada por ésta en
nombre de otro. Si se incluye un certificado, el receptor del mensaje (o un tercero)
puede comprobar la autenticidad de la clave pública del mensaje, presuponiendo
que la clave pública es confiable.
En lo que se refiere a la detección de alteraciones y errores. Una firma
digital RSA es superior a una firma manuscrita ya que atestigua el contenido del
mensaje y, al mismo tiempo, la identidad del firmante. Siempre que se utilice la
función segura de "hash", no hay posibilidades de quitarle la firma a un
documento y adjuntársela a otro o de alterar el mensaje firmado.
El más mínimo cambio en un documento firmado hará fracasar el proceso
de verificación de la firma digital. El sistema de autenticación RSA permite
verificar la integridad de un documento firmado. Por supuesto, si la verificación de
la firma falla, no quedará claro si hubo un intento de fraguarla o si se trató de un
mero error en la transmisión de la información.

2.4.3. Conclusiones.
Las conclusiones tras el desarrollo y estudio de RSAD, demuestran que como
protocolo criptográfico a implementar solo consta de algoritmos para el correcto
encaminamiento y uso de las clases de los criptositemas RSA, DES y TDES,
resultando sencilla su programación. Referente a las ventajas, algunas de las
cuales se comentado repetidamente a lo largo de los capítulos anteriores, se
resumen en los siguientes renglones terminando con la descripción de las
desventajas que lo están llevando poco a poco a su desuso.
Las ventajas que posee RSAD son debidas al uso conjunto de RSA y DES,
que solventa sus inconvenientes por separado, es decir, se evita por completo el
problema del intercambio de claves en DES proporcionando un canal seguro para
la clave con RSA.
Una vez obtenida la clave en el receptor se produce una comunicación
segura y privada mediante DES que resulta más rápida que si la hiciéramos
directamente con RSA. También utilizando solo RSA aparte de ser el proceso
más lento, las claves deberían ser de mayor tamaño que en DES y los mensajes
cifrados ocuparían más espacio que los mensajes en claro.
Antes se comentaba como posible inconveniente que el DES se había roto
(concretamente cuando lo hicieron 1999 tardaron dos días) mediante clusters
28

Un certificado es un documento firmado que atestigua la identidad del firmante y su clave pública.

-62-
Capítulo 2: Algoritmos Criptográficos Desarrollados

esto quiere decir que en una comunicación real mediante ordenadores
convencionales no supondría ningún problema de seguridad y más aún cuando la
clave se renueva por mensaje.
Para finalizar decir que las famosas topologías usadas en SSL (Secure
Sockets Layer) y PGP (Pretty Good Privacy) para proporcionar comunicaciones
seguras en Internet hacen lo mismo, aprovechan las ventajas de combinar los
algoritmos simétricos y asimétricos.

2.5 Gestión de Claves de los Algoritmos Desarrollados.
2.5.1.- Introducción.
Tras haber explicado como se han implementado los algoritmos, ya solo
queda referirse a la gestión de claves (Figura 1.8, Parte inferior del Nivel 2), de la
que se pretende mostrar y explicar las partes del código más relevantes.
Existen básicamente tres gestiones, una para el algoritmo asimétrico, otra
para los simétricos y la del protocolo. Si se comparan a nivel de programación,
RSA resulto ser más fácil de implementar como método que DES, sin embargo su
gestión para las claves es más compleja. Y al contrario, el tiempo empleado para
el desarrollo de DES tuvo su recompensa con una gestión de claves casi
inmediata.

2.5.2.- Gestión de claves en RSA.
La gestión de claves en RSA configurada por diálogos en los que las claves
se pasan por señales (Cuadro de Código 2.12) y de la cual ya se comentó su
generación, es la más compleja de todas, reflejándose en las distintas
posibilidades de enrutamiento disponibles en la Figura 1.9.
Tal y como se puede apreciar en el Cuadro de Código 2.12, el cual muestra
la parte del diálogo únicamente para el encriptado. Se crea el diálogo del Nivel 2
(Figura 1.9 y Figura 1.8 en la parte izquierda) que proporciona el Nivel 3 para las
entradas de las claves en RSA. Estas señales encargadas de proporcionar las
claves son: “generadas(mpz_class, mpz_class)”, que crea paso a paso a partir de
números primos las claves; “introducidas(mpz_class, mpz_class)”, que reciben
por entrada del teclado las claves que ha decidido el usuario;
“exportadas(mpz_class, mpz_class)”, que usa la carga de un archivo de claves; y
por último está la señal declarada como “usadasSesion (mpz_class, mpz_class)”,
que proporciona las claves que se han seleccionado de una lista de las que se
han ido utilizando desde el inicio de la ejecución de la aplicación. Todas y cada
una se conectan con el Cuadro de Código 2.13 (para este caso protocoloRSAD =
falso, pues estamos en RSA). A su vez el uso de cualquiera de estas activa una
señal que se encarga de ir registrándolas para su posterior almacenamiento en
archivo.
Para el caso del descifrado el cual es idéntico, exceptuando el paso de la
-63-
Aplicación Software para el Desarrollo de Tareas Criptográficas

clave privada, es necesario activarlo, ya que por defecto encripta. Con el
desencriptado se hace una nueva conexión para el Cuadro de Código 2.14. Todas
y cada una de estas señales a su vez requieren de otros diálogos (se continua
bajando de nivel) los cuales permiten el seleccionamiento correcto de la clave o la
derivación en más diálogos contenidos, caso del descifrado en el que se llega al
Nivel 5.

void MiCriptosistema::crearDiálogoRSA(){
rsa= new MiRsa;
listaCPsRSA= new QStringList;
//Esta variable me permite encriptar/desesencriptar la clave privada Simétrica en vez del texto
protocoloRSAD=false;//por defecto tenemos desactivado el protocolo RSA Digital,
//Diálogo Encriptar
dEncriptarRSA= new MiGeneCargOSesiRSA;//diálogo para generar, cargar o usar sesión
dEncriptarRSA->ponerNombre(tr("Encriptando con RSA - Elija opción para claves:"));
dEncriptarRSA->setBoolDesencriptar(false);//ponemos modo encriptar (modo por defecto)
//CPs
connect(dEncriptarRSA, SIGNAL(generadas(mpz_class, mpz_class)), this,
SLOT(ponerClavesPúblicasRSA(mpz_class, mpz_class)));
connect(dEncriptarRSA, SIGNAL(introducidas(mpz_class, mpz_class)), this,
SLOT(ponerClavesPúblicasRSA(mpz_class, mpz_class)));
connect(dEncriptarRSA, SIGNAL(exportadas(mpz_class, mpz_class)), this,
SLOT(ponerClavesPúblicasRSA(mpz_class, mpz_class)));
connect(dEncriptarRSA, SIGNAL(usadasSesion(mpz_class, mpz_class)), this,
SLOT(ponerClavesPúblicasRSA(mpz_class, mpz_class)));

connect(dEncriptarRSA, SIGNAL(dameCPsLista()), this,
SLOT(darListaClavesPúblicasRSA()));
connect(this, SIGNAL(tomaCPsListaRSA(QStringList*)), dEncriptarRSA,
SIGNAL(tomaCPsLista(QStringList*)));
//Para abandonar todo el proceso
connect(dEncriptarRSA, SIGNAL(abandona()), this, SLOT(abandonar()));
Cuadro de Código 2.12: Diálogo de Encriptado para la Gestión de Claves en RSA

Se a de aclarar que todos los registros realizados son únicamente para el
par público de claves, así como el almacenamiento en un archivo para su
posterior colocación en una red pública (parte fundamental del proceso para la
comunicación). No se registra, ni almacena la clave privada por cuestiones de
seguridad de acceso. En principio puede parecer lógico, pero muchos programas
almacenan estas en lugares y de modos concretos pudiendo ser encontradas por
los que conocen sus entresijos, y aunque esta se protegiese siempre tendría que
existir al final en algún lugar una clave privada en claro (por ejemplo, el caso de
RSA Digital), es por todo esto que se ha dejado el almacenamiento de la clave
privada a decisión libre del usuario.
-64-
Capítulo 2: Algoritmos Criptográficos Desarrollados

void MiCriptosistema::ponerClavesPúblicasRSA(mpz_class n, mpz_class e){
QString clavesPúblicasRSA;
/*Codigo referente al formato a seguir en el archivo elegido para clavesPúblicasRSA*/
listaCPsRSA->append(clavesPúblicasRSA);
//Colocamos los valores de las claves públicas en RSA
rsa->n=n;
rsa->e=e;
if(encriptar){//ya tenemos n y e podemos encriptar
if(protocoloRSAD){//si estamos trabajando con la cPrivada Simétrica en vez de con el texto
posibleGuardarClaveRSAD();//Encriptamos y guardamos la clave priv simétrica con RSA
mpz_class cPrivi; bool ok;
//Carga con control de errores
ok=(cPrivi.set_str(cPrivadaSimetricaRSAD.toAscii().data(),10)==0)&&(cPrivi>=0);
if(ok){//si no ha habido problemas, es que tenemos la clave desencriptada
switch(algoritmo){//según sea DES o TDES
case 1: des->adaptarDefinidaOk(cPrivi);emit(encripta());
break;

case 2: tDes->adaptarDefinidaOk(cPrivi);emit(encripta());
break;
}//si no es ninguno de los dos no se encriptará
//emit(encripta()) no activa RSA en este caso pq estamos en RSA Digital
}else{/*Código referente a aviso de errores*/}
}else{ emit(encripta());//Emitimos señal correspondiente}
}else{//falta d, emitimos desencripta() cuando pongamos la clavePrivada}
}
Cuadro de Código 2.13: Entrada del par de Claves Públicas de RSA
y gestiones según se haya habilitado RSA Digital.

void MiCriptosistema::ponerClavePrivadaRSA(mpz_class d){
rsa->d= d;//ya tenemos d
if(protocoloRSAD){//si estamos trabajando con la cPrivada Simétrica en vez de con el texto
bool ok;
//Desencriptamos o Encriptamos con RSA la clave Simétrica cifrada
mpz_class cPrivi;
//Carga con control de errores
ok=(cPrivi.set_str(desencriptarRSA(cPrividaSimetricaRSADCifrada).toAscii().data(),10)==0)&
&(cPrivi>=0);
if(ok){//si no ha habido problemas, es que tenemos la clave desencriptada
switch(algoritmo){//según sea DES o TDES
case 1: des->adaptarDefinidaOk(cPrivi);emit(desencripta());
break;
case 2: tDes->adaptarDefinidaOk(cPrivi);emit(desencripta());
break;
}//si no es ninguno de los dos no se desencriptará
//emit(desencripta()) no activa RSA en este caso pq estamos en RSA Digital
}else{/*Código referente a aviso de errores*/}
}else{emit(desencripta());//Emitimos señal correspondiente}

}
Cuadro de Código 2.14: Entrada de la Clave Privada de RSA
y gestiones según se haya habilitado RSA Digital.

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

2.5.3.- Gestión de claves en DES y TDES.
La gestión de la clave en DES y TDES, también esta configurada por
diálogos y señales (Cuadro de Código 2.15), pero a diferencia del resto de
gestiones, esta es la más sencilla, reflejándose en las distintas posibilidades de
enrutamiento disponibles en la Figura 1.9 (véase también Figura 1.8 en su parte
central inferior). No presenta una función de generación, simplemente el usuario
decide si quiere utilizar una clave interna (señal “interna()”) o si desea introducir
una por teclado (“cPrivada(mpz_class)”). La primera señal permitirá la
encriptación de manera inmediata mientras que para el segundo caso será
necesaria comprobaciones y su colocación en el algoritmo.
El código presentado en el Cuadro de Código 2.15 expone únicamente la
parte para el cifrado DES, ya que el descifrado es igual. En TDES la creación es
la misma únicamente cambia el puntero a la clase del criptosistema que en este
caso refiere a TDES en vez de a DES y los diálogos derivados, es decir, aquellos
de donde se obtiene la señal29.

void MiCriptosistema::crearDiálogoDES(){
des= new MiDes;
//Diálogo Encriptar
dEncriptarDES= new MiDefinirOInteriorDES;
dEncriptarDES->ponerNombre(tr("Encriptando con DES - Elija opción para clave:"));
dEncriptarDES->setBoolDesencriptar(false);//ponemos modo encriptar (modo por defecto)
//cPrivada
connect(dEncriptarDES, SIGNAL(interna()), this, SIGNAL(encripta()));
connect(dEncriptarDES, SIGNAL(cPrivada(mpz_class)), this,
SLOT(ponerClavePrivadaDES(mpz_class)));
//Para abandonar todo el proceso
connect(dEncriptarDES, SIGNAL(abandona()), this, SLOT(abandonar()));
Cuadro de Código 2.15: Diálogo de Encriptado para la Gestión de la Clave en DES.

La parte a la que se conecta “cPrivada(mpz_class)”, es decir,
ponerClavePrivadaDES(mpz_class), solo introduce la clave y emite la señal para
el encriptado tal cual se hace en el Cuadro de Código 2.14 para RSA (el cual se a
dejado por que además de servir para referencias como esta, se le hacen
llamadas para la mayoría de su líneas desde el siguiente apartado, la Gestión en
RSAD).

2.5.4.- Gestión de claves en RSA Digital.
La gestión de claves en RSA Digital, nuevamente esta configurada por
diálogos y señales (Cuadro de Código 2.16), pero en este caso la implementación
29

La notación que hace Qt para conectar señales y métodos (en este caso slots) de distintas clases esta muy
extendida en la programación, de hecho ellos no fueron los pioneros. Lo que se hace es mediante una función
enlazar lo que se desea, lo que con un ejemplo en pseudolenguaje sería:
conectar(del objetoA, la señal abrir, con el método del objetoB, puerta )

-66-
Capítulo 2: Algoritmos Criptográficos Desarrollados

esta dividida en dos partes claramente diferenciadas: una similar a la gestión del
apartado anterior (2.5.3) que permite elegir entre DES y TDES y otra que hace
uso de las gestiones RSA (Apartados 2.5.2). Las distintas posibilidades de
enrutamiento disponibles en RSAD se pueden observar en la Figura 1.9 (véase
también Figura 1.8 parte inferior derecha para la primera parte de la gestión).
Según el Cuadro de Código 2.16 al usuario se le posibilita la capacidad de
elegir entre DES y TDES a la hora de escoger una clave privada para las
comunicaciones (primera parte de la gestión RSAD). En el momento que este
escoge uno de los caminos y se ajusta la clave, se produce una llamada a RSA
en cuyas gestiones de claves la mayor parte del código esta dedicado a la gestión
del protocolo RSAD.

void MiCriptosistema::crearDiálogoRSADigital(){
//Diálogo Encriptar
dEncriptarRSADigital= new MiDESOTDES;
dEncriptarRSADigital->ponerNombre(tr("Encriptando con RSA Digital - Elija algoritmo:"));
dEncriptarRSADigital->setBoolDesencriptar(false);// modo encriptar (modo por defecto)
//cPrivada
connect(dEncriptarRSADigital, SIGNAL(cPrivadaDES(QString)), this,
SLOT(cPrivadaDESRSAD(QString)));
connect(dEncriptarRSADigital, SIGNAL(cPrivadaTDES(QString)), this,
SLOT(cPrivadaTDESRSAD(QString)));
//Para abandonar todo el proceso
connect(dEncriptarRSADigital, SIGNAL(abandona()), this, SLOT(abandonar()));

Cuadro de Código 2.16: Diálogo de Encriptado para la Gestión de la Clave en RSAD
(Primera parte de la gestión).

Para la segunda parte de la gestión intervienen los Cuadros de Código 2.13
de RSA. En este caso con “protocoloRSAD=verdadero” se encargará en primer
lugar de guardar en archivo la clave privada selecciona en la primera parte y
encriptarla con RSA. Luego también se encripta el mensaje con esta misma clave
DES o TDES.
En la parte del desencriptado el proceso es el mismo en la primera parte
de gestión, únicamente que ahora se carga el archivo guardado con la clave
cifrada en vez de escribirlo. Para la segunda parte el cambio es exactamente el
mismo que en RSA al desencriptar, ya que se usa su Cuadro de Código 2.14.
Recapitulando se tiene que en la primera fase de gestión RSAD el
encriptado y el desencriptado son procesos idénticos al igual que ocurría en
DES-TDES pero sin la existencia de la elección de una clave interna y con la
carga desde archivo en vez de introducción por el teclado en el caso del
desencriptado. Para la segunda fase de gestión si existe diferencias al igual que
con RSA, en está ultima gestión se guarda la clave o recupera y se cifra el
mensaje o descifra según se este encriptando o desencriptando RSAD.
-67-
Aplicación Software para el Desarrollo de Tareas Criptográficas

La implementación del protocolo RSAD esta básicamente en su gestión de
claves y enrutamiento, pues se hace valer de las gestiones anteriores y los
criptosistemas desarrollados.

-68-
CAPÍTULO 3
- Descripción de la Aplicación -
Aplicación software para el desarrollo de tareas criptográficas
Proyecto Fin de Carrera

Capítulo 3: Descripción de la Aplicación

CAPÍTULO 3 – Descripción de la Aplicación.
La creación de RSA, DES, TDES y RSAD descrita en el capítulo anterior no
fue una fase aislada sino que estuvo ligada íntegramente al desarrollo de la
interfaz, siendo la parte de gestión de las claves la más determinante para esta.
En este capítulo no se hará alusión alguna al código fuente de la interfaz principal
(clase “miproject”) por tratarse del aspecto y manejo de la aplicación (nivel
superior por encima del criptográfico, véase Figura 1.8) únicamente se deja la
declaración descrita anteriormente sobre esta base en el Cuadro de Código 1.6
para ir constatando con algunas de las figuras presentadas que acompañan a las
descripciones de CriptoYenet.

3.1 Introducción.
Aunque el funcionamiento es muy intuitivo, se pretende explicarlo a través
de las distintas partes que conforman la interfaz con el usuario: la pantalla
principal que se sitúa en el ámbito de la clase “miproject”, el menú algoritmo
criptográfico que se sitúa en el ámbito de la clase “micriptosistema” y los menús
de cada uno de ellos, menú RSA, DES, TDES y RSAD que se sitúan dentro del
ámbito de las clases de gestión de claves y que conectan con las respectivas
clases de los algoritmos criptográficos por medio de la clase “micriptosistema”.

3.2. Pantalla principal.
La pantalla principal es la estructura base que se le presenta al usuario en
el momento de iniciar la aplicación. Consta de los elementos básicos
característicos de la mayoría de programas de escritorio, proporcionando cierto
conocimiento sobre donde pueden estar las opciones necesarias de CriptoYenet,
estos elementos son: la Barra de Menús, la Barra de Herramientas, el Área de
Trabajo y la Barra de Estado (Figura 3.1).
El área de trabajo es una hoja de texto que se encuentra en la parte
central y sobre la que actúan una serie de herramientas y procesos (Figura 3.2).
El usuario puede escribir texto en esta para después realizar copias, pegados,
cortes, cifrados o descifrados de una selección aleatoria30, de palabras (mediante
doble clic), de texto entre saltos de línea (mediante triple clic) o de todo el
documento (mediante la selección disponible en el menú editar). También se
permite exportar texto con o sin formatos desde otros software a CriptoYenet,
habilitando la compatibilidad para visualizarlos el formato en los casos simples de
colores, tipos de letra, subrayados... siendo únicamente en la necesidad de querer
cifrar o descifrar cuando se eliminará este formato, ya que estás características de
la apariencia del texto no se han considerado información relevante del mensaje
como para querer encriptarlas, aunque no queda descartada su implementación
en líneas futuras (véase Capítulo 4).

30

Mediante cursores de teclado o de ratón, acompañados o no de la tecla para adiciones
sucesivas: “Shift”.

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

Figura 3.1: La interfaz principal.

Una vez se haya realizado alguna operación con la aplicación, el usuario
podrá avanzar o retroceder en las ejecuciones según crea conveniente mediante
la implementación de un “Deshacer” y un “Rehacer” a nivel global. También
estarán habilitadas las herramientas para guardar: “Guardar” y “Guardar Como”;
la primera para una vez guardado (con cualquiera de las dos opciones) continuar
guardando en el mismo documento y la segunda opción para guardar en un
documento diferente. Dentro de este conjunto de funciones típicas necesarias se
encuentra “Nuevo” que dejando el documento activo (caso de haber sido
modificado) abre un nuevo documento y “Abrir” que dejando el documento activo
(caso de haber sido modificado) abre un documento existente. Por último dentro
de los accesos de la pantalla principal se encuentran las funciones de “Cerrar” y
“Salir”, la primera cierra el documento actual dejando, caso de haberlos, el resto
de documentos abiertos y la segunda sale de la aplicación cerrando todos los
documentos consigo.
Aparte se han implementado una serie de diálogos para constatar las
intenciones del usuario en el caso de las opciones de “Guardar”, “Guardar Como”,
“Cerrar” y “Salir” que advierten de si se quiere proceder con la continuación del
proceso habilitando los mecanismos necesarios para ello, ejemplos de este tipo
son: “Sobrescribir”, “Salir sin Guardar”, “Salir Guardando”, “Explorar Archivos”,
“Guardar claves usadas”… (véase uno de estos ejemplos en la Figura 3.3).

-72-
Capítulo 3: Descripción de la Aplicación

CIFRAR

Elegir Algoritmo

DESCIFRAR

Ventana
Principal

Figura 3.2: Esquema de la interfaz principal.

Figura 3.3: Esquema de la interfaz principal.

Todas estas opciones comentadas están disponibles a través de la barra
de menús (Figura 3.4) en los menús Archivo31 y Edición32, y carecen de
31

Las opciones del menú Archivo se corresponden con las pintadas con colores calidos en la parte izquierda
de la Figura 3.2.
32
Las opciones del menú Edición se corresponden con las pintadas con colores fríos en la parte inferior de la
Figura 3.2.

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

carácter criptográfico pero son necesarias para las gestiones y el manejo con la
aplicación. Para el carácter criptográfico es necesario acceder a las opciones de
“Encriptar” o “Desencriptar” (dentro del menú Criptosistema) que abren el menú
de algoritmos criptográficos (Apartado 3.3.).

Figura 3.4: Barra de Menús.

La parte de la barra de herramientas (Figura 3.5) constituye el acceso a las
herramientas más usadas consideradas por el programador (con vistas a las
líneas futuras se pretende incorporar esta posibilidad según las más usadas por el
usuario, véase Capítulo 4). Estas herramientas son, por orden de aparición de
izquierda a derecha: “Nuevo”, “Abrir”, “Guardar”, “Cortar”, “Copiar”, “Pegar”,
“Deshacer”, “Rehacer”, “Cifrar” y “Descifrar”.

Figura 3.5: Barra de Herramientas

A la hora realizar los diseños de los dibujos de estas herramientas se
pretendió que fueran lo más representativos posible a las opciones que
representan, a la vez que creativos. Por comentarlos brevemente en orden de
aparición: “Nuevo” se representa mediante una hoja en blanco cogida por una
pinza, “Abrir” es un clasificador abierto lleno de documentos, “Guardar” es un
diskete, “Cortar” unas tijeras, “Copiar” equivale a un documento colocándose
encima de otro, “Pegar” es una barra de pegamento sobre una hoja en blanco,
“Deshacer” una flecha que gira en sentido antihorario, “Rehacer” la misma flecha
pero en sentido horario, “Encriptar” es un documento escrito al que se le ha
echado un candado para encerrarlo dentro de una jaula, “Desencriptar” es su
contrapuesto, es decir, el documento al que se le abre el candado para sacarlo de
la jaula.
El hecho de que en la Figura 3.5, aparezcan varios de ellos en escala de
grises es por que se le imposibilita al usuario la opción de usarlos.
Habiendo explicado las herramientas de la interfaz principal y visto el
esquema de la Figura 3.2, se podría sacar el siguiente estado de la aplicación a
partir de la barra de herramientas de la Figura 3.4. Al estar la herramienta de
“Guardar” habilitada se sabe que el usuario ha utilizado la Hoja de Texto, al no
estar habilitadas las herramientas de “Cortar”, “Copiar”, “Encriptar” y
“Desencriptar” se sabe que el usuario no tiene hecha ninguna selección, sin
embargo ha colocado texto en el portapapeles porque la herramienta de “Pegar”
esta habilitada y ya en última instancia el usuario se encuentra en un estado
intermedio de los procesos realizados ya que puede tanto “Deshacer” como
“Rehacer”.
-74-
Capítulo 3: Descripción de la Aplicación

La parte correspondiente al nombre que toma por defecto cada documento
de CriptoYenet se define como “Sesion” acompañada de un número según la
secuencia de documentos nuevos abiertos, este nombre también es usado para
referenciar el archivo de claves pública en caso de guardarlo (véase el Apartado
3.3.1).
Para terminar comentar que el usuario puede posicionar y redimensionar la
aplicación a su gusto para que en las sucesivas sesiones se mantenga gracias a
que se guardan los parámetros de ventana en el escritorio.

3.3. Menú Algoritmo Criptográfico.
El menú para la elección del algoritmo criptográfico es la estructura que se
le presenta al usuario una vez que haya seleccionado texto y pulsado encripar o
desencriptar (Figura 3.6.), para cuyos casos la interfaz de este menú que aparece
es la misma, únicamente cambia el texto del titulo del menú que guía al usuario a
través de lo que debe hacer. Consta de las posibilidades que presenta
CriptoYenet, es decir, de los algoritmos criptográficos: RSA, DES y TDES; y del
protocolo RSAD, así como de la elección de abandonar el proceso.

Figura 3.6: La interfaz del menú algoritmo.

Para el caso de la Figura 3.6, se pulso encriptar haciendo aparecer justo
debajo el menú algoritmo, cuyo esquema es el mostrado en la Figura 3.7. Esta
concuerda en aspecto con la figura anterior ya que se ha implementado que la
interfaz de menús emergentes represente el diagrama de bloques explicativos de
los esquemas haciendo más sencilla su navegación.
Según se elija uno de los métodos presentes en la Figura 3.7, estos
aparecerán justo de bajo del menú algoritmo (el cual continua visible, Figura 3.6)
doblegando el proceso en una serie de submenús que seguirán guiando al
usuario hasta alcanzar el cometido. Estos menús “Menú RSA”, “Menú DES”,
“Menú TDES” y “Menú RSAD” que se encargan de la generación y gestión de
claves de cada criptosistema se presentan en los siguientes apartados.
-75-
Aplicación Software para el Desarrollo de Tareas Criptográficas

CIFRAR

DESCIFRAR
Elegir Algoritmo

Figura 3.7: Esquema de la interfaz que proporciona los algoritmos criptográficos.

3.3.1. Menú RSA.
El menú RSA es para la elección de generar sus claves, cargarlas o
usarlas desde sesión (Figura 3.8.) presenta el mismo aspecto tanto para el cifrado
como para el descifrado cambiando únicamente la barra de título informativa. El
usuario podrá hacer una de las tres posibles gestiones, volver a tras o abandonar
todo el proceso.

Figura 3.8: La interfaz del menú RSA.

Este menú aparece justo debajo del menú algoritmo, mostrándose como si
fuese la extensión de un árbol, de forma que cuando el usuario llegue al la última
rama se procederá con el encriptado o desencriptado según la elección que se
tomó en la base. Aunque la interfaz al igual que todas las demás es muy intuitiva,
se muestra el esquema de la parte del funcionamiento criptográfico en la Figura
3.9.
Según se elija uno de los métodos presente en la Figura 3.9., estos
aparecerán justo de bajo del menú RSA (el cual continua visible, Figura 3.8.)
doblegando el proceso en una serie de submenús que seguirán guiando al
usuario hasta alcanzar el cometido. Estos menús “Menú Generar”, “Menú Cargar”
y “Menú Sesión” que se encargan de la generación y gestión de claves del
criptosistema RSA se presentan en los siguientes puntos.
-76-
Capítulo 3: Descripción de la Aplicación

!
Figura 3.9: Esquema de la interfaz que proporciona el menú RSA.

• Menú Generar Claves.
El menú generar claves es para la creación de las claves usadas por RSA
a partir de la elección de una par de número primos (Figura 3.9.). Este menú
contiene 5 pasos consecutivos y no se podrá seleccionar el siguiente a menos
que su antecesor haya sido activado, pues dependen de los valores anteriores
(exceptuando el primer caso). También al igual que los menús comentados
presenta el mismo aspecto tanto para el cifrado como para el descifrado. El
usuario podrá deshacer los valores obtenidos, volver al menú anterior, abandonar
todo el proceso o aceptar.

Figura 3.10: La interfaz del menú generar claves de RSA.

Tanto para los cálculos del “Primo p”, “Primo q” y “Clave Pública e”, se le
ofrece al usuario las posibilidades de obtener el número de una lista definida con
ayuda de un margen dinámico (Figura 3.11). Puede que el usuario sepa, si un
número es primo o no cuando este se trate de un valor pequeño, pero para el
caso de RSA resulta complicado. El jugar con valores elevados hace
impracticable la comprobación de la primicidad de un número. Gracias a una
función en donde se sitúa el inicio y la cantidad de primos a buscar, se configura
una lista, el usuario podrá elegir comodamente el número primo deseado (Cuadro
de Código 2.1). Para el caso de la “Clave Pública e”, se presenta de la misma
situación (Figura 3.11 con diferente título), pero su obtención es bien distinta
-77-
Aplicación Software para el Desarrollo de Tareas Criptográficas

(Cuadro de Código 2.4).

Figura 3.11: La interfaz para la elección de un número primo de RSA.

Una vez terminada la selección de cada uno de los parámetros, el botón
“Aceptar” se habilitará permitiendo continuar. Para el caso de cifrado no
aparecerán más menús simplemente se cifra el texto para terminar el proceso. Si
por el contrario lo que se pretendía era descifrar aparece un menú (Figura 3.12)
pidiendo al usuario su clave privada con la que recuperar el mensaje.

Figura 3.12: La interfaz para introducir la clave privada de RSA.

También al igual que en todos los menús, el de la petición del exponente
“D” surge lo más próximo posible a la opción que lo antecede y contiene la
posibilidad de volver a un paso anterior o abandonar el proceso así como un
control de valores incorrectos tal y como se muestra en la Figura 3.16., pero para
su caso.
-78-
Capítulo 3: Descripción de la Aplicación

Para terminar con el la descripción del menú generar claves de RSA, se
resume su funcionamiento mediante el esquema de la Figura 3.13.

!

"

# $

"

!

"

#&$

"

%

"
"

!
%

# $
# $

"

# $

# $

Figura 3.13: Esquema de la interfaz que proporciona el menú generar claves de RSA.

Se puede observar por conjunto de colores, la elección de los números
primos y las claves, siendo decisión del usuario las partes que disponen de listas.

• Menú Cargar Claves.
El menú cargar claves es para la introducción de las claves usadas por
RSA. Este menú (Figura 3.14) permite que el usuario las introduzca a través del
teclado (“Manual”) o bien mediante la carga de un archivo de claves RSA
(“Archivo”). A su vez contiene las opciones de navegación propias de todos los
menús de CriptoYenet.

Figura 3.14: La interfaz del menú cargar claves de RSA.

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

Según el usuario haya pulsado “Manual” o “Archivo” aparecerán los menús
de la Figura 3.15 o Figura 3.17 respectivamente.

Figura 3.15: La interfaz del menú manual de RSA.

Si se pulso el botón “Manual” aparece un menú donde el usuario debe
introducir las claves públicas. Estas no deben ser aleatorias sino que deben haber
sido calculadas según el procedimiento estipulado para ellas por RSA, de lo
contrario aunque se encripte el mensaje, este no podrá ser recuperado. El par de
claves puede ser uno creado a partir del menú “Generar”, o bien proporcionados
por una red para tal cometido, sea cual fuere su procedencia el modulo “N” y el
exponente “E” deben estar relacionados. También existe un control de errores
para evitar valores incorrectos como reales, enteros negativos y caracteres
(Figura 3.16).
Aceptando el usuario obtendrá el mensaje cifrado si se encuentra en esa
opción o por el contrario caso de estar descifrando le aparecerá el menú para
introducir la clave privada (Figura 3.12).

Figura 3.16: Mensaje de error al introducir claves incorrectas.

La otra opción del menú cargar es “Archivo” (Figura 3.17) en el que
haciendo uso de un explorador de archivos a través del botón “Examinar” se debe
buscar un archivo de claves públicas de RSA33 para que lo lea el programa. Una
vez cargado el archivo de claves y no habiéndose producido ningún error (para el
que aparecería un mensaje similar al que antes se comento en la Figura 3.16), se
obtiene debajo del botón “Examinar” una lista con todas las claves disponibles.
Seleccionando la clave que interese se activara el botón “Aceptar” y se podrá
finalizar cifrando, o descifrando mediante la introducción de la clave privada.

33

Este archivo se ha diseñado para que contenga una lista de claves usadas previamente en una sesión de
CriptoYenet. El archivo tiene extensión “txt”, guarda los pares de claves por renglones y anota la fecha de
uso. (En vistas a desarrollos futuros se pretende implementar un propio formato de código, ver Capítulo 4)

-80-
Capítulo 3: Descripción de la Aplicación

Figura 3.17: La interfaz del menú exportar desde archivo de RSA.

El conjunto de diálogos que conlleva la carga de claves en RSA se puede
esquematizar mediante la Figura 3.18, lógicamente para el caso de descifrado
siempre habría que añadir un diálogo más al final, al igual que se dijo con los
anteriores caminos del “Árbol”.

'
(

!
"
'
Figura 3.18: Esquema de la interfaz que proporciona el menú cargar claves de RSA.

• Menú Usar Claves de Sesión.
El menú usar claves de sesión es la última opción de las disponibles dentro
del menú RSA para su gestión de claves. Este menú (Figura 3.19.) permite que el
usuario seleccione de una lista el par de claves públicas. Para la generación de
dicha lista CriptoYenet se encarga de ir almacenando todos los pares de claves
que se han ido usando tanto para el encriptado como para el desencriptado. Esta
opción no está disponible caso de no haberse usado con anterioridad RSA
cargando o generando claves. A su vez también contiene las opciones de
navegación propias de todos los diálogos.
El menú usar claves presentado en la Figura 3.19 dispone de la misma
interfaz que el menú “Archivo” para la carga de claves (Figura 3.17). Esto es
-81-
Aplicación Software para el Desarrollo de Tareas Criptográficas

debido a que ambos se surten del registro interno de claves que almacena
CriptoYenet. Ese registro de claves es accesible en cualquier momento a través
del menú “Usar sesión” pero a parte el programa hace una copia de sesión en un
archivo a supervisión del usuario para su posterior carga con el menú “Archivo”,
pues al cerrarse el programa las claves se borran.

Figura 3.19: La interfaz del menú usar sesión de RSA.

A partir de la opción “Ver Claves” se cargan todas las claves usadas en
una lista para visualizar que se sitúa justo debajo. Seleccionando uno de los pares
se activa el botón aceptar y se puede concluir la operación con el cifrado o
descifrado según sea el caso.
La interfaz de este diálogo que conlleva el uso de las claves de sesión en
RSA, se puede esquematizar mediante la Figura 3.20, teniendo que añadirse al
final, como se ha visto hasta hora, un recuadro más para la clave privada caso de
estar desencriptando.

!

!
"

Figura 3.20: Esquema de la interfaz que proporciona el usar claves de sesión de RSA.

-82-
Capítulo 3: Descripción de la Aplicación

3.3.2. Menú DES y TDES.
El menú utilizado para DES es exactamente el mismo que para TDES
(Figura 3.21), proporcionando la capacidad al usuario de elegir una clave definida
por él mismo (“Definir”) o a través de una clave interna (“Interior”). Este menú
presenta el mismo aspecto tanto para el cifrado como para el descifrado
cambiando únicamente la barra de titulo informativa. El usuario podrá hacer una
de las dos posibles gestiones, volver a tras o abandonar todo el proceso.

Figura 3.21: La interfaz del menú DES y TDES.

Este menú aparece justo debajo del menú algoritmo, mostrándose como si
fuese la extensión de un árbol, de forma que cuando el usuario llegue al la última
rama se procederá con el encriptado o desencriptado según la elección que se
tomó en la base (de forma idéntica al proceso llevado a cabo desde el menú
RSA). Si el usuario seleccionó “Definir” se le presentará un diálogo donde
introducir una clave aleatoriamente a su parecer34 (Figura 3.22), dicha clave debe
cumplir con un requisito en su longitud de bits según sea DES o TDES, ya que de
lo contrario no se dejará cifrar al usuario (Figura 3.23). Este requisito es una
longitud de bits menor a 64 para DES y menor a 192 bits para TDES. El usuario
deberá escribir el valor en decimal al igual que en todas las entradas numéricas
de CriptoYenet

Figura 3.22: La interfaz para introducir la clave en DES y TDES.

Una vez escrita la clave el usuario podrá cifrar o descifrar sin la necesidad
de introducir ningún parámetro adicional, a diferencia de cómo ocurría con RSA
34

Para el caso de RSA no es posible elegir sus claves aleatoriamentes por el usuario por que necesitan estar
relacionadas, lo que si se podría haber hecho es implementar una generación aleatoria que crease las claves n,
e y d a partir de números primos elevados aleatorios (ver Capítulo 4).

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

para el caso del descifrado. DES y TDES utilizan una clave para todo y RSA no.
En caso de haber pulsado “Interior” se cifra o descifra mediante el uso de una
clave interna predefinida para DES o TDES según sea el caso.

Figura 3.23: Mensaje de error al introducir claves con longitud incorrecta en DES y TDES.

El usuario se podrá encontrar al introducir la clave con errores de varios
tipos que podrán solventar gracias a las aclaraciones de los mensajes de error
como los de la Figura 3.16 y Figura 3.23.
Mediante el resumen en forma de esquema presentado en la Figura 3.24
se da por concluida la descripción del menú DES y TDES, la interfaz más sencilla
para la gestión de entre todos los algoritmos.

)
Figura 3.24: Esquema de la interfaz que proporciona el menú DES y TDES.

3.3.3 Menú RSA Digital.
El menú RSAD hereda directamente de los menús anteriores (RSA, y DES
y TDES). Con este al usuario se le ofrece un menú adicional para que elija entre
DES y TDES al principio (Figura 3.25), después según se esté encriptando o
desencriptando así se hará uso de unos diálogos u otros. A parte se han detallado
en las figuras de los diálogos que utiliza RSAD el final del proceso a diferencia de
en los menús anteriores ya que en este caso aclara el desarrollo.
Para el caso concreto del cifrado, el proceso hará uso del menú del
algoritmo simétrico para seguir con el menú RSA tal y como se puede apreciar en
la Figura 3.26. Únicamente a diferencia de en DES y TDES se ha excluido la

-84-
Capítulo 3: Descripción de la Aplicación

posibilidad de usar la clave interna por todo lo demás es igual. Se a de recordar
que RSAD no es un criptosistema sino un protocolo que utiliza los algoritmos
criptográficos anteriores, es por ello que incorpora los menús de dichos
algoritmos.
En el esquema de la Figura 3.26 se detalla el uso de este protocolo para el
encriptado, desde el uso de los menús propios hasta de los que hereda del resto.

Figura 3.25: La interfaz del menú RSAD.

El usuario es guiado en todo momento. Se le informa cuando se está
encriptando la clave simétrica escogida y cuando se encripta el mensaje. Al final
se obtiene un “pack” formado por el archivo generado automáticamente que
contiene la clave simétrica cifrada asimétricamente y otro archivo con el mensaje
cifrado simétricamente que debe guardar el usuario desde CriptoYenet.
En el caso del descifrado RSAD, se parte de los archivos generados con el
cifrado, es decir, una vez elegido el algoritmo simétrico de forma que coincida con
el escogido en el estado anterior del proceso, el programa pedirá la ubicación de
la clave simetría encriptada con RSA para cargarla (Figura 3.28).
Esta carga desde archivo es exactamente igual que la que se hacia para la
lista de de pares de claves públicas en RSA (Figura 3.16) con la diferencia de que
ahora el formato de archivo es distinto. El usuario examinará para cargar la clave
y seleccionarla terminando así con todo el proceso de desencriptado (Figura
3.27).
El usuario es guiado en todo momento. Se le informa cuando se está
desencriptando la clave simétrica escogida y cuando se desencripta el mensaje.
Es necesario disponer del modulo n y el exponente d para recuperar la clave
simétrica.

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

)

*

)

*

+
)

)

Figura 3.26: Esquema de la interfaz para el cifrado que proporciona el menú RSAD.

'

)
(

*
*

)
+

"

)

Figura 3.27: Esquema de la interfaz para el descifrado que proporciona el menú RSAD.

-86-
Capítulo 3: Descripción de la Aplicación

Figura 3.28: La interfaz para introducir la clave simétrica.

-87-
Aplicación software para el desarrollo de tareas criptográficas
CAPÍTULO 4
- Conclusiones - Líneas Futuras y
- Limitaciones -
Aplicación software para el desarrollo de tareas criptográficas
Proyecto Fin de CarreraCapítulo 4: Conclusiones, Líneas Futuras y Limitaciones

CAPÍTULO 4 – Conclusiones, Líneas
Futuras y Limitaciones.
Este último capítulo, arranca con las conclusiones generales presentadas
con CriptoYenet. Conclusiones en base a la realización software, al tratado de la
criptografía a nivel de programación y a las implicaciones de sus algoritmos.
También se abarcan las líneas futuras, explicando las ideas más interesantes que
fueron apareciendo de cara a la realización de nuevas versiones. Para terminar,
se indican las limitaciones del programa en el cumplimiento de sus objetivos.

4.1 Conclusiones.
Toda realización software es “infinita”. Por decirlo de alguna manera. A
medida que el desarrollador va marcando unas pautas dentro de unos objetivos y
avanza, salen multitud de funcionalidades nuevas, mejoras, e infinidad de código
nuevo para “picar”. El software se puede moldear al gusto, no implica costes
directos, no se rompe y tiene la cualidad de la reutilización. Propiedades de las
que carece la realización hardware, pues las maquinas estarán limitadas, por
ejemplo por el máximo de memoria, velocidad, espacio físico de integración….Y
una vez culminados sus recursos, por muchas ideas nuevas que tenga el
desarrollador, estas en su mayoría no serán aplicables.
Así que a priori, el software parece tener una gran ventaja, pero puede
convertirse en un arma de doble filo, pues se puede desbordar la realización. Por
eso se debe intentar no abarcar más de lo que se pueda, sobre todo con vistas a
unos plazos de entrega del producto. Es necesario ponerse unos límites. Por muy
tentadoras que sean las nuevas y fabulosas ideas, se debe desistir de ellas, o
desistir para una primera versión. Este y no otro es el caso particular de
CriptoYenet, el cual en principio iba a ser una aplicación básica para el cifrado
asimétrico con RSA, y sin embargo a su favor se ha convertido en una
herramienta mucho más poderosa.
La realización de CriptoYenet no solo trajo consigo el aprendizaje
criptográfico y de programación, a parte abrió las puertas al mundo de las librerías
libres y al uso de ventajas de Linux dentro de Windows [B.R. 2.7-2.9].
Es interesante destacar las discrepancias descubiertas entre las
implementaciones asimétricas y simétricas desarrolladas. Las primeras, basadas
en el cálculo de primos, exponentes y módulos, resulto ser sencilla de
implementar en su criptosistema, pero complicada en su gestión de claves. Las
segundas, basadas en operaciones lógicas, sustituciones y transposiciones,
resultó ser mucho más extensa de implementar en su criptosistema, pero sencilla
en su gestión de claves. Implicaciones directas de la disponibilidad de claves.
Por su parte, la estructuración y depuración del código, una vez realizada la
versión de CriptoYenet con la incorporación de RSA y DES, facilitó la adaptación
de TDES y RSAD. TDES se baso en DES. RSAD se baso en DES/TDES y RSA.

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

Refiriéndonos al uso de criptosistemas en general. Estos requieren de un
hardware potente y de la realización software adecuada. Siendo este segundo el
mayor problema para el programador, debido a que los tipos de variables
definidas están limitadas. El uso de estos con las funciones criptográficas
correspondientes conlleva la sobrecarga del procesador. Gracias al tratado
matemático por medio de cadenas de caracteres, GMP solventa dicha
sobrecarga, convirtiendo procesos sumamente cuantiosos de calcular, en
resultados inmediatos. La incorporación de GMP tuvo mayores consecuencias
para RSA, al utilizar funciones complejas y claves indefinidamente largas.
Como era de esperar, al principio, el completo analfabetismo de cara a la
realización del proyecto, acortaba las vistas a un horizonte para competir con
otras aplicaciones del mismo carácter como es el caso “a años luz” de PGP. Es
una lastima que solo conforme se llegaba al final de la realización del software se
empezase a alumbrar las ideas más interesantes para desarrollar35. Intentando
que todo el camino recorrido no sea en vano, se pretende que con las siguientes
ideas de desarrollo futuras, se puedan desarrollar nuevas versiones de esta
fabulosa herramienta que es CriptoYenet. De este modo, con la continuación del
trabajo, se pretenden incorporar mayor número de funciones y mejoras que
luzcan de un mayor aporte estético. Todo sin deteriorar la facilidad de uso, pues
es en la facilidad de uso y en la interfaz donde quizás se le pueda ganar mayor
terreno al software existente al respecto.

4.2 Líneas Futuras.
Las líneas a seguir con CriptoYenet de cara al futuro fueron surgiendo a
medida que se iba programando. Algunas de ellas estaban previstas para
próximas versiones y tuvieron su luz en está versión. Caso de la incorporación de
TDES y RSAD, o las mejoras con la incorporación de la librería GMP. El resto de
ideas que surgieron y que se pretenden implementar para CriptoYenet, se
presentan a continuación.
• Incorporaciones de nuevos criptosistemas y protocolos:
Gracias a la depuración y reorganización que se hizo en el código para
incorporar el algoritmo criptográfico TDES y el protocolo RSAD, se posibilitó la
capacidad de incorporar nuevos sistemas de una forma sencilla y sin la necesidad
de reorganizar o cambiar el código existente. Así, haciendo referencia a la Figura
1.8 para incorporar nuevos algoritmos, solo habría que implementar su
funcionamiento y su gestión. Los nuevos sistemas se seleccionaría por medio de
un “switch” y un identificador, que será lo único necesario a añadir para su acople.
Otra gran ventaja es la posibilidad de heredar casi por completo las
gestiones de claves, pues para la mayoría de los casos las gestiones simétricas
serán comunes, y las asimétricas entre si también. Además sería de gran utilidad
poder heredar o reutilizar código de las partes que implementan el funcionamiento
de otros sistemas. Esto para el caso de funciones matemáticas compartidas sería
35

Ideas interesantes, pero fuera del marco de los objetivos del presente proyecto.

-92-
Capítulo 4: Conclusiones, Líneas Futuras y Limitaciones

posible, pero para lo que es el caso de la implementación del criptosistema en si
no daría resultado. El hecho de que los distintos algoritmos dentro de un grupo
compartan algunas estructuras similares, no quiere decir que su desarrollo vaya a
ser inmediato, pero se facilitan las cosas (véase Apéndice C).
Respecto a los protocolos. Una vez implementados todos los algoritmos,
se podrían inventar multitud de ellos o utilizar las combinaciones siempre
acertadas de un asimétrico con un simétrico tal y como se comento en el Capítulo
2. Un ejemplo de esto podría ser el uso de las ventajas de AES, opción
recomendada y probablemente una de las mejores que deba existir (irrompible
hasta la fecha y 6 veces más rápido que DES) junto con RSA. Para este protocolo
se reutilizaría exactamente lo mismo que con RSAD, solo que donde se hace uso
de DES se pone AES, así de simple y rápido.
Para este punto quedaría propuesta la selección de los algoritmos dados en
el Apéndice C, cuyas listas de referencias a su documentación se encuentran al
final del proyecto. También se propone la invención de nuevos criptosistemas y
protocolos.
• Formato de código especifico:
La aplicación realizada, a pesar de tener un formato específico para
obtener los datos, utiliza el formato de archivos de texto sin formato, es decir,
archivos por ejemplo con la extensión “txt”. Y sería deseable disponer de un
formato específico con una extensión propia que codificase con un lenguaje
entendible solo por CriptoYenet. Para entender mejor esto bastaría simplemente
abrir un archivo con un formato por un programa que no soporte dicho formato.
Los resultados serán el permiso de acceso denegado o la lectura de datos
ilegibles.
Con el formato “cpty” quedarían todos los archivos para uso específico o
código cerrado con CriptoYenet, dificultando a su vez las lecturas de otros
softwares.
• Adaptación de formatos de código externo:
La adaptación de formatos de código externo subyace directamente de la
anterior mejora. No es de extrañar, que los software que puedan abrir formatos de
archivos de otros software del mismo tipo sean más apetitosos. Este es el caso de
OpenOffice que entre sus muchas ventajas es capaz de abrir documentos de su
homologo el MS Word (cosa que a la viceversa este no puede). Por lo tanto sería
una ventaja añadida. Estando los usuarios de software criptográfico
supuestamente en la encrucijada futura de elegir entre: PGP para abrir unos tipos
de archivo y CriptoYenet para otros; si CriptoYenet pudiera abrir también los de
PGP, siendo a su vez igual de bueno, el traspaso de los usuarios acostumbrados
a PGP hacia CriptoYenet será más inmediato.

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

Algo bastante más eventual a la adaptación de otros formatos de softwares
criptográficos, sería la posibilidad de abrir documentos de texto de casi cualquier
procesado. Actualmente CriptoYenet puede hacerlo gracias a la adaptabilidad que
ofrece el portapapeles, sin embargo si se abre directamente un archivo, a parte
del texto legible aparecen caracteres ilegibles propios del formato del procesador.
• Cifrado y descifrado de imágenes, sonido y video:
CriptoYenet no puede cifrar y descifrar cualquier tipo de archivo, pues
como hemos comentado antes no soporta todos los formatos. Solo podrá
únicamente con aquellos que usen texto. Lo que se pretende para el futuro es
cargar imágenes, sonidos y videos. Las imagenes (jpg, jpeg, bmp, gif, tiff) se
visualizarán para cifrar o descifrar las partes deseadas. Con el sonido (mp3, wav,
rm, midi) sería similar, pero visualizando su espectro al igual que hacen los
editores. Y por ultimo una extensión al uso de videos (mpg, mpeg, mov, avi, wmv).
Tanto para imágenes, sonido y video se mantendría interfaz, solo cambiaria el
área de visualización y el modo de selección.
Para realizar este cometido sería necesario conocer los formatos de estos
archivos y realizar las lecturas de sus cabeceras adecuadamente para la
representación. Además sería bastante más interesante, aunque solo tendría un
carácter puramente didáctico y entretenido, el hecho de mantener las cabeceras
intactas de forma que el usuario pueda escuchar un sonido tras el cifrado con su
clave o ver su foto cifrada en AES por ejemplo.
• Modo automático:
Desde sus principios el software de este proyecto pretendía cierto cometido
de aplicación didáctica. Por ello y por el hecho de disponer de la elección de
claves, el usuario en todo momento tiene que participar en la ejecución. Con la
utilización de variables aleatorias se pretende automatizar los resultados.
Mediante un solo clic, el programa devolvería la clave privada necesaria y el texto
cifrado.
De todas las líneas futuras, la realización de un modo automático es la más
inmediata de implementar. Creando una función aleatoria que sustituya las
entradas del usuario y se rija por las propiedades numéricas de cada clave según
el algoritmo.
• Barra de herramientas inteligente:
Como se pudo observar en la Figura 3.5, la barra de herramientas constituye el
acceso a las herramientas más usadas consideradas por el programador. Puede
ser necesario con el aumento de funciones vistas para el programa, que cada
usuario use unas herramientas más que otras. Con la implementación de una
barra de herramientas inteligente, se detectaría aquellas funciones más usadas y
se colocarían en la barra en detrimento de las que están en desuso. Con la
integración de este recurso se agilizaría el proceso para usuarios acostumbrados
a la interfaz.
-94-
Capítulo 4: Conclusiones, Líneas Futuras y Limitaciones

4.3 Limitaciones.
El software desarrollado para el cifrado y descifrado de las partes deseadas
de un texto cuenta con una serie de limitaciones. Estas en su mayoría debidas a
su uso inapropiado de claves infinitamente largas con documentos de texto
ingentes. Tras innumerables pruebas con los tiempos de procesos se
establecieron dos limitaciones para evitar demoras.
Una restricción en la lista de primos que imposibilita al usuario la
generación de una lista indefinidamente larga. Para ello se definieron los límites
de lista entre 0 y 100 (cantidad de primos a buscar). Esto no disminuye los
permisos del usuario, sino que facilita su elección en el rango deseado (el usuario
podrá en todo momento establecer el inicio de búsqueda).
La otra restricción es debida al uso de texto con longitudes demasiado
largas como para ser soportadas por el SO y la CPU. Estas cantidades de
caracteres se han definido para que no sean superiores a las 100000 unidades.
Sobre este límite se ha comprobado (en un Pentium IV con 3GHz y 1 GB) de
RAM, que el hecho de mover semejantes cantidades de texto puede ralentizar
demasiado los procesos, llegando incluso a bloquearse con cantidades bastante
mayores. Este límite en 100000 se aplica tanto al cifrado como al descifrado, pero
surgió con el cifrado pues este aumentaba el tamaño del mensaje de manera
considerable. Para DES y TDES influirá en el alcance de esta restricción
únicamente el tamaño del mensaje, pues su cifrado hace uso de una clave de
longitud fija. Mientras que para RSA influirá tanto el mensaje como la clave
(longitud variable).

-95-
Aplicación software para el desarrollo de tareas criptográficas
APÉNDICE A
- Manual de Usuario -
Aplicación software para el desarrollo de tareas criptográficas
Proyecto Fin de Carrera

Apéndice A: Manual de Usuario

APÉNDICE A – Manual de Usuario.
El manual de usuario pretende mostrar los pasos a seguir para el uso de
las operaciones criptográficas de manera visual y sencilla. Presenta todas las
posibilidades así como el comportamiento a llevar a cabo en caso de errores de
usuario. Se recomienda previamente la lectura y comprensión del Capítulo 3.

A.1.- Pasos comunes para todos los algoritmos.
La utilización de cualquiera de los algoritmos de CriptoYenet presenta una
serie de pasos en común al principio de su ejecución. Todos y cada unos de estos
pasos aunque puedan parecer muy simples se detallan a continuación.
Paso 1. Abrir CriptoYenet (Figura A.1)

Figura A.1: Abrir CriptoYenet.

Paso 2. Obtener el mensaje de texto a cifrar o descifrar. Para ello existen varias
posibilidades: Escribir texto (Figura A.2), abrir un documento CriptoYenet (Figura
A.3. y A.4), abrir un documento de texto en CriptoYenet o pegar texto desde otra
aplicación.

Figura A.2: Escribir texto en CriptoYenet.

Los archivos usados por CriptoYenet suelen tener el nombre “Sesión”
acompañados por una secuencia numérica, pero de haber sido cambiado su
nombre podría ser cualquiera archivo de texto con la extensión “txt”, con la única
particularidad de que CriptoYenet no podrá descifrar aquellos archivos que no
estén cifrados en formato CriptoYenet, es decir, listas numéricas separadas por
puntos (Figura A.5). El software podrá realizar su función para cualquier archivo
de texto que desee ser cifrado, incluso aunque se trate de texto exportado de
otras aplicaciones con formatos diversos en cuyo caso CriptoYenet elimina el
-99-
Aplicación Software para el Desarrollo de Tareas Criptográficas

formato y procede a su cifrado. También es posible cifrar varias veces un mensaje
si así se desea.

Figura A.3: Abrir en CriptoYenet.

Todas las opciones de CriptoYenet se pueden acceder a través de su barra
de menú y para aquellas más usadas se puede recurrir a la barra de herramientas
como es el caso de la opción “Abrir” (Figura A.3).

Figura A.4: Abrir un documento CriptoYenet.

-100-
Apéndice A: Manual de Usuario

El archivo que se abra (por ejemplo: “Sesion1” Figura A.4) podrá tener un
aspecto en claro como el de la Figura A.2 o podrá ser un archivo cifrado de
CriptoYenet (Figura A.5).

Figura A.5: Documento cifrado de CriptoYenet abierto.

Paso 3. Seleccionar las partes del mensaje con las que se quieren realizar
operaciones criptográficas.
Partiendo del texto de la Figura A.2, se supone que se quieren cifrar la
palabra “escribiendo”, para ello se hace doble clic sobre la palabra e
inmediatamente después aparecen habilitadas las opciones de cifrado y
descifrado (Figura A.6).

Figura A.6: El texto señalado (esto activa las opciones criptográficas).

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

Paso 4. Cifrar o Descifrar. Para ello se debe de pulsar el icono correspondiente al
cifrado (documento entre rejas) o al descifrado (documento sin rejas) de la Figura
A.6.
Paso 5. Elección del Algoritmo. Del menú que aparece (Figura 3.6) se debe elegir
una de las opciones criptográficas que ofrece CriptoYenet mediante botones con
sus nombres.
Una vez se haya llegado a este punto los caminos se dividen (Apartados
A.2, A.3, y A.4) según el algoritmo seleccionado en el paso 5.

A.2.- Usando RSA.
Los pasos a seguir para encriptar con RSA partiendo del paso 5 del
apartado A.1, se muestran nuevamente tal cual le aparecerán al usuario.
Paso 6. Elección de la gestión de claves RSA. El usuario debe elegir entre
generar las claves a partir de primos (botón con el nombre “Generar”), Cargarlas
manualmente o desde archivo (botón central con el nombre “Cargar”) o usar
claves utilizadas con anterioridad en la sesión actual (botón con el nombre
“Sesión”).
Si se decide por el botón “Generar” (Figura A.7) se deberá seguir un
proceso para la creación de varios parámetros. El usuario deberá ir pulsando el
botón del parámetro a generar y seleccionándolo una lista (Figura 3.11) en caso
de que se posibilite.
Si se opta por “Cargar” (Figura A.8) se deberá elegir entre una carga
manual (botón con el nombre “Manual”) o una carga a través de archivo (botón
“Archivo”).
Para el caso manual (Paso 6a) los valores introducidos deben ser enteros
positivos que hayan sido generados para el modulo y el exponente público, es
decir, esta opción se suele usar si el usuario conoce de antemano un par público,
ya pueda ser generado a través de CriptoYenet (menú “Generar”) o a través de
otra fuente fiable, en cualquier caso en dicha obtención el usuario debe obtener la
clave privada con par para que este sea útil.
En el caso de carga por archivo (Paso 6b) solo existe la posibilidad de
usar un archivo de claves RSA de CriptoYenet. Una vez en el cargado se debe
elegir una de las claves de la lista.
Si se elije la opción de “Sesión” (Figura A.9), a través del botón de “Ver
Lista” aparecerán todas las claves disponibles de sesión, se a de detener en
cuenta que no podrá ser usada si no se han usado claves RSA desde que se
abrió la aplicación.
Paso 7. Paso final para el cifrado. Pulsar el botón “Aceptar” para cifrar. Si todo ha
salido correctamente tendría que aparecer la palabra “escribiendo” transformada
en una secuencia numérica (Figura A.10).
-102-
Apéndice A: Manual de Usuario

Figura A.7: Generando las Claves con RSA.

Figura A.8: Cargando las Claves con RSA.

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

Figura A.9: Usando Claves de Sesión con RSA.

Figura A.10: Palabra cifrada con RSA.

Paso 8. Paso final para el descifrado. Caso de estar descifrando, el paso anterior
llevaría al usuario hasta otro diálogo más en el cual se debe introducir la clave
privada de RSA. Como ejemplo para está ocasión el origen podría haber sido el
texto cifrado de la Figura A.10 y el final la frase legible del principio (Figura A.6)

A.3.- Usando DES y TDES.
Los pasos a seguir para encriptar o desencriptar con DES o TDES son los
mismos. Partiendo del paso 5 del apartado A.1 se muestran nuevamente tal cual
le aparecerán al usuario (Figura A.11). Se debe remarcar que todo cuanto se dice
para DES es igual que para TDES con la única diferencia de que con TDES se
puede escoger una clave de mayor longitud.
Del paso 5 se pasa a la elección de una clave interna (botón con el nombre
“Interior”) en donde finaliza el proceso, o se pasa a la elección de definir la clave
(botón “Definir”).
Paso 6. Paso final para el cifrado o descifrado caso de haber definido el usuario la
clave.
El mensaje encriptado se mostrará en el mismo formato que con RSA y el resto.

-104-
Apéndice A: Manual de Usuario

Figura A.11: Definiendo clave o usando clave interior con DES.

A.4.- Usando RSA Digital
Los pasos a seguir para encriptar con RSAD son distintos a los pasos para
el desencriptado. Partiendo del paso 5 del apartado A.1 se muestran nuevamente
tal cual le aparecerán al usuario (Figura A.12) en el caso de haber elegido el
encriptado.
Del paso 5 se pasa a la elección de una clave interna para DES o TDES
en la que solo existe la posibilidad de definirla tal cual se hacia con el botón
“Definir” en el Apartado A.3.

Figura A.12: Definiendo clave DES o TDES para RSAD.

Paso 6. Paso final para la elección de la clave simétrica en RSAD, ”Aceptar”.
Paso 7. Encriptación de la clave simétrica de DES o TDES mediante RSA.
-105-
Aplicación Software para el Desarrollo de Tareas Criptográficas

Figura A.13: Aviso de cifrado de la clave privada simétrica.

Los pasos que se deben seguir a partir de aquí solo surtirán efecto en la
clave privada. Estos son los llevados a cabo por RSA así que se debe ir al
apartado A.2 para continuar.
Paso 8. Guardar la clave privada simétrica. Una vez el usuario haya elegido los
parámetros RSA, el programa avisa de que se va proceder a guardar la clave
encriptada. (Figura A.14)

Figura A.14: Aviso para guardar la clave privada simétrica.

Paso 9. Paso final para el cifrado. El usuario deberá pulsar el botón “OK” (Figura
A.15). para que se cifre el mensaje con la clave simétrica. Si el usuario
-106-
Apéndice A: Manual de Usuario

quiere que la comunicación mediante RSAD surta efecto deberá mandar el pack
RSAD al receptor.

Figura A.15: Aviso para la correcta ejecución de RSAD

Los pasos a seguir para el desencriptado con RSAD a nivel externo son
distintos a los pasos del encriptado. Partiendo del paso 5 del apartado A.1 se
muestran nuevamente tal cual le aparecerán al usuario (Figura A.16) en el caso
de haber elegido el cifrar el mensaje.
Del paso 5 se pasa a la elección de una clave interna para DES o TDES en
la que solo existe la posibilidad de definirla tal cual se hacia con el botón “Definir”
en el Apartado A.3.

Figura A.16: Cargando clave privada simétrica cifrada en RSAD.

Paso 6. Paso final para la elección de la clave simétrica cifrada en RSAD
mediante el pulsado del botón “Aceptar”
Paso 7. Desencriptación de la clave simétrica de DES o TDES mediante RSA.
Para ello los pasos que se deben seguir a partir de aquí son los llevados a cabo
por RSA así que se debe ir al apartado A.2 para continuar.
Una vez se haya desencriptado dicha clave se recuperará el mensaje cifrado.

-107-
Aplicación software para el desarrollo de tareas criptográficas
APÉNDICE B
- Conceptos básicos sobre Criptografía -
Aplicación software para el desarrollo de tareas criptográficas
Proyecto Fin de Carrera

Apéndice B: Conceptos Básicos sobre Criptografía

APÉNDICE B – Conceptos básicos sobre
Criptografía. [B.R.1.1]
B.1.- Historia.
Criptografía, suena a números, enrevesado y matemáticas, pero si usted
pregunta hoy en día a la mayoría de persona sobre criptografía, claves, encriptar,
desencriptar datos, seguramente obtenga respuestas del tipo: televisiones de
pago, tarjetas de crédito, seguridad y protección de datos por Internet…Saben de
que se le esta hablando o al menos tienen una ligera idea.
Sin embargo aunque la criptografía gracias a la globalización esta más de
actualidad que nunca, millones de datos y personas en Internet lo corroboran, las
personas desconocen de su historia y la sitúan en el ámbito de las Guerras
Mundiales, desgraciadamente es verdad que en las guerras la Criptografía sufrió
enormes avances y sobre todo en la última, pero nada más erróneo pues es casi
tan antigua como la escritura.
Basándonos en pruebas fehacientes de restos arqueológicos, las
primeras formas para ocultar un mensaje secreto requirieron de pluma y los
análogos de papel, pues la mayoría de la gente no sabia leer, con lo que en si la
escritura en sus orígenes era un proceso criptográfico.
Pero para una criptografía real requerida tenemos que situarnos en La
Grecia Antigua donde aparecieron los dos tipos clásicos principales, los cuales
hemos comentados anteriormente y a partir de los cuales se sustentan el resto.
Se trata de la transposición, que cambia la posición de las letras en un mensaje,
por ejemplo un esquema simple de cambio sería: “por ejemplo” que codificado es
“premoje pol” y de la substitución, que substituye sistemáticamente letras o
grupos de letras por otras letras o grupos de letras: “por ejemplo” que codificado
es “qps dknqmp” Substituimos cada letra por su siguiente en el alfabeto.
Algunos ejemplos sencillos de cifrado fueron:
• La Escitala, usada por los espartanos, hacia el 400 a.C. puede considerarse el
primer sistema de criptografía por transposición. Los militares de la ciudad-estado
griega escribían sus mensajes sobre una tela que envolvía una vara. El mensaje
sólo podía leerse cuando se enrollaba la tela sobre un bastón del mismo grosor,
que poseía el destinatario lícito del mensaje.
• El Código de Cesar (Tabla B.1), usada por Julio Cesar, hacia el 100 a.C. para
comunicarse con sus generales durante las campañas militares, tenía una
substitución de cada letra por la que la seguía en la 3 posición del alfabeto,
apenas como el código Excess - 3 en álgebra boleana.
Por ejemplo, si se quiere enviar el mensaje ATACARALAMANECER, lo
que se escribirá realmente es DWDFDUDÑDODPHFHU.

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

Alfabeto en claro: A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z
Alfabeto cifrado:

D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z A B C
Tabla B.1: El Código de Cesar.

• El famoso número del demonio, el 666, era utilizado en manuscritos cristianos
para referirse al implacable perseguidor de cristianos, el emperador romano
Nerón. (Existen otros ejemplos similares, palabras código anteriores datadas de
los Hebreos)
Más antiguo en si que la modificación del propio mensaje para ocultarlo,
era ocultar el mensaje usando multitud de caminos. Algunos ejemplos sencillos de
ocultar mensajes fueron:
• Ocultar la información tatuada en las cabezas rapadas de los esclavos para una
vez cubiertos de pelo enviarlos a sus destinos (Herodes).
• El uso de alimentos para ocultar mensajes (Cleopatra).
Ejemplos más modernos de ocultar los mensajes son:
• El uso de tinta invisible, de los microdots (micro puntos) y de las filigranas
digitales de encubrir la información.
Con el desarrollo de las ciencias, y más concretamente de las
matemáticas, la criptografía fue avanzando. En la Edad Media comenzó a adquirir
una gran importancia cuando un siervo del Papa Clemente VII escribió el primer
manual sobre el tema de la historia. En 1466 León Battista Alberti ideó el sistema
poli alfabético basado en la rotación de unos rodillos. Un siglo más tarde, Giovan
Battista Belaso inventó la clave criptográfica basada en una palabra o texto que
se transcribía letra a letra sobre el mensaje original...
Pero si un punto ha marcado un antes y un después en la criptografía,
como decíamos antes, ese ha sido la Segunda Guerra Mundial. Ya a principios
del pasado siglo XX se idearon los denominados “traductores mecánicos”,
basados en el concepto ideado en el siglo XV por Alberti de las ruedas
concéntricas, y el sistema comenzó a tornarse sumamente complejo, ya no
bastaba con analizarlo concienzudamente para comprenderlo. Y eso nos llevó a la
Segunda Guerra Mundial, a los años 30 y 40 y a la máquina Enigma. Aunque
mucha gente no lo sepa, la criptografía fue uno de los principales motivos para
que los aliados ganaran la guerra, pues los alemanes creían el código de su
máquina Enigma inviolable, y de hecho sí que era extremadamente complejo.
Pero al igual que antes comentaba que el anhelo humano de esconder secretos
es eterno, mayor es aun su anhelo por desenterrarlos, de hay el progreso y los
avances de la ciencia. Un equipo de criptoanalistas, matemáticos y demás mentes
privilegiadas (entre ellos Alan Turing, uno de los padres de la informática) lograron
en 1942 lo que parecía imposible: romper el cifrado de Enigma. Para ello
diseñaron las llamadas “bombas navales”, aparatos de cálculo mecánicos que se
encargaban de romper el cifrado alemán y entregar todos los secretos a los
aliados.
-112-
Apéndice B: Conceptos Básicos sobre Criptografía

Igualmente, el Purple (versión japonesa de Enigma) fue roto en Midway
por un equipo dirigido por el comandante Joseph J. Rochefort. El hecho de
conocer los secretos, de tener todas las llaves, dio la vuelta a la guerra y cambió
el curso de la historia. También hay que tener en cuenta que la perspicacia,
persuasión… usados por los espías del bando italiano, entre otros muchos
métodos, daban los mismos resultados que las portentosos descifrador.
El nacimiento de la informática y de los criptosistemas informáticos supuso
un cambio radical del concepto de criptografía, y también del criptoanálisis. Los
criptosistemas y los algoritmos aumentaron repentinamente y de forma
descomunal su complejidad. Desde el DES hace ya mucho, el cual es uno de los
bloques desarrollados en este proyecto, hasta los criptosistemas asimétricos
como el RSA, el otro gran bloque, o como los asimétricos de curvas elípticas
actuales todo ha cambiado (CCE).
Gracias a la extensión de la criptografía, al aumento de su demanda por
parte de los ciudadanos y a desarrolladores como Philip Zimmermann, el privilegio
de guardar secretos que estaba exclusivamente en manos de los gobiernos o
poderosos, ya hoy en día, es un derecho de cualquier ciudadano: El derecho a la
libertad de comunicarnos de forma segura. Y es tan solo cuestión de tiempo, que
se imponga a nivel global como uso cotidiano, una navegación real a través de
Internet que nos proporcione seguridad y privacidad.
Por supuesto hay que dar las gracias también a desarrolladores de
criptosistemas informáticos, tales como: Rivest, Shamir, Adleman, Diffie, Hellman,
ElGamal, Rijmen, Daemen, Massey, Miller, Goldwaser... Todos ellos son padres
de lo que hoy se llama criptografía.

B.2.- Criptología.
Criptografía, el arte de ocultar. La palabra tiene su origen en el griego:
kryptos (oculto, escondido) y graphein (escribir). El arte de ocultar un mensaje
mediante signos convencionales es muy antiguo. Y efectivamente siempre ha sido
considerado un arte hasta hace relativamente poco, cuando Claude E. Shannon
publicó en dos años dos documentos que supusieron la fundación de la moderna
Teoría de la Información.
A partir de entonces, y unido al desarrollo de la computación moderna, el
desarrollo de la criptografía alcanzó nuevos horizontes. Antes de entrar en más
detalles, hay que comprender que la criptografía se complementa con otra rama
de estudio, el criptoanálisis, que estudia el camino inverso de la criptografía,
dedicando sus esfuerzos a desentrañar los secretos que la criptografía se
empeña en mantener ocultos. Ambas ramas conforman lo que entendemos como
criptología.

B.3.- Terminología.
La terminología usada en criptografía requiere básicamente de lo que se
denomina mensaje y criptograma.
-113-
Aplicación Software para el Desarrollo de Tareas Criptográficas

• Texto en claro o plain text (mensaje): es la información original, el mensaje, que
se quiere cifrar.
• Texto cifrado o cripher text (criptograma): es la información resultante una vez se
ha cifrado el mensaje.
En el ámbito criptográfico, entendemos por texto en claro cualquier
información que resulta legible y comprensible. Un texto en claro sería cualquier
información antes de ser encriptada o después de ser desencriptada. Se
considera que cualquier información es vulnerable si se encuentra en este estado.
Así mismo, denominamos criptograma a cualquier información que se
encuentre convenientemente cifrada y no resulte legible ni comprensible más que
para el destinatario legítimo de la misma.
El mecanismo de transformar un texto en claro en un criptograma lo
denominamos encriptación o cifrado, y al proceso de recuperación de la
información a partir de un criptograma lo denominamos desencriptación o
descifrado.
Es muy importante no confundir estos términos con codificación o
decodificación, pues codificación es el acto de representar la información de
distintas formas, pero no necesariamente encriptadas. Por ejemplo, un número
decimal puede codificarse como hexadecimal, y no por ello se convierte en un
criptograma. Desgraciadamente pocas personas saben esta clara diferenciación,
como ejemplo los comúnmente llamados “decodificadores de la televisión satélite
de pago”, cuando introduces la “RSA key” lo que estamos haciendo no es
decodificar sino descifrar los canales.

B.4.- Canal de información.
B.2).

En un criptosistema la información sigue un camino siempre fijo (Figura

Figura B.1: Flujo de Información en un canal criptográfico.

El emisor cifra el texto en claro (m) para obtener el criptograma (c), que
viaja por un canal potencialmente peligroso. El receptor descifra el criptograma y
obtiene de nuevo el texto en claro que el emisor le envió. Durante toda la
transmisión, el mensaje es ilegible.
-114-
Apéndice B: Conceptos Básicos sobre Criptografía

B.5.- Criptosistemas.
Los criptosistemas están íntimamente relacionados con las matemáticas,
es por ello que antes de nada, es conveniente definir qué entendemos
“matemáticamente” por criptosistema.
Un criptosistema matemático se define por los siguientes cuatro elementos:
• Un conjunto finito llamado alfabeto, que según unas normas sintácticas y
semánticas, permite emitir un mensaje en claro así como su correspondiente
criptograma.
• Un conjunto finito denominado espacio de claves formado por todas las posibles
claves, tanto de encriptación como de desencriptación, del criptosistema.
• Una familia de aplicaciones del alfabeto en sí mismo que denominamos
transformaciones de cifrado.
• Una familia de aplicaciones del alfabeto en sí mismo que denominamos
transformaciones de descifrado.
A su vez, los criptosistemas también están íntimamente relacionados con la
informática, es por ello que es conveniente definir qué entendemos
“informáticamente” por criptosistema.
Un criptosistema informático se definiría por los siguientes cuatro
elementos:
• Un conjunto finito denominado alfabeto, que permite representar tanto el texto en
claro como el criptograma. A bajo nivel hablaríamos de bits, y a más alto nivel
podríamos hablar de caracteres ASCII o MIME.
• Un conjunto finito denominado espacio de claves. Estaría constituido por la
totalidad de las claves posibles del criptosistema.
• Una familia de transformaciones
transformaciones de cifrado.

aritmético-lógicas

que

denominamos

• Una familia de transformaciones
transformaciones de descifrado.

aritmético-lógicas

que

denominamos

Se trata simplemente de un criptosistema adaptado a las posibilidades y
limitaciones de un ordenador.
El alfabeto o espacio de caracteres suele ser un estándar de
representación de información (típicamente MIME o UNICODE por motivos de
compatibilidad) y a más bajo nivel, por bits. Las transformaciones de cifrado y
descifrado se ciñen a las normas de computación de los ordenadores actuales.
En realidad, a efectos prácticos no existe mucha diferencia entre
criptosistema matemático e informático, pues los matemáticos suelen diseñarse
-115-
Aplicación Software para el Desarrollo de Tareas Criptográficas

pensando en representaciones computacionales (pues solamente los
ordenadores tienen la potencia necesaria para soportar los complejos algoritmos),
y los informáticos se desarrollan siempre con una base matemática.
Suele ocurrir, debido al frenético avance de los computadores que ciertos
criptosistemas puedan ser criptoanalizados por equipos convencionales, lo que
con el tiempo hace que algunos vayan quedando obsoletos y necesiten de nuevas
premisas. Fue el caso del DES descartado por el gobierno de USA, que dejo paso
al Triple-DES, cuyo criptoanálisis necesitaba de mayor computo y el cual es otro
de los algoritmos implementados en este proyecto.

B.6.- Algoritmo criptográfico.
Para definir un algoritmo criptográfico comenzaremos definiendo el
término algoritmo, que se define como un conjunto ordenado y finito de
operaciones que permite hallar la solución de un problema. Esta es la definición
general pero para el caso concreto de la criptografía nos convendría una desde el
punto de vista de la programación, es decir, aquella que lo define como una
descripción precisa de una sucesión de instrucciones que permiten llevar a cabo
un trabajo en un número finito de pasos.
Así pues, un algoritmo debe describir de forma unívoca y sin dar lugar a
interpretaciones, la solución a un problema en un número de pasos concreto. Ya
podemos deducir qué es un algoritmo de encriptación: una descripción unívoca y
concreta de cómo funciona un criptosistema determinado.

B.7.- Clave criptográfica.
El concepto de clave criptográfica surge con el propio concepto de la
criptografía, y es el alma de un algoritmo de encriptación.
Obviamente un algoritmo tiene que poseer la capacidad de ser usado
muchas veces sin que su mecanismo sea idéntico, pues de lo contrario cada
persona debería tener su propio algoritmo de encriptación, y créanme si ya es
difícil implementarlos los conocidos, disponiendo de gran documentación cuan
seria inventarlos. Pues bien, para implementar esta funcionalidad, se usan las
claves. La clave es un dato que interviene de forma activa en la ejecución del
algoritmo y lo personaliza.
Atendiendo únicamente al tipo de clave, podemos distinguir dos tipos de
criptosistemas (véase Apéndice C):
• Sistemas de clave única o criptosistemas simétricos: Son aquellos en los que los
procesos de cifrado y descifrado son llevados a cabo por una única clave.
• Sistemas de clave pública o criptosistemas asimétricos: Son aquellos en los que
los procesos de cifrado y descifrado son llevados a cabo por dos claves distintas y
complementarias.
-116-
Apéndice B: Conceptos Básicos sobre Criptografía

B.8.- Longitud de clave.
Gracias a los ordenadores y los superordenadores (típicamente clusters) es
posible realizar complejos cómputos matemáticos en un espacio de tiempo
relativamente corto. Así pues, el campo del criptoanálisis está íntimamente ligado
a esta potencia de cálculo.
Para que un algoritmo se considere seguro, su criptoanálisis sin la clave
necesaria debe ser computacionalmente imposible de resolver. Consideramos
“imposible” de resolver un sistema cuya vulneración necesite mayores recursos
(económicos o en tiempo) que el beneficio reportado. Por ejemplo, ser
consideraría seguro un criptosistema que requiriera miles de años para ser
descifrado.
Para lograr semejante complejidad, se tratan números o conjuntos de
números enormes. Es obvio que a mayor tamaño de estos números, existe un
mayor número de claves posibles, y la posibilidad de éxito del criptoanálisis es
menor.
Hoy en día este tamaño se denomina longitud de clave, y se mide
típicamente en los bits que ocupa la clave. Así, una clave de un número de 1024
bits sería un número cualquiera desde el 0 hasta el 1,8 * 10^308 (2^1024). Al
representar las longitudes de clave como potencias de dos, es importante darse
cuenta de la relación existente entre las longitudes de clave. Una clave de 1025
bits es el doble de larga que una de 1024 (2^1025 frente a 2^1024). Actualmente
se usan claves que oscilan entre los 512 bits y los 4096 bits de longitud.

B.9.- Base Matemática RSA.
El RSA se basa en lo que en matemáticas se denomina aritmética modular
y en los conceptos de primo, máximo común divisor y primos relativos, lo que
implica el uso decimal. Todos estos conceptos conforman lo necesario para poder
entender este algoritmo asimétrico.

B.9.1.- Introducción a la aritmética modular.
Aunque de entrada la aritmética modular por el nombre pueda asustar,
resulta bien sencillo. Supongamos que nos ponemos a sumar o restar horas, en
un reloj de esfera de 12 horas, nada de digitales. Si son las 8 y le sumamos 6
horas, nos quedan las 2. Es decir, cuando pasamos de 12 empezamos por el 1.
Pues eso es la aritmética modular. En este caso sería módulo 12. Así podemos
decir que (8 + 14) mod 12 = 10 (Figura B.2).
La única diferencia es que en la aritmética modular incluimos el cero.
Entonces en nuestro caso del reloj los números que existirían serían del 0 al 11.
No habría por ejemplo el 12, porque "daría la vuelta" y pasaría a ser cero, o el 13
que pasaría a ser 1. Solo existen esos números. Ahora en módulo 7. Nuestro
-117-
Aplicación Software para el Desarrollo de Tareas Criptográficas

universo de números sería {0,1,2,3,4,5,6}. Si hiciéramos 3*5, en los número reales
sería 15, pero en módulo 7 serían 2 vueltas (7+7) y uno mas. Es decir,3*5mod7=1
Como vemos, en realidad lo que hacemos para calcular el módulo es dividir 15
entre 7 y quedarnos con el resto, que es 1. De esta misma forma, si dividimos 64
entre 7, nos sigue quedando que el resto es 1 (lo único que hemos hecho es
"darle mas vueltas" al reloj), así que podemos decir que 64 = k*7 + 1. K nos da
igual porque es el número de vueltas que le vamos a dar al reloj. De forma
genérica, si un número a (el 64) mod n (el 7) = resto (el 1), su expresión seria la
siguiente:
a = k.n + resto.

(B.1)

Figura B.2: Aritmética modular comparada con las vueltas de un reloj.

B.9.2.- Inversa de un número en aritmética modular.
Para la explicación de la inversa de un número en aritmética modular
[B.R.3.1-3.2] vamos a fijarnos en el mismo ejemplo anterior.
Vemos que en mod 7, 3*5 = 1. Al igual que con los números reales, si dos
números se multiplican y dan 1, es que son inversos (5 * 1/5 = 1). Así podemos
decir que 3 y 5 son inversos en módulo 7. Pues existe una propiedad, para
relacionarla con lo anterior, que dice que un número a tiene inversa módulo n ,
si no existe ningún número (excepto 1) menor que a y menor que n que los
divida de forma exacta. Esto es a lo que se llama primos relativos. Por ejemplo 8 y
5 serían primos relativos, porque no hay ningún número que los divida, aunque 8
no sea primo. Su máximo común divisor es 1. En el caso del módulo 7, se tiene
que todos los números (el cero no cuenta) tienen que tener inversa, porque 7 es
primo absoluto y no va a existir ningún número que lo divida.

B.9.3.- El número φ (phi).
El número φ nos dice la cantidad de números que tienen inversa para un módulo.
En nuestro caso, vemos que en el módulo 7, todo su conjunto de números,
menos el cero, tienen inversa, porque 7 es un número primo y nos lo dice la

-118-
Apéndice B: Conceptos Básicos sobre Criptografía

propiedad anterior. Es decir, hay 6 números (del 1 al 6) que tienen inversa, y si
φ (7) nos dice la cantidad de números que tienen inversa, queda que φ (7) = 6 . De
forma genérica, si n es un número primo, tenemos que φ se puede expresar
como:

φ (n) = n − 1 .

(B.2)

(El menos 1 es porque no contamos con cero).
Por la misma razón, si n está formado por la multiplicación de dos números
primos, es decir, n = pq , entonces podemos expresar φ tal que:

φ (n ) = ( p − 1)(q − 1)

(B.3)

B.9.4.- Números Primos.
Un numero es primo si solo es divisible por si mismo y por uno.

B.9.5.- Máximo Común Divisor.
El máximo común divisor de dos o más números es el mayor divisor posible
de todos ellos. Para el cálculo del máximo común divisor de dos o más números
se descompondrán los números en factores primos y se toman los factores
comunes con su menor exponente.
Por ejemplo, de las factorizaciones de 6936 y 1200,
6936 = 23 · 3 · 172
1200 = 24 · 3 · 52
Tenemos que su m.c.d. es 23 · 3 = 24

B.9.6.- Algoritmos de Euclides.
El Algoritmo de Euclides [B.R.2.15] de entre sus muchas utilidades sirve
para calcular el máximo común divisor de números grandes, puesto que en para
ese caso el método ordinario anterior (B.9.5) no funciona. Para su explicación
(Figura B.3) supongamos que tenemos el mismo ejemplo anterior: a= 6936 y b=
1200, datos a partir de los cuales entraríamos en el bucle que representa dicho
algoritmo.

B.9.7.- Primos Relativos.
Dos números son primos relativos entre si, si cumplen que su máximo
común divisor es uno. (Véase B.9.2)
-119-
Aplicación Software para el Desarrollo de Tareas Criptográficas

MIENTRAS b>0

NO

SI

b
SI
Vuelta
1
2
3
….
15
16

a
5736
4536
3336
….
24
24

b
1200
1200
1200
….
24
0

¿Es a>b?

NO

a=a - b
En a nos queda el

b=b - a

MCD

Figura B.3: Algoritmo de Euclides.

B.10.- Base Matemática DES.
DES se puede resumir como una serie de permutaciones, sustituciones y
XORs que se realizaran a nivel de bits.

B.10.1.- Permutaciones.
Las permutaciones realizadas son expansiones y comprensiones;
adiciones y sustracciones; y desplazamientos de bits. Algunas serán fijas y otras
dependerán de la clave y la ronda en la que nos encontremos.

B.10.2.- Sustituciones.
Las sustituciones se llevan a cabo mediante una serie de cajas llamadas SBox (fijas), en las que indicamos la sustitución mediante una posición de fila y
columna.

B.10.3.- Lógica Booleana.
La lógica booleana es una lógica de conjuntos y nos sirve, principalmente,
para definir formas de intersección entre conjuntos (Tabla B.2)
La operación OR es suma y la operación AND es multiplicación.
La operación XOR (OR exclusiva ” ⊕ ”) realiza la función booleana A!B+A!B

-120-
Apéndice B: Conceptos Básicos sobre Criptografía

A
0
0
1
1

B
0
1
0
1

OR
0
1
1
1

A
0
0
1
1

B
0
1
0
1

AND
0
0
0
1

A NOT
0
1
1
0

A
0
0
1
1

B
0
1
0
1

XOR
0
1
1
0

Tabla B.2: Algebra Booleana.

-121-
Aplicación software para el desarrollo de tareas criptográficas
APÉNDICE C
- Criptosistemas -
Aplicación software para el desarrollo de tareas criptográficas
Proyecto Fin de Carrera

Apéndice C: Criptosistemas

APÉNDICE C - Criptosistemas.
C.1 Clasificación.
Los criptosistemas se pueden clasificar según los tipos de claves que
utilizan (simétrico o asimétricos) y el trato del mensaje que realizan a la hora de
cifrarlo o descifrarlo (bloque o flujo).
Simétricos o Asimétricos (clave privada o clave pública):
Los simétricos son conocidos como sistemas de clave secreta, se utiliza la
misma clave tanto para cifrar como para descifrar, por lo tanto, las distintas partes
involucradas en la comunicación de los datos cifrados (emisor y receptor) deben
compartir el conocimiento de esta clave. Los sistemas asimétricos o sistemas de
clave pública utilizan dos claves, una para cifrar y la otra para descifrar, de tal
manera que el criptograma producido por una de ellas sólo puede ser descifrado
por la otra. Esta división de dos claves permite la existencia de lo que se ha
venido a conocer como firmas digitales. (Figura C.1)

Figura C.1: Simétrico o asimétrico según la clave en el transmisor y en el receptor.

Si k=l → Criptosistema Simétrico
Si k≠l → Criptosistema Asimétrico
Bloque o Flujo:
También podemos dividir los sistemas de cifrado según operen sobre
bloques o sobre “streams” (flujos de bits). Los primeros dividen la información a
cifrar en bloques de un determinado tamaño y aplican una serie de operaciones
sobre ese bloque para producir el criptograma (Figura C.2). Los segundos, cifran
la información bit a bit (Figura C.3).
Ambas clasificaciones pueden superponerse, de forma que mientras que
en los simétricos podremos distinguir entre los que cifran en flujo y los que cifran
en bloque, en los asimétricos el cifrado será siempre en bloques.
En los apartados siguientes se detallarán los algoritmos principales
simétricos y asimétricos junto al tipo de cifrado de bloque o flujo que realizan.
-125-
Aplicación Software para el Desarrollo de Tareas Criptográficas

Figura C.2: Cifrado por bloques.

Figura C.3: Cifrado por flujo.

C.2 Simétricos.
Son los criptosistemas más sencillos. Como comentamos antes se trata de
algoritmos que trabajan con una única clave de doble función (cifrado y
descifrado). Dentro de los sistemas simétricos que exponemos a continuación
tenemos aquellos que trabajan por medio de bloques (por ejemplo 64 bits) y los
cifran bloque a bloque o los de cifrado de flujo, que cifran bit a bit o byte a byte,
algunos algoritmos pueden tener las dos modalidades. También encontraremos
aquellos que usan una longitud de clave fija o los que posibilitan una longitud de
clave variada. Veamos pues los principales algoritmos criptográficos simétricos.

C.2.1.- DES [B.R.1.1 y B.R.1.3-1.7]
Nombre completo:
Data Encryption Standard (1976).
Descripción:
Algoritmo simétrico de cifrado en bloques de 64 bits basado en LUCIFER
(criptosistema interno de IBM).
Fue ideado por IBM y aceptado por el NIST (National Institute of Standars
and Technology) en 1976. Se trata de un algoritmo de 64 bits de clave de los
cuales 56 bits componen la clave de cifrado propiamente dicha, mientras los 8
-126-
Apéndice C: Criptosistemas

restantes son de paridad y se usan para corrección de errores. Su funcionamiento
se basa en permutaciones, sustituciones y XORs.
DES actualmente ya no es estándar criptográfico y fue roto en Enero de
1999 con un sistema de cómputo que analizaba 250.000.000.000 claves por
segundo.
Su principal ventaja es la rapidez de cálculo y la sencillez de su
implementación. Sus principales defectos son la poca longitud de clave que
maneja, unido a la incapacidad de manejar claves de longitud variable; y su
debilidad en un uso continuado de la misma clave, pues si se disponen de
suficientes criptogramas, mediante criptoanálisis diferencial es posible romper la
clave en 2^47 iteraciones.

C.2.2.- Triple – DES. [B.R.1.8-1.9]
Nombre completo:
Triple - Data Encryption Standard (1995)
Descripción:
Dada la capacidad de cómputo actual y la relativa facilidad que supone
romper el algoritmo DES, se desarrolló un sistema de triple aplicación al algoritmo
DES, con tres claves diferentes para aplicar sucesivamente (en realidad se usa
una clave externa dividida para aplicación intermedia dado que DES
matemáticamente no es grupo, y su aplicación repetida ocasionaría un aumento
efectivo de tamaño). Mediante este sistema se obtiene un cifrado de 192 bits (168
efectivos y 24 de paridad) con tres claves que resulta mucho más complejo de
vulnerar.

C.2.3.- AES (Rijndael). [B.R.1.10-1.12]
Nombre completo:
Advanced Encryption Standard (2000)
Descripción:
En 1977 el NIST organizó un concurso a nivel mundial para crear un
sistema que cumpliera los requisitos de seguridad necesarios para convertirse en
estándar a nivel mundial. Este estándar se denomina AES (Advanced Encryption
Standard) y el algoritmo AEA (Advanced Encryption Algorithm).
Muchos expertos presentaron sus propuestas, pero el ganador fue el
conocido como algoritmo Rijndael, creado por los belgas Vincent Rijmen y Joan
Daemen. Se trata de un algoritmo simétrico que puede funcionar mediante cifrado
-127-
Aplicación Software para el Desarrollo de Tareas Criptográficas

en bloques de longitud variable o en flujo y que se sirve de claves de longitud
variable (128, 192 ó 256 bits). Su funcionamiento se basa en sustituciones no
lineales, trasposiciones de filas y mezclas de columnas.

C.2.4.- IDEA [B.R.1.13-1.15]
Nombre completo:
International Data Encryption Algorithm (1990)
Descripción:
IDEA fue creado en 1990 por Xuejia Lai y L. Massey. Se trata de un
algoritmo simétrico de cifrado en bloques de 64 bits. Trabaja con claves de 128
bits de longitud. Su funcionamiento se basa en operaciones sencillas como
multiplicaciones de enteros, sumas y XORs.
Es importante reseñar que IDEA es un algoritmo que si bien es de uso
libre para fines no comerciales, sí que está cubierto por patentes, concretamente:
• USA y Canadá - Patente 5.214.703 - Expira el 25 de Mayo de 2010.
• Europa - Patente 0482154 - Expira el 16 de Mayo de 2011.
• Japón - Patente JP3225440B2 - No hay información de la fecha de expiración.

C.2.5.- RC6 [B.R.1.16-1.19]
Nombre completo:
Rivest Cypher 6 (1998)
Descripción:
RC6 fue uno de los finalistas del concurso AES del NIST. Fue ideado por el
matemático Ron Rivest (autor de muchos y famosos algoritmos criptográficos) en
1998. El algoritmo es propiedad de la empresa RSA Security. RC6 supone la
evolución de los algoritmos RC, RC2, RC4 y RC5. Concretamente, se trata de una
adaptación del sistema RC5 para cumplir los requisitos del concurso AES. Se
trata de un algoritmo simétrico de cifrado de flujo con claves de longitud variable
entre 40 y 2040 bits, siendo por defecto 128.
Su algoritmo se basa en una
mezcla de sumas, restas, multiplicaciones, XORs y rotaciones.

-128-
Apéndice C: Criptosistemas

C.2.6.- CAST – 256 [B.R.1.20-1.21]
Nombre completo:
Carlisle Adams - Stafford Tavares - 256 (1997)
Descripción:
CAST-256 fue desarrollado a partir del algoritmo CAST-128. Se trata de un
algoritmo simétrico de cifrado en bloques de 128 bits que maneja claves de
longitud variable: 128, 160, 192, 224, ó 256 bits. Su funcionamiento es muy
complejo, combinando el sistema de permutación-rotación similar al utilizado por
DES con otros sistemas más complejos, como combinaciones de XOR o uso de ffunciones (de tres formas distintas y excluyentes).

C.2.7.- Twofish [B.R.1.22-1.23]
Nombre completo:
Twofish (1998)
Descripción:
Twofish es un algoritmo simétrico de cifrado en bloques de 64 bits. Supone la
evolución natural de su antecesor, Blowfish, y fue otro de los cinco finalistas del
concurso AES del NIST. El algoritmo es totalmente libre, tanto de patentes como
de copyright. Twofish maneja claves de longitud variable 128, 192 ó 256 bits. Su
funcionamiento se basa en el uso de permutaciones, sustituciones y XORs. Es
muy potente a la par que extremadamente sencillo de implementar y rápido (18
ciclos por byte en una arquitectura Pentium I, más rápido que RC5, IDEA, DES,
Triple DES, Serpent, Square, Cast-128, Feal-32, etc). Estas características le han
llevado a ser incluido en el estándar SSH (Secure Shell).

C.3 Asimétricos.
Se trata de criptosistemas más modernos y complejos que los simétricos, a
la vez que mucho más seguros.
Se fundamentan en la existencia de un par de claves complementarias que
denominamos clave pública y clave privada respectivamente (aunque ambas
pueden actuar como pública o privada, su función la da el usuario mediante su
utilización). Un criptograma generado por una de las claves puede ser descifrado
únicamente por la otra clave, y viceversa.
Cifran en bloque y con longitud de clave variante y a pesar de ser
computacionalmente mucho más complejos, son el estándar hoy en día, usados
-129-
Aplicación Software para el Desarrollo de Tareas Criptográficas

en sistemas que combinan cifrado asimétrico y simétrico (Pretty Good
Privacy y Secure Socket Layer entre ellos).
Estos sistemas duales aúnan las ventajas de ambos sistemas, pues un
cifrado continuado en clave asimétrica requiere mucho esfuerzo computacional, y
un sistema de clave simétrica no es seguro, pues necesita un canal seguro de
traspaso de información para la clave. El cifrado asimétrico proporciona ese canal
seguro de traspaso de información, y el uso de claves únicas en cifrado simétrico
garantiza la seguridad a la vez que se reduce sensiblemente el nivel de recursos
necesarios.
Existen principalmente tres familias de algoritmos asimétricos, según el
principio matemático en el que basan su potencia y seguridad:
• Problema de la factorización entera:
Estos algoritmos basan su seguridad en una debilidad de las máquinas de
cómputo actuales. Para un computador es relativamente trivial el cálculo de
enormes productos o potencias, pero el proceso contrario resulta muy costoso.
Así pues, la potencia de estos algoritmos reside en que no existe un
método eficiente para factorizar números enteros muy grandes.
A esta familia pertenecen RSA (Rivest-Shamir-Adleman) y RW (RabinWilliams) entre otros.
• Problema del logaritmo discreto del grupo multiplicativo de un campo finito:
La potencia de los algoritmos basados en el problema del logaritmo
discreto se basan en que no existe un método eficiente de calcular x a partir de la
expresión y= ax (mod p) donde p es un número primo.
Matemáticamente se trata de un método bastante más complejo, pero
computacionalmente es igual de complicado que el problema de la factorización
entera. A esta familia pertenecen DH (Diffie-Hellman), DSA (Digital Signature
Algorithm), ElGamal y Nyberg-Rueppel entre otros.
• Problema del logaritmo discreto sobre el grupo de puntos racionales de una
curva elíptica sobre un campo finito:
Este grupo es un derivado del problema del logaritmo discreto, solo que en
lugar de estudiarlo en un grupo multiplicativo, lo estudia en curvas elípticas (no
obstante este grupo es conocido también como “método de curvas elípticas”).
Este método es relativamente moderno (surgió en 1986 de la mano de Miller).
Estos algoritmos basan su potencia en que el cálculo de logaritmos sobre
un sistema de curvas elípticas es computacionalmente aún más costoso que su
cálculo sobre cuerpos finitos.
-130-
Apéndice C: Criptosistemas

No hay muchos algoritmos de curvas elípticas definidos, pero no obstante
existen versiones elípticas de los algoritmos DH (Diffie-Hellman) y ElGamal.
Existe un cuarto grupo de criptografía asimétrica, los criptosistemas
probabilísticos, que fundamentan su potencia en el hecho de que un mismo texto
en claro puede dar lugar a un gran número de criptogramas distintos. Estos
sistemas evitan la fuga de información que supone el cifrado asimétrico tradicional
(PKCS) (C = E k (M)), pero no han sido muy estudiados aún, y mucho menos
trasladados a criptosistemas informáticos.
A continuación
criptográficos asimétricos:

vemos

algunos

de

los

principales

algoritmos

C.3.1.- DH/DSS [B.R.1.24-1.28]
Nombre completo:
Diffie - Hellman / Digital Standard Signature (1976 / 1991)
Descripción:
La historia del nacimiento del algoritmo DH/DSS es bastante compleja. En
1976, Dres. W. Diffie y M.E.Hellman publicaron el documento [DIH76] en el que
nació el sistema Diffie-Hellman como algoritmo de intercambio de claves. En
aquella época, Diffie y Hellman creían que su algoritmo no podía constituir un
criptosistema asimétrico completo para cifrado de clave pública. Tuvieron que
pasar muchos años hasta que en 1985 ElGamal publicara [ELG85] y demostrara
que se podía desarrollar un criptosistema asimétrico completo a partir del sistema
Diffie-Hellman, lo que supuso el nacimiento del algoritmo DH.
Pero aún había un problema, pues el sistema de firma ideado por
ElGamal ocasionaba que la firma de un mensaje ocupara el doble que el mensaje
original, lo cual representaba un problema grave de eficiencia.
Este problema fue corregido en 1991, cuando el NIST propuso un
sistema de firma nuevo para el sistema Diffie-Hellman, que denominaron DSS
(Digital Standard Signature). Así, en 1991 nació el algoritmo completo que hoy
conocemos como DH/DSS. DH/DSS es un algoritmo de cifrado asimétrico basado
en el problema del logaritmo discreto del grupo multiplicativo de un campo finito.
Aunque matemáticamente es mucho más complejo con diferencia que el
problema de la factorización entera, se ha demostrado que ambos son
computacionalmente de una complejidad muy similar. Hay que decir, eso sí, que
DH/DSS y los demás algoritmos basados en el problema del logaritmo discreto no
tiene sobre su cabeza la espada de Damocles que supone el algoritmo de Shor
para los criptosistemas basados en el problema de la factorización entera.

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

C.3.2.- RSA [B.R.1.1 y B.R.1.29-1.31]
Nombre completo:
Rivest - Shamir - Adleman (1978)
Descripción:
El algoritmo RSA nació en 1978 de la mano de Ron Rivest, Adi Shamir y
Leonard Adleman [RSA78]. Se trata de un algoritmo de cifrado asimétrico basado
en el problema de la factorización entera, y aunque la descripción de este
algoritmo fue propuesta en 1973 por Clifford Cocks [COCK73], fue secreta hasta
1978 cuando se publicó RSA. Aunque el algoritmo fue patentado, la patente
expiró en el año 2000 y actualmente se trata de un algoritmo libre.

C.3.3.- ELGAMAL [B.R.1.32-1.34]
Nombre completo:
El Gamal (1984)
Descripción:
El algoritmo de ELGamal nació en 1984 y fue descrito por Taher
ElGamal. Se trata de un algoritmo de cifrado asimétrico basado en la
exponenciación discreta sobre el grupo multiplicativo de un cuerpo finito. La
seguridad del algoritmo depende en la dificultad de calcular logaritmos discretos.

C.3.4.- DSA [B.R.1.35-1.36]
Nombre completo:
Digital Signature Algorithm (1991)
Descripción:
Es un estándar del Gobierno Federal de los Estados Unidos de América
o FIPS para firmas digitales. Fue un Algoritmo propuesto por el Instituto Nacional
de Normas y Tecnología de los Estados Unidos para su uso en su Estándar de
Firma Digital (DSS), especificado en el FIPS 186. DSA se hizo público el 30 de
agosto de 1991, este algoritmo asimétrico como su nombre lo indica, sirve para
firmar y para cifrar información. Se basa en el problema de la factorización entera,
Una desventaja de este algoritmo es que requiere mucho más tiempo de cómputo
que RSA.

-132-
Apéndice C: Criptosistemas

C.3.5.- CCE [B.R.1.37-1.39]
Nombre completo:
Criptografía de Curva Elíptica (1985)
Descripción:
Es una variante de la criptografía asimétrica o de clave pública basada en
las matemáticas de las curvas elípticas. Sus autores argumentan que la CCE
puede ser más rápida y usar claves más cortas que los métodos antiguos —
como RSA — al tiempo que proporcionan un nivel de seguridad equivalente. La
utilización de curvas elípticas en criptografía fue propuesta de forma
independiente por Neal Koblitz y Víctor Miller en 1985.

-133-
Aplicación software para el desarrollo de tareas criptográficas
ÍNDICE EXTRAORDINARIO
Aplicación software para el desarrollo de tareas criptográficas
Proyecto Fin de Carrera

Índices Extraordinarios

I.1.- Cuadros de Código.
Cuadro de Código 1.1: Cabecera de funciones y procedimientos de la 1ª Versión de la
Aplicación…………………………………………………………………………………. 7
Cuadro de Código 1.2: Cálculo del resto “%” a sucesivos productos en Cifrar_Mensaje…7
Cuadro de Código 1.3: Cabecera de procedimientos de la 1ª Versión de la Aplicación
DES…………………………………………………………………………………………9
Cuadro de Código 1.4: Definición de la clase “mirsa” con Qt…...……………………… 12
Cuadro de Código 1.5: Definición de la clase “mides” con Qt……………………………13

Cuadro de Código 1.6: Definición de la clase “miproject” con Qt………...………….17-18
Cuadro de Código 1.7: Definición de la clase “micriptosistema” con Qt...…………...22-24
Cuadro de Código 2.1: Cálculo de la lista de números primos...………………………... 38
Cuadro de Código 2.2: Cálculo del producto de los números primos (clave pública “n”)..39
Cuadro de Código 2.3: Mínimo Común Divisor por Euclides en su forma iterativa..……39
Cuadro de Código 2.4: Cálculo de la lista de claves públicas “e”………………………...40
Cuadro de Código 2.5: Cálculo de la clave privada “d”…………………………………. 41
Cuadro de Código 2.6: Cifrado RSA…...………………………….…………………….. 42
Cuadro de Código 2.7: Descifrado RSA…………………………….…………………….43
Cuadro de Código 2.8: Generación de subClaves en DES………………………………. 47
Cuadro de Código 2.9: Cifrado DES…………………………………………………..49-50
Cuadro de Código 2.10: Adición al principio del cifrado DES para conformar TDES…. 57
Cuadro de Código 2.11: Adición al final del cifrado DES para conformar TDES ..……..58
Cuadro de Código 2.12: Diálogo de Encriptado para la Gestión de Claves en RSA……..64
Cuadro de Código 2.13: Entrada del par de Claves Públicas de RSA y gestiones según se
haya habilitado RSA Digital……………………………………………………………….65

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

Cuadro de Código 2.14: Entrada de la Clave Privada de RSA y gestiones según se haya
habilitado RSA Digital…………………………………………………………………….65
Cuadro de Código 2.15: Diálogo de Encriptado para la Gestión de la Clave en DES…...66
Cuadro de Código 2.16: Diálogo de Encriptado para la Gestión de la Clave en RSAD…67

I.2.- Figuras.
Figura 1.1: Menú consola RSA (1ª Versión de la Aplicación desarrollada)……………….7
Figura 1.2: Cifrado DES (1ª Versión de la Aplicación DES)………………………………8
Figura 1.3: Cifrado y Descifrado DES (2ª Versión de la Aplicación DES)………………10
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++………………………………………………… 11
Figura 1.5: Esquema del proceso de trabajo para la Adaptación de la clase RSA y la clase
DES a Qt…………………………………………………………………………………...15
Figura 1.6: Esquema del proceso de trabajo para el Diseño y desarrollo de la Interfaz de la
Aplicación…………………………………………………………………………………19
Figura 1.7: Esquema del proceso de trabajo para la Gestión de claves e implementación de
las clases TDES y RSA Digital……………………………………………………………25
Figura 1.8: Relación entre las clases implementadas……………………………………..32
Figura 1.9: Caminos posibles para las comunicaciones de los criptosistemas y el protocolo.
……………………………………………………………………………………………..33
Figura 2.1: Sistema RSA………………………………………………………………….37
Figura 2.2: Demostración del Descifrado en RSA………………………………………..44
Figura 2.3: Clave DES…………………………………………………………………….46
Figura 2.4: Cifrado en DES……………………………………………………………….55
Figura 2.5: Esquema de la función (f) y la generación de las subclaves………………….56
Figura 2.6: Esquema del algoritmo Triple DES…………………………………………..59
-138-
Índices Extraordinarios

Figura 3.1: La interfaz principal…………………………………………………………..72
Figura 3.2: Esquema de la interfaz principal……………………………………………...73
Figura 3.3: Esquema de la interfaz principal……………………………………………...73
Figura 3.4: Barra de Menús……………………………………………………………….74
Figura 3.5: Barra de Herramientas………………………………………………………..74
Figura 3.6: La interfaz del menú algoritmo……………………………………………….75
Figura 3.7: Esquema de la interfaz que proporciona los algoritmos criptográficos………76
Figura 3.8: La interfaz del menú RSA…………………………………………………….76
Figura 3.9: Esquema de la interfaz que proporciona el menú RSA………………………77
Figura 3.10: La interfaz del menú generar claves de RSA……………………………….77
Figura 3.11: La interfaz para la elección de un número primo de RSA………………….78
Figura 3.12: La interfaz para introducir la clave privada de RSA………………………..78
Figura 3.13: Esquema de la interfaz que proporciona el menú generar claves de RSA….79
Figura 3.14: La interfaz del menú cargar claves de RSA…………………………………79
Figura 3.15: La interfaz del menú manual de RSA……………………………………….80
Figura 3.16: Mensaje de error al introducir claves incorrectas…………………………...80
Figura 3.17: La interfaz del menú exportar desde archivo de RSA………………………81
Figura 3.18: Esquema de la interfaz que proporciona el menú cargar claves de RSA…...81
Figura 3.19: La interfaz del menú usar sesión de RSA…………………………………...82
Figura 3.20: Esquema de la interfaz que proporciona el usar claves de sesión de RSA….82
Figura 3.21: La interfaz del menú DES y TDES………………………………………….83
Figura 3.22: La interfaz para introducir la clave en DES y TDES………………………..83
Figura 3.23: Mensaje de error al introducir claves con longitud incorrecta en DES y
TDES………………………………………………………………………………………84

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

Figura 3.24: Esquema de la interfaz que proporciona el menú DES y TDES…………….84
Figura 3.25: La interfaz del menú RSAD…………………………………………………85
Figura 3.26: Esquema de la interfaz para el cifrado que proporciona el menú RSAD…...86
Figura 3.27: Esquema de la interfaz para el descifrado que proporciona el menú RSAD..86
Figura 3.28: La interfaz para introducir la clave simétrica……………………………….87
Figura A.1: Abrir CriptoYenet……………………………………………………………99
Figura A.2: Escribir texto en CriptoYenet………………………………………………...99
Figura A.3: Abrir en CriptoYenet………………………………………………………..100
Figura A.4: Abrir un documento CriptoYenet…………………………………………...100
Figura A.5: Documento cifrado de CriptoYenet abierto………………………………...101
Figura A.6: El texto señalado (esto activa las opciones criptográficas)…………………101
Figura A.7: Generando las Claves con RSA…………………………………………….103
Figura A.8: Cargando las Claves con RSA………………………………………………103
Figura A.9: Usando Claves de Sesión con RSA…………………………………………104
Figura A.10: Palabra cifrada con RSA…………………………………………………..104
Figura A.11: Definiendo clave o usando clave interior con DES……………………….105
Figura A.12: Definiendo clave DES o TDES para RSAD……………………………….105
Figura A.13: Aviso de cifrado de la clave privada simétrica…………………………….106
Figura A.14: Aviso para guardar la clave privada simétrica…………………………….106
Figura A.15: Aviso para la correcta ejecución de RSAD………………………………..107
Figura A.16: Cargando clave privada simétrica cifrada en RSAD………………………107
Figura B.1: Flujo de Información en un canal criptográfico…………………………….114
Figura B.2: Aritmética modular comparada con las vueltas de un reloj………………...118
Figura B.3: Algoritmo de Euclides………………………………………………………120
-140-
Índices Extraordinarios

Figura C.1: Simétrico o asimétrico según la clave en el transmisor y en el receptor……125
Figura C.2: Cifrado por bloques…………………………………………………………126
Figura C.3: Cifrado por flujo…………………………………………………………….126

I.3.- Tablas.
Tabla 2.1: Permutación Tipo 1…………………………………………………………….47
Tabla 2.2: Desplazamiento de “mitadA_pT1” y “mitadB_pT1”, según la ronda……….. 48
Tabla 2.3: Permutación Tipo 2……………………………………………………………48
Tabla 2.4: Permutación Inicia…………………………………………………………….50
Tabla 2.5: Permutación de Expansión…………………………………………………….51
Tabla 2.6: S-Box 1………………………………………………………………………...52
Tabla 2.7: Permutación P………………………………………………………………….52
Tabla 2.8: Permutación Final (inversa de la Permutación Inicial)……………………..….52
Tabla 2.9: Desplazamiento de las mitades según la ronda para el descifrado…………….53
Tabla 2.10: Mismas subclaves para cada Clave Débil…………………………………….54
Tabla B.1: El Código de Cesar…………………………………………………………...102
Tabla B.2: Algebra Booleana…………………………………………………………….121

I.4.- Expresiones.
Expresión 2.1: Generador de claves RSA……………..…………………………………. 38
Expresión 2.2: Inversa Modular RSA……………………….…………………………… 40
Expresión 2.3: Cifrado RSA………………………………………………………………41
Expresión 2.4: Descifrado RSA……….…………………………………………………..42
-141-
Aplicación Software para el Desarrollo de Tareas Criptográficas

Expresión 2.5: Expresión parte izquierda DES……………………………………………52
Expresión 2.6: Expresión parte derecha DES ………….…..……………………………..52
Expresión 2.7: Cifrado Triple DES………………………..…………..…………………..57
Expresión B.1: Resto modular……………………………………………………………118
Expresión B.2: Generador de claves……………………………………………………..119

-142-
BIBLIOGRAFÍA - REFERENCIA
Aplicación software para el desarrollo de tareas criptográficas
Proyecto Fin de Carrera

Bibliografía-Referencia

BIBLIOGRAFÍA – REFERENCIA
B.R.1.- Criptografía.
B.R.1.1.

Amparo Fúster, Dolores de la Guía, Luís Hernández, Fausto Montoya, Jaime
Muñoz: Técnicas criptográficas de protección de datos. 3ª Edición Actualizada,
2004

B.R.1.2.

C. E. Shannon: A mathematical theory of communication. Bell System Technical
Journal, vol. 27, pp. 379–423 and 623–656, July and October, 1948.

B.R.1.3.

C. E. Shannon: Communication theory of secrecy systems. Bell System Technical
Journal, vol. 28, 656-715, 1949.

B.R.1.4.

Eli Biham, Adi Shamir, Differential Cryptanalysis of the Data Encryption Standard,
Springer Verlag, 1993. ISBN 0-387-97930-1, ISBN 3-540-97930-1.

B.R.1.5.

John Gilmore, "Cracking DES: Secrets of Encryption Research, Wiretap Politics
and Chip Design", 1998, O'Reilly, ISBN 1-56592-520-3.

B.R.1.6.

Documentación Oficial de DES:
http://csrc.nist.gov/públications/fips/fips46-3/fips46-3.pdf

B.R.1.7.

Implicaciones del uso de DES:
http://www.rfc-editor.org/rfc/rfc4772.txt

B.R.1.8.

John Gilmore, "Cracking DES: Secrets of Encryption Research, Wiretap Politics
and Chip Design", 1998, O'Reilly, ISBN 1-56592-520-3.

B.R.1.9.

Amplia descripción de TDES:
http://csrc.nist.gov/públications/nistpubs/800-67/SP800-67.pdf

B.R.1.10.

Joan Daemen and Vincent Rijmen, "The Design of Rijndael: AES - The Advanced
Encryption Standard." Springer-Verlag, 2002. ISBN 3540425802.

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

B.R.1.11.

Breve descripción con multitud de enlaces útiles de AES
http://www.iaik.tu-graz.ac.at/research/krypto/AES/old/%7Erijmen/rijndael/

B.R.1.12.

Entretenida explicación animada de AES
http://www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf

B.R.1.13.

Xuejia Lai and James L. Massey and S. Murphy, Markov ciphers and differential
cryptanalysis, Advances in Cryptology — Eurocrypt '91, Springer-Verlag (1992),
pp17–38.

B.R.1.14.

Hüseyin Demirci, Erkan Türe, Ali Aydin Selçuk, A New Meet in the Middle Attack
on The IDEA Block Cipher, 10th Annual Workshop on Selected Areas in
Cryptography, 2003.

B.R.1.15.

Pagina Oficial de IDEA :
http://www.mediacrypt.com/

B.R.1.16.

Scott Contini, Ron Rivest, Matthew Robshaw, Yiqun Lisa Yin, The Security of
RC6.

B.R.1.17.

Pagina Oficial de RC6:
http://www.rsa.com/rsalabs/node.asp?id=2251

B.R.1.18.

Amplia Descripción de RC6:
http://people.csail.mit.edu/rivest/Rc6.pdf

B.R.1.19.

Resumida Presentación de por que elegir RC6:
http://people.csail.mit.edu/rivest/rc6-final-4.ppt

B.R.1.20.

C. Adams, “Constructing Symmetric Ciphers Using the CAST Design
Procedure”, in Selected Areas in Cryptography, E. Kranakis and P. Van
Oorschot (ed.), Kluwer Academic Publishers, 1997, pp.71-104

B.R.1.21.

Detallada descripción con ejemplos desde la base de CAST-256:
(http://www.mirrors.wiretapped.net/security/cryptography/algorithms/aestesting/cast/cast-256.pdf)

-146-
Bibliografía-Referencia

B.R.1.22.

Bruce Schneier, John Kelsey, Doug Whiting, David Wagner, Chris Hall, Niels
Ferguson (1998-06-15).

B.R.1.23.

Pagina Oficial con multitud de enlaces útiles de Twofish:
http://www.schneier.com/twofish.html

B.R.1.24.

Diffie, W. y M.E.Hellman. "New directions in cyptography", IEEE Transactions on
Information Theory 22 (1976), pp. 644-654.

B.R.1.25.

Diffie, W., P.C. van Oorschot y M.J. Wiener. "Authentication and authenticated key
exchanges", Design, Codes and Cryptography 2 (1992), pp. 107-125.

B.R.1.26.

Descripción sencilla sin matemáticas de DH/DSS:
http://www.netip.com/articles/keith/diffie-helman.htm

B.R.1.27.

Explicación visual de DH/DSS:
http://www.xml-dev.com/blog/index.php?action=viewtopic&id=196

B.R.1.28.

Anuncio del estándar de DH/DSS:
http://www.itl.nist.gov/fipspubs/fip186.htm

B.R.1.29.

R. Rivest, A. Shamir, L. Adleman. A Method for Obtaining Digital Signatures and
Public-Key Cryptosystems. Communications of the ACM, Vol. 21 (2), pp.120–126.

B.R.1.30.

Amplia descripción de RSA:
http://es.wikipedia.org/wiki/RSA

B.R.1.31.

Breve explicación con enlaces a los métodos matemáticos usados en RSA:
http://www.matematicas.net/paraiso/cripto.php?id=rsa1

B.R.1.32.

Pino Caballero Gil: Introducción a la criptografía, 2ª Edición Actualizada.
Cap 3 apartado 3 y Cap 4 apartado 4.2.4

B.R.1.33.

Amplia descripción sobre el Gamal:
http://es.wikipedia.org/wiki/Cifrado_ElGamal

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

B.R.1.34.

Breve explicación sobre el Gamal:
http://www.zooglea.com/criptografia/apuntes-de-criptografia-v-elgamal/

B.R.1.35.

Richard A Mollin: An Introduction to Cryptography - 2006 - Página 187

B.R.1.36.

Amplia descripción de DSA:
http://en.wikipedia.org/wiki/Digital_Signature_Algorithm

B.R.1.37.

Hankerson, Menezes, Vanstone: "Guide to Elliptic Curve Cryptography", 2004

B.R.1.38.

Blake, Seroussi, Smart, "Elliptic Curves in Cryptography", Cambridge University

B.R.1.39.

Amplia descripción de CCE:
http://www.certicom.com/index.php?action=ecc_tutorial,home

B.R.2.- Programación.
B.R.2.1.

“Curso de Programación”, McGraw Hill. (1993), 2. ISBN 84-481-1959-2

B.R.2.2.

Lenguajes de Programación:
http://www.monografias.com/trabajos/lengprog/lengprog.shtml

B.R.2.3.

Python, Java, C, C++ y Matlab en la Wikipedia:
http://es.wikipedia.org/wiki/Python
http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Java
http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_C
http://es.wikipedia.org/wiki/C%2B%2B
http://es.wikipedia.org/wiki/MATLAB

B.R.2.4.

Curso para C y C++:
http://c.conclase.net/

B.R.2.5.

IDE Dev-Cpp
http://www.bloodshed.net/devcpp.html

-148-
Bibliografía-Referencia

B.R.2.6.

IDE CodeBlock
http://www.codeblocks.org/

B.R.2.7.

Compilador MinGW:
http://www.mingw.org/

B.R.2.8.

Mínimo sistema GNU para Windows:
http://www.mingw.org/msys.shtml

B.R.2.9.

Sistema GNU para Windows:
http://www.cygwin.com/

B.R.2.10.

Referencia de la API de las clases de Qt
http://doc.trolltech.com/4.3/classes.html

B.R.2.11.

Foro sobre Qt
http://www.qtforum.org/index.php

B.R.2.12.

Proyecto GNU:
http://www.gnu.org/home.es.html

B.R.2.13.

Programación para usuarios de GNU/Linux
http://bulma.net/

B.R.2.14.

Documentación oficial sobre el uso de GMP:
http://gmplib.org/gmp-man-4.2.2.pdf

B.R.2.15.

Algoritmo de Euclides:
http://es.wikipedia.org/wiki/Algoritmo_de_Euclides

B.R.2.16.

GCC:
http://gcc.gnu.org/

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

B.R.3.- Matemáticas.
B.R.3.1.

Aritmética modular:
http://es.wikipedia.org/wiki/Aritm%C3%A9tica_modular

B.R.3.2.

Aritmética modular y criptografía:
http://imerl.fing.edu.uy/matdisc2/Archivos/curso2001/cripto2001.pdf

B.R.3.3.

Algebra Booleana:
http://es.wikipedia.org/wiki/%C3%81lgebra_de_Boole

B.R.4.- Software similar.
B.R.4.1.

Página Oficial de PGP:
http://www.pgpi.org/

B.R.4.2.

SSL en la Wikipedia:
http://es.wikipedia.org/wiki/Transport_Layer_Security

B.R.5.- Diseño.
B.R.5.1.

Página oficial de Photoshop:
http://www.adobe.com/es/products/photoshop/photoshop/

B.R.5.2.

Curso de Photoshop CS3:
http://www.aulaclic.es/photoshopcs3/

B.R.5.3.

Página oficial de Gimp:
http://www.gimp.org.es/

-150-

Más contenido relacionado

PDF
371 recomendaciones
PDF
100 Ejerc...
PPTX
ALGORITMOS EN EL SOFTWARE
PDF
Elementos de Criptografia
PPTX
Criptografia-La-Seguridad-en-la-Era-Digital (1).pptx
PPTX
Criptografia-La-Seguridad-en-la-Era-Digital (2).pptx
PDF
Propuesta y-analisis-de-criptosistemas-de-clave-publica-basados-en-matrices-t...
PDF
Implementación de Algoritmos Criptográficos y de Digestión de Mensajes
371 recomendaciones
100 Ejerc...
ALGORITMOS EN EL SOFTWARE
Elementos de Criptografia
Criptografia-La-Seguridad-en-la-Era-Digital (1).pptx
Criptografia-La-Seguridad-en-la-Era-Digital (2).pptx
Propuesta y-analisis-de-criptosistemas-de-clave-publica-basados-en-matrices-t...
Implementación de Algoritmos Criptográficos y de Digestión de Mensajes

Similar a Aplicación software para el desarrollo de tareas criptográficas (20)

PPTX
Seguridad 1 - Redes de Computadoras
PPT
Vinueza Bustamante Gabriel 1 C
PPT
Vinueza Bustamante Gabriel 1 C
PPT
Seguridad de datos protocolo en Internet1.ppt
PDF
Unidad 5 - Criptografía
DOCX
Unidad 4 trabajo 6
DOCX
Stiveeeeeeeeeeen[1]
PPT
Criptografia
PDF
Blue Gradient Modern Group Project Presentation.pdf
PDF
Criptosis
PPTX
Algoritmos De Encriptacion
PDF
Criptosis
PPTX
PPTX
Firmas y certificados digitales
PPTX
Firmas y certificados digitales
PPT
criptografia en los ordenadores o pc.ppt
PDF
Alternativas de Autentificación por dos Factores en Portales Web
PDF
Cripto de redes
PDF
Introduccion a la criptografia
PPTX
Presentación rsa.pptx..............................................
Seguridad 1 - Redes de Computadoras
Vinueza Bustamante Gabriel 1 C
Vinueza Bustamante Gabriel 1 C
Seguridad de datos protocolo en Internet1.ppt
Unidad 5 - Criptografía
Unidad 4 trabajo 6
Stiveeeeeeeeeeen[1]
Criptografia
Blue Gradient Modern Group Project Presentation.pdf
Criptosis
Algoritmos De Encriptacion
Criptosis
Firmas y certificados digitales
Firmas y certificados digitales
criptografia en los ordenadores o pc.ppt
Alternativas de Autentificación por dos Factores en Portales Web
Cripto de redes
Introduccion a la criptografia
Presentación rsa.pptx..............................................
Publicidad

Último (20)

PDF
Taller tecnológico Michelle lobo Velasquez
PPTX
Formato de texto, párrafo, documentos, columnas periodísticas, referencias.
PPTX
Sistema de Gestión Integral TCA Ingenieros.pptx
DOCX
Trabajo grupal.docxjsjsjsksjsjsskksjsjsjsj
PPT
Protocolos de seguridad y mecanismos encriptación
DOCX
TRABAJO GRUPAL (5) (1).docxsjjsjsksksksksk
PDF
Final Tecno .pdfjdhdjsjdhsjshshhshshshhshhhhhhh
PPTX
Procesamiento-del-Lenguaje-Natural-Un-Viaje-Paso-a-Paso.pptx
PPTX
TECNOLOGIA EDUCATIVA...........pptx.....
PDF
Teoría de estadística descriptiva y aplicaciones .pdf
DOCX
Guía 5. Test de orientación Vocacional 2[1] (Recuperado automáticamente).docx
DOCX
TRABAJO GRUPAL (5) (1).docxjsjsjskskksksk
DOCX
Guía 5. Test de orientación Vocacional 2 NICOL.docx
PPTX
libro proyecto con scratch jr pdf en la e
PPTX
Mecanismos-de-Propagacion de ondas electromagneticas
PPTX
Circuito de LED en paralelo mediante Switch
PDF
Distribucion de frecuencia exel (1).pdf
PDF
Guía_de_implementación_Marco_de_gobierno_y_gestión_de_TI_Universidades.pdf
DOCX
TRABAJO GRUPAL (5) (1).docxsjsjskskksksksks
DOCX
orientacion nicol juliana portela jimenez
Taller tecnológico Michelle lobo Velasquez
Formato de texto, párrafo, documentos, columnas periodísticas, referencias.
Sistema de Gestión Integral TCA Ingenieros.pptx
Trabajo grupal.docxjsjsjsksjsjsskksjsjsjsj
Protocolos de seguridad y mecanismos encriptación
TRABAJO GRUPAL (5) (1).docxsjjsjsksksksksk
Final Tecno .pdfjdhdjsjdhsjshshhshshshhshhhhhhh
Procesamiento-del-Lenguaje-Natural-Un-Viaje-Paso-a-Paso.pptx
TECNOLOGIA EDUCATIVA...........pptx.....
Teoría de estadística descriptiva y aplicaciones .pdf
Guía 5. Test de orientación Vocacional 2[1] (Recuperado automáticamente).docx
TRABAJO GRUPAL (5) (1).docxjsjsjskskksksk
Guía 5. Test de orientación Vocacional 2 NICOL.docx
libro proyecto con scratch jr pdf en la e
Mecanismos-de-Propagacion de ondas electromagneticas
Circuito de LED en paralelo mediante Switch
Distribucion de frecuencia exel (1).pdf
Guía_de_implementación_Marco_de_gobierno_y_gestión_de_TI_Universidades.pdf
TRABAJO GRUPAL (5) (1).docxsjsjskskksksksks
orientacion nicol juliana portela jimenez
Publicidad

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
  • 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.: _________________
  • 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
  • 7. A mis padres Antonio y Paqui, Y a mis hermanas Lidia y Anay.
  • 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
  • 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.
  • 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-
  • 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-
  • 53. Capítulo 2: Algoritmos Criptográficos Desarrollados A la vista del método implementado, resulta muy interesante situarlo dentro de la clase en la Figura 1.8, para ver en que nivel del proceso se encuentra y entender su comportamiento. Básicamente se va buscando los primos consecutivos a partir de un límite inferior. La lista de primos estará completa cuando se complete la cantidad definida por el usuario. El resto de código hace referencia a los ajustes de etiquetas, botones y otros parámetros que no influyen de manera directa con el procesado matemático del criptosistema. Su uso adecua la interfaz y la correcta comunicación con el usuario, estos no se omiten por su aporte a la comprensión del proceso, pero se comentarán tan solo a línea de código21. Obtenidos “p” y “q”, se calcula su producto, es decir, la clave pública que se utilizara para el cifrado y el descifrado “n”. Su implementación en el Cuadro de Código 2.2., se resume en una línea. void MiGenerarRSA::calcularN(){ rsa->n= rsa->p*rsa->q; labelN->setText(QString::fromStdString(rsa->n.get_str(10)));//ponemos como texto en labelN botonN->setEnabled(false); botonE->setEnabled(true);//desactivamos N, activamos E } Cuadro de Código 2.2: Cálculo del producto de los números primos (clave pública “n”) El siguiente paso es la elección de la clave pública “e”, presentada en una lista. Para ello es necesario el cálculo previo de φ (n ) (véase la Expresión 2.1). Esta clave debe cumplir la condición de primo relativo con φ (n ) (solo así tendrá inversa modular y se podrá recuperar la señal más adelante). Así “e” debe cumplir: 1 < e < φ (n ) y no tener ningún número menor que lo divida. Utilizando el máximo común divisor con Euclides en su versión iterativa (véase Cuadro de Código 2.3), se hizo una primera implementación al servicio de “e”. Debido a la lentitud de este método con forme se manejaban números más grandes, se hizo uso de una función especifica aportada por GMP [B.R.2.14]. Las claves públicas obtenidas con esa función, se almacenarán en una lista según el Cuadro de Código 2.4, para la posterior elección de “e”. mpz_class MiRsa::mcdEuclides(mpz_class a, mpz_class b){ mpz_class t; while(a>0){ t=a; a=b%a; b=t; } return b; } Cuadro de Código 2.3: Mínimo Común Divisor por Euclides en su forma iterativa El par de claves públicas que deberá transmitir el usuario o que deberán colocarse en una red pública, estará formado por la elección de la clave pública “n” (según los primos) y de la clave pública “e” (seleccionada de la lista). 21 Esta aclaración es igualmente valida para el resto de los métodos comentados, por lo que se omitirá en los subsecuentes Cuadros de Código. -39-
  • 54. Aplicación Software para el Desarrollo de Tareas Criptográficas void MiGenerarRSA::elegirE(){ mpz_class o=(rsa->p-1)*(rsa->q-1); QStringList listaClavesE;//lista de posibles claves públicas e, almacenada como carácter dLimitesLista->vaciar();//para los limites de la lista dLimitesLista->ponerNombre(tr("Seleccione los parámetros para buscar las claves públicas E")); 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 gcd;//para el máximo común divisor mpz_class i=0; while((i<cantidad)&&(minList<(o-1))){//vamos a calcular la cantidad de claves públicas mpz_gcd (gcd.get_mpz_t(), minList.get_mpz_t(), o.get_mpz_t()); if(gcd==1){//si existe inversa listaClavesE.append(QString::fromStdString(minList.get_str(10)));//almacenamos i=i+1;//aumentamos la cantidad } minList=minList+1;//probamos el siguiente } dParametroEnRSA->vaciar(); dParametroEnRSA->ponerNombre("Elija una Clave Pública de la lista"); dParametroEnRSA->ponerLista(listaClavesE); dParametroEnRSA->exec(); if(dParametroEnRSA->listo()){ //Guardamos QString como mpz_class rsa->e.set_str(dParametroEnRSA->extraer().toAscii().data(),10); labelE->setText(dParametroEnRSA->extraer());//ponemos el texto en labelP botonE->setEnabled(false);//desactivamos este paso botonD->setEnabled(true);//activamos el siguiente paso } } } Cuadro de Código 2.4: Cálculo de la lista de claves públicas “e” Lo siguiente es el cálculo de la inversa de la clave elegida “e”, a la que se le llamará “d”, esta será la clave privada. Su cometido junto con “n” es el descifrado. Para su cálculo, el cual es posible gracias a la comprobación de su existencia en el Cuadro de Código 2.4, se tiene que despejar “d” de la siguiente expresión: de ≡ 1(mod φ (n)) (2.2) Este caso, el de la clave privada en la generación de claves en RSA, se traduce, al igual que los anteriores pasos, literalmente a nivel de programación. Su método esta presentado en el Cuadro de Código 2.5. -40-
  • 55. Capítulo 2: Algoritmos Criptográficos Desarrollados En primer lugar, se hizo uso de un bucle para la clave privada “d”, que multiplicada por la clave pública “e” modulo “phi” resultase 1. El inconveniente de la lentitud que presentaba este proceso para el cálculo de la inversa, propino es uso de un método especifico de GMP. void MiGenerarRSA::calcularD(){ mpz_class o=(rsa->p-1)*(rsa->q-1); //Calculamos la inversa de “e” y la almacenamos en “d” mpz_invert(rsa->d.get_mpz_t(),rsa->e.get_mpz_t(),o.get_mpz_t()); labelD->setText(QString::fromStdString(rsa->d.get_str(10)));//ponemos en labelP botonD->setEnabled(false);//desactivamos este paso aceptar->setEnabled(true);//activamos el boton que verifica terminado } Cuadro de Código 2.5: Cálculo de la clave privada “d” Resumiendo, se tiene un número “e” (un exponente) que sale de φ (n ) , un número “d” (otro exponente) que sale de φ (n ) y el número “n” (un modulo). Como ya se ha comentado en varias ocasiones con ”e” y ”n” se puede cifrar y con “d” y “n” se puede descifrar, con lo que ya no es necesario el generador de claves, φ (n ) . Si alguien quisiera generar nuestra clave privada de nuevo, tendría que recuperar φ (n ) . Y es aquí donde radica la seguridad del RSA, en la imposibilidad de factorizar para recuperar el generador. Si alguien quisiera recuperar φ (n ) para sacar la clave privada calculando la inversa de la pública, solo conoce ”n”, no conoce “p” ni ”q”. Así que tendría que empezar a dividir ”n” entre números primos gigantes para adivinar ”p” y ”q” y luego poder hacer (p-1)(q-1) que es φ (n ) . Lo cual presenta dos dificultades, una es que ir dividiendo requiere muchos recursos, y otra es saber si el número por el que se divide es primo, por lo que la factorización de ”n” (que así se llama a encontrar “p” y ”q”) se vuelve un problema intratable. En caso de duda para este y otros apartados se recomienda el Apéndice B, donde se presenta la base criptográfica básica, así como la matemática. Concretamente para el sistema RSA véase el Apartado 9 del Apéndice B. 2.1.3 Cifrado. Para cifrar, lo único que se hace es elevar lo que se quiere cifrar a ”e” (el exponente de la clave pública) y calcular su modulo “n”, es decir, según la expresión: c ≡ m e (mod n) (2.3) El paso a nivel de programación del cifrado (Cuadro de Código 2.6.), no es tan inmediato como en la generación de claves, pudiendo dar problemas como los -41-
  • 56. Aplicación Software para el Desarrollo de Tareas Criptográficas vistos en el Capítulo 1, Apartado 1.3.1. La implementación del cifrado parte de los caracteres que conforman el mensaje. Coge sus estados numéricos elevándolos dentro de un bucle a razón de “e”, mientras se va multiplicando los resultado sucesivos y se calcula el modulo “n” en cada vuelta del bucle. Al final, cada número obtenido correspondiente al cifrado de un carácter, es almacenado dentro de una lista como cadena de caracteres numéricos decimales para su posterior muestra. La misma implementación (véase Cuadro de Código 1.2), fue sustituida en las últimas fases del proyecto por su análoga en GMP, “mpz_powm”, aumentando la velocidad en el proceso. QStringList MiRsa::encriptar(QString mensaje){ mpz_class encriptado[mensaje.size()];//array de mpz_class para almacenar el encriptado QStringList encriptadoQStrList;//lista de QString para almacenar los car Encriptados mpz_class carClaro;//para los caracteres del mensaje en unicode //Encriptamos tal que ((mensaje)^e)mod n for(int i=0;i<mensaje.size();i++){ //Pasamos a unicode el caracter carClaro=mensaje[i].unicode(); //Se encripta a razon de ((caracter)^e)mod n mpz_powm(encriptado[i].get_mpz_t(),carClaro.get_mpz_t(),e.get_mpz_t(),n.get_mpz_t()); //Vamos copiando mi encriptado en un QStringLis encriptadoQStrList.insert(i,QString::fromStdString(encriptado[i].get_str(10))); } return(encriptadoQStrList);//devolvemos QStringList } Cuadro de Código 2.6: Cifrado RSA 2.1.4 Descifrado. Para descifrar es un poco más complicado. Como se ha visto, las claves vienen calculadas en módulo φ (n ) , y nada tienen que ver a priori con “n”, son dos segmentos de números distintos. Pues a partir de una propiedad que dice que si se multiplica un número ”a” (distinto de cero) por si mismo φ (n ) veces, el resultado da 1 en módulo “n” con lo que se puede recuperar el mensaje (véase demostración en la Figura 2.2). Es en esta propiedad en la que se basa todo el algoritmo RSA, haciendo que el código implementado para el descifrado funcione (véase Cuadro de Código 2.7). Para mayor entendimiento se expone la demostración en la Figura 2.2., y un ejemplo práctico al finalizar. Se tiene que el descifrado en RSA obedece a la expresión: m ≡ c d (mod n) (2.4) La Expresión 2.4 presenta la misma forma que la del encriptado (Expresión 2.3) y su implementación según el Cuadro de Código 2.7, (partiendo de la propiedad comentada para recuperar el mensaje), no ofrece ningún secreto. Lo que si cambia es que ahora se parte de la lista de números cifrados, que están -42-
  • 57. Capítulo 2: Algoritmos Criptográficos Desarrollados representados como listas de caracteres. Se quiere obtener el número en el código Unicode que lo representaba, para adjuntarlo todo (carácter a carácter recuperado) en la cadena que se devuelve. QString MiRsa::desencriptar(QStringList encriptadoList){ //Para el desencriptado mpz_class desencriptado[encriptadoList.size()];//array de mpz_class para almacenar el desencriptado QString desencriptadoQStr;//QString para almacenar los car Desencriptados mpz_class carCifrado;//para los caracteres cifrados //Desencriptamos tal que ((mensaje)^d)mod n for(int i=0;i<encriptadoList.size();i++){ //Pasamos a mpz_class la cadena del caracter carCifrado.set_str(encriptadoList[i].toStdString(),10); //Se desencripta a razon de ((caracter)^d)mod n mpz_powm(desencriptado[i].get_mpz_t(),carCifrado.get_mpz_t(),d.get_mpz_t() ,n.get_mpz_t()); //Vamos copiando mi encriptado en un QString desencriptadoQStr[i]=QChar(QString::fromStdString(desencriptado[i].get_str(10)).toInt()); } return(desencriptadoQStr);//devolvemos QString } Cuadro de Código 2.7: Descifrado RSA Vistos el cifrado y el descifrado en RSA, para concluir que mejor forma que mediante un ejemplo práctico para ambos en el que se afiance lo explicado. En este se han elegido números pequeños para facilitar los cálculos, los cuales no presentan seguridad alguna pero ilustran muy bien el proceso criptográfico. 1) Para el principio de la generación de claves el usuario obtiene la clave pública ”n”, como se dijo en el Apartado 2.1.2, según la multiplicación de los primos “p” y “q” que escogió, por ejemplo: n = 5 * 11. 2) Con la elección de los primos se calcula el generador de claves a partir de la expresión (2.1), obteniendo: φ (n ) = 4 * 10 = 40. 3) El siguiente paso es la elección de una clave pública “e” que sea primo relativo con 40 (véase el uso del método del Cuadro de Código 2.3 en el Cuadro de Código 2.4), por ejemplo: e = 7. 4) El último paso es la generación de la clave privada “d” a partir de “e”, es decir, el cálculo de su inversa módulo 40, que es 23: 7*23 = 161 = 1 módulo 40. Obteniéndose d = 23. Se ha conseguido la clave pública formada por (55, 7) y la privada (23). Si ahora se quiere cifrar, por ejemplo, el número 2, bastará con calcular 2^7 = 128 = 18 módulo 55. Y para su descifrado, se elevará 18 a 23 módulo 55 y da 2, el mensaje recuperado. -43-
  • 58. Aplicación Software para el Desarrollo de Tareas Criptográficas Continuando con la propiedad de recuperación del mensaje en RSA, la cual, “como acto de fe” se dio por valida, se expone su demostración a través del siguiente diagrama representado en la Figura 2.2. En ella se ha omitido el modulo “n” para los cálculos al no sufrir cambios durante el proceso. e Partiendo del cifrado, sustituimos el valor de este en la expresión 2.4 c=m m = (me ) d Quedando el descifrado tal y como se muestra aquí. d ⋅ e mod φ (n) = 1 Utilizando la propiedad de que “e” y “d” son inversa d ⋅ e = k ⋅ φ (n) + 1 Escribimos la expresión de esta forma para usarla al final Por último aplicando reglas matemáticas normales y la siguiente propiedad: aφ ( n ) = 1 Obtenemos m m = m e⋅d = m k ⋅φ ( n ) +1 = ( mφ ( n ) ) k ⋅ m1 = 1k ⋅ m Figura 2.2: Demostración del Descifrado en RSA 2.1.5 Conclusiones. Las conclusiones tras el desarrollo y estudio de RSA, demuestran que como método criptográfico a implementar es bastante sencillo si se tienen los conocimientos de programación y bases criptográficas necesarias. Referente a las ventajas y desventajas, algunas de las cuales se comentaron en el Capítulo 1, apartado 1.3.1, se puntualizan en los subsecuentes renglones terminando con un esbozo que explica el uso actual de tal algoritmo. Las ventajas que dotan a RSA de entre las mejores elecciones para la protección y seguridad de datos, se deben a que dentro de los algoritmos asimétricos se muestra como el más rápido. A su vez gracias a las longitudes de claves usadas en la actualidad es prácticamente imposible romperlo, es decir, no hay tiempo ni recursos como para que sea factible. Su uso no requiere de claves secretas para el cifrado del mensaje, evitando -44-
  • 59. Capítulo 2: Algoritmos Criptográficos Desarrollados la intersección de terceros en el canal proporcionando. En el caso de trabajo junto a algoritmos simétricos habilita un medio seguro (véase Apartado 2.4, RSA Digital). Otro uso que también acomete es el firmado digital, evitando las suplantaciones de identidad. Permite además la detección de alteraciones y errores en la transmisión de documentos. Por todo ello, RSA conforma un estándar internacional y “de facto” en la industria del software. Sin embargo, cuenta con dos desventajas mínimas a destacar. La primera es propia de su grupo, pues al ser un algoritmo asimétrico es mucho más lento y complejo, precio que se paga a favor de un mayor aporte de seguridad. La segunda es la producida por el uso indebido de longitudes de clave pequeñas. Esto convierte al RSA en una simple herramienta de transposición, es decir, si (m)^e es menor a la longitud de la codificación ASCII, UNICODE… RSA no aporta seguridad. Para demostrar semejante desventaja se recurre al siguiente ejemplo: Con la base de codificación UTF22 para la representación de los caracteres a cifrar por RSA (en cuyo caso la máxima longitud representable sería 2^24) y del uso de una red pública que proporciona la clave pública e=3. Se quiere cifrar el mensaje en claro formado por los caracteres ‘a’,’b’ y ‘c’ (97,98,99 respectivamente usando UTF). El cifrado resulta (97)^3=912673, (98)^3=941192, (99)^3=970299, para cada uno de los cuales el valor numérico es menor que 2^24. Entonces sabiendo el exponente “e” (público) y el módulo “n” (público) se puede recuperar el mensaje sin necesidad de la clave privada “d”. Si la clave “e” hubiese sido por ejemplo 329, no se hubiese producido esa transposición pues se sale del máximo valor representable por la codificación y hubiese sido necesario aplicar el proceso de la Figura 2.2, el descifrado mediante “n” y “d”. Para concluir con este algoritmo criptográfico desarrollado, comentar que la utilización del sistema RSA está experimentando una rápida expansión y puede llegar a ser omnipresente en los próximos años. Hoy en día, se utiliza en una gran variedad de productos, plataformas e industrias del mundo entero. Se encuentra en productos comerciales de software y se planea una expansión mayor. RSA está incluido en sistemas Apple, Microsoft, Netscape, Novell, Sun…, actuales y futuros. En cuanto al hardware, el sistema RSA se puede encontrar en teléfonos seguros, en tarjetas de redes Ethernet y en tarjetas inteligentes. El RSA se utiliza también en muchos organismos estatales, grandes compañías, laboratorios y universidades. La adopción del sistema RSA parece utilizarse más rápidamente para autenticación (firmas digitales) que para una mayor privacidad (encriptado). Quizá, esto se deba a que los productos para autenticación son más fáciles de exportar. En los que se refiere a los estándares usados, el sistema RSA forma parte de muchos estándares oficiales en todo el mundo. El estándar ISO23 9796, incluye al RSA como un algoritmo criptográfico, como así también el CCITT24, mediante el estándar de seguridad X.509. También forma parte de los estándares de SWIFT25, de los estándares de ETEBAC 5 del sistema financiero francés y del 22 Forma de representar caracteres UNICODE e ISO/IEC 10646 como una serie de palabras de 16 y 24 bits. ISO, Organización Internacional de Estándares. 24 CCITT, Comité Internacional de Consulta en Telegrafía y Telefonía. 25 SWIFT, Sociedad para las Telecomunicaciones Financieras Interbancarias Mundiales. 23 -45-
  • 60. Aplicación Software para el Desarrollo de Tareas Criptográficas borrador del estándar ANSI X9.31 del sistema bancario estadounidense.También el estándar australiano de administración de claves, AS2805.6.5.3 especifica RSA. Otros estándares están en etapa de desarrollo y se anunciarán dentro de los próximos años. Se espera que muchos incluyan el RSA como sistema adicional o recomendado para autenticación y/o privacidad. 2.2 DES 2.2.1 Introducción. Como ya se ha comentado brevemente en las Fases de Trabajo (Apartado 1.3), el DES es un algoritmo simétrico cifrador de bloques que utiliza una clave secreta para todo que debe proporcionarse por un canal seguro. En este caso, el algoritmo toma la información en bloques de 64 bits produciendo un bloque de texto cifrado también de 64 bits (véase Apartado 2.2.3., Figura 2.4). Este sistema fue desarrollado por Horst Feistel, cuando trabajaba para IBM. Las claves utilizadas por DES son de 56 bits, aunque se suelen distribuir en forma de un número de 64 bits, donde cada octavo bit (el bit menos significativo) de cada uno de los ocho bytes de la clave es un bit de paridad (Figura 2.3). Byte 1 Byte 2 7 bits Byte 8 … 7 bits Paridad Paridad 7 bits Paridad Figura 2.3: Clave DES 2.2.2 Generación de Claves. La generación de claves del algoritmo DES, la cual tuvo su primera implementación en las primera aplicación DES desarrollada para consola, no tiene ningún secreto, pues restringiendo su longitud a 64 bits es la que el usuario desee. Esta clave es la que comúnmente se llamará clave original, a partir de la cual se generan una serie de subclaves de ronda distintas “Ki” (según el Cuadro de Código 2.8), que se irán combinando con la parte derecha expandida del bloque de mensaje según se muestra en la Figura 2.5 al final del Apartado 2.2.4 para obtener el bloque cifrado después de la inversión al final de la última ronda. Aunque para algunos lectores puede quedar explicado con los breves comentarios en las líneas de código y el uso de declaraciones intuitivas, el cuadro anterior deja muchas lagunas si no se esta acostumbrado a interpretar código. Se expresa de manera más detallada en los subsecuentes renglones, lo que se tradujo a nivel de programación de las tablas y expresiones presentadas en las referencias [B.R.1.1 y B.R.1.4-1.7]. -46-
  • 61. Capítulo 2: Algoritmos Criptográficos Desarrollados void MiDes::keygen(){//Partiendo de la clave[64] aplicamos una serie de permutaciones //Realizamos una permutación fija de clave[64] para distribuir todos los bits quedándonos solo //con 56 de estos (se descartan los de paridad), (pemutacionTipo1()) permutacionTipo1();//primera permutación. Obtenemos permuTipo1[56] int i,k=0; for(i=0;i<28;i++){//introducimos la primera mitad de permuTipo1[56] en mitadA_pT1[28] mitadA_pT1[i]=permuTipo1[i]; } for(i=28;i<56;i++){//introducimos la segunda mitad de en mitadA_pT1[28] mitadB_pT1[k]=permuTipo1[i]; permuTipo1[56] k++; } int desplazamiento=0,ronda; //Repetimos 16 veces, 16 rondas (característico DES), queremos una subclave para cada una for(ronda=1;ronda<=16;ronda++){//elegimos el desplazamiento según la ronda if(ronda==1||ronda==2||ronda==9||ronda==16) desplazamiento=1; else desplazamiento=2; while(desplazamiento>0){ int t; t=mitadA_pT1[0]; for(i=0;i<28;i++)//desplazamos hacia la izquierda la primera mitad mitadA_pT1[i]=mitadA_pT1[i+1]; mitadA_pT1[27]=t; t=mitadB_pT1[0]; for(i=0;i<28;i++)//desplazamos hacia la izquierda la segunda mitad mitadB_pT1[i]=mitadB_pT1[i+1]; mitadB_pT1[27]=t; desplazamiento--; } //De los 56 bits que forman mitadA_pT1[28] y mitadB_pT1[28] //se seleccionan 48 modificando su orden (permutacionTipo2()) permutacionTipo2();//segunda permutación. Obtenemos a[48] for(i=0;i<48;i++)//metemos la clave a[58] en cada ronda subClave[ronda-1][i]=a[i];//subClaves generadas } } Cuadro de Código 2.8: Generación de subClaves en DES Tal y como se introdujo al principio del apartado, en cada ronda se genera una subclave “Ki” distinta. Según el Cuadro de Código 2.8., con la primera permutación “permutacionTipo1()” de los 64 bit de la clave, se descartan los 8 bits de paridad quedando una clave de 56 bits. Esta se realiza mediante la Tabla 2.1. 57 49 41 33 25 17 09 01 58 50 42 34 26 18 10 02 59 51 43 35 27 19 11 03 60 52 44 36 63 55 47 39 31 23 15 07 62 54 46 38 30 22 14 06 61 53 45 37 29 21 13 05 28 20 12 04 Tabla 2.1: Permutación Tipo 1. -47-
  • 62. Aplicación Software para el Desarrollo de Tareas Criptográficas Se puede observar, que no aparecen los bits 8, 16, 24, 32, 40, 48, 56 ni 64, que son los que hacen la función de bits de paridad (Figura 2.3). La clave resultante se divide en dos mitades de 28 bits, “mitadA_pT1” y “mitadB_pT1” (véase Cuadro de Código 2.8), para luego alimentar unos registros que rotan hacia la izquierda según un número de bits que viene determinado por la ronda en la que se encuentra el proceso (recordar que en el DES existen 16 rondas). Este desplazamiento para las mitades es el contenido en la Tabla 2.2. Ronda 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Desplazamiento 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1 Tabla 2.2: Desplazamiento de “mitadA_pT1” y “mitadB_pT1”, según la ronda De los 56 bits resultantes se seleccionan 48 modificando su orden. Esta operación es denominada permutación de compresión y se adjunta en la Tabla 2.3. 14 17 11 24 01 05 03 28 15 06 21 10 23 19 12 04 26 08 16 07 27 20 13 02 41 52 31 37 47 55 30 40 51 45 33 48 44 49 39 56 34 53 46 42 50 36 29 32 Tabla 2.3: Permutación Tipo 2. En la salida de la permutación de compresión según el último bucle se obtiene la subclave ”Ki” de 48 bits correspondiente a la ronda i-ésima del algoritmo. 2.2.3 Cifrado. Para el cifrado el algoritmo se basa en una Red de Feistel delimitada entre la permutación inicial y final (Figura 2.4, mostrada al final de este apartado), la cual presenta la ventaja de ser reversible por lo que ya se puede adelantar que la función de descifrado será idéntica, requiriendo únicamente invertir el orden de las subclaves utilizadas. Así, una vez se haya entendido el cifrado, el descifrado no presentará mayores complicaciones. Se presenta en primer lugar la implementación en el Cuadro de Código 2.9, para luego pasar a su explicación en detalle y terminar con el diagrama de la parte propia del DES. Antes de empezar con el proceso de cifrado hay que tener en cuenta que solo se pueden coger bloques de 64 en 64 bits, por lo que el mensaje es necesario ir cogiéndolo trozo a trozo. Para este cometido se implementó el bucle principal a razón del tamaño del mensaje inicial. Una vez cogido el bloque hay que generar las subClaves de rondas necesarias mediante el método “keygen()” (Cuadro de Código 2.8). Todas las líneas anteriores a este método son para la definición de variables de alcance, tamaños de arrays y correcta finalización del -48-
  • 63. Capítulo 2: Algoritmos Criptográficos Desarrollados mensaje inicial. Tras generar las subClaves se pasa a la codificación del bloque del mensaje a binario pues este se encuentra como cadena de caracteres. Para ello una vez que es convertido a su expresión numérica en UNICODE se pasa de formato decimal a binario mediante divisiones por dos en la que se va guardando el resto. Obtenido el bloque de mensaje en binario ya es posible aplicarle el criptosistema DES (Figura 2.4). Lo primero que se realiza en la parte propiamente del algoritmo criptográfico es una permutación de los 64 bits del bloque de entrada, lo que a línea de código se puede identificar como “permutacionInicial()”. Realmente, esta permutación presentada en la Tabla 2.4., no añade seguridad alguna y su principal función es la de facilitar la carga de los bits de información en bloques de 8 bits a un chip especializado en DES26. Al final del algoritmo hay otra permutación que es la inversa de esta, lo que vuelve a dejar a los bits en su posición inicial. QStringList MiDes::encriptar(QString mensajeIni){ unsigned int m; int i,a1,j,nB,iB,k,K,B[8],n,d,ronda; //Para el encriptado int longitudEncriptado= (mensajeIni.size()/8)*8+8;// encriptamos en bloques de 8 int encriptado[longitudEncriptado];//array de enteros para almacenar el encriptado QStringList encriptadoList;//lista de QString para almacenar los números del Encriptado i=mensajeIni.size(); int mc=0; a1=i%8; if(a1!=0) for(j=0;j<8-a1;j++,i++) mensajeIni[i]=' '; mensajeIni[i]='0'; keygen();//generamos las subClaves de rondas //Repetimos (Longitud del Texto)/8 veces for(iB=0,nB=0,m=0;m<(mensajeIni.size()/8);m++){ for(iB=0,i=0;i<8;i++,nB++){ n= mensajeIni[nB].unicode(); for(K=7;n>=1;K--){ B[K]=n%2;//pasamos a Formato Binario, de 8-Bytes a 64-bits n/=2; } for(;K>=0;K--) B[K]=0; for(K=0;K<8;K++,iB++) mensajeEnBinario[iB]=B[K];/obtenemos mensajeEnBinario[64] } permutacionInicial();//hacemos la permutación inicial fija, permuInicial[64] //Copiamos permuInicial[64] en mensajeEnBinario[64] for(i=0;i<64;i++) mensajeEnBinario[i]=permuInicial[i]; //Dividimos mensajeEnBinario[64] en 2 partes for(i=0;i<32;i++) left[i]=mensajeEnBinario[i];//parte izquierda for(;i<64;i++) right[i-32]=mensajeEnBinario[i];//parte derecha Cuadro de Código 2.9: Cifrado DES (parte 1/2) 26 Debido a que el desarrollo del DES es anterior a los procesadores de 16 o 32 bits. -49-
  • 64. Aplicación Software para el Desarrollo de Tareas Criptográficas for(ronda=1;ronda<=16;ronda++){//Repetimos 16 veces, 16 rondas Expansion();//expandimos la parte derecha right[32], obtenemos expansion[48] xorTipo1E(ronda);//xor con expansion[48] y subClave[ronda-1][48], obtenemos xor1[48] sustitucion();//sustituimos xor1[48], obtenemos sus[32] permutacionP();//permutamos sus[32], obtenemos per[32] xorTipo2();//xor con la parte izquierda, left[32] y per[32], obtenemos xor2[32] //La parte de la derecha de esta ronda right[i] pasará a ser la parte izquierda de la //siguiente left[i] en ronda++ y el resultado de la XOR anterior, xor2[i] pasará a ser //la parte derecha de la ronda siguiente right[i] en ronda++ for(i=0;i<32;i++) left[i]=right[i]; for(i=0;i<32;i++) right[i]=xor2[i]; }//en la ultima ronda no se produce este entrecruce //Almacenamos ambas partes en temp[i] for(i=0;i<32;i++) temp[i]=right[i]; for(;i<64;i++) temp[i]=left[i-32]; inversa();//invertimos los bits de temp[64], obtenemos inv[8][8] //Mensaje Cifrado k=128;d=0; for(i=0;i<8;i++){ for(j=0;j<8;j++){ d=d+inv[i][j]*k; k=k/2; } encriptado[mc++]=d; k=128; d=0; } }//ya hemos encriptado todo el texto //Copiamos mi encriptado en un QStringList for(int i=0;i<mc;i++){ encriptadoList.insert(i,QString::number(encriptado[i])); }//si lo hacemos en el encriptado da error restaurarCPrivada(); return(encriptadoList); } Cuadro de Código 2.9: Cifrado (parte DES 2/2) 58 50 42 34 26 18 10 02 60 52 44 36 28 20 12 04 62 54 46 38 30 22 14 06 64 56 48 40 32 24 16 08 57 49 41 33 25 17 09 01 59 51 43 35 27 19 11 03 61 53 45 37 29 21 13 05 63 55 47 39 31 23 15 07 Tabla 2.4: Permutación Inicial -50-
  • 65. Capítulo 2: Algoritmos Criptográficos Desarrollados Esta tabla debe leerse de izquierda a derecha y de arriba a bajo. Esto quiere decir, que el primer bit a la salida de la permutación es el que en la entrada ocupa la posición 58; el segundo, el que ocupaba la 50; y así sucesivamente. Después de esta permutación inicial, los 64 bits resultantes se dividen en dos partes de 32 bits cada una: “left” y “right”. Partes que pasarán a la disposición de un bucle que se repite 16 veces aplicando una serie de transformaciones. La primera de las transformaciones que añade seguridad es a la que se hace referencia en el código con el nombre de “Expansion()”, este método coge la mitad derecha “right” (Ri) y la introduce en una función (f) donde es combinada con la subClave de ronda que se había generado. Mediante esta permutación de expansión, se expanden los 32 bits de “Ri” a 48 bits (repitiendo alguno de los bits) cambiando, además, su posición. Esto se hace para que este operando tenga el mismo tamaño que la subclave de la ronda, y además hace que los bits del criptograma dependan todavía con más fuerza de los bits de la entrada. Este hecho se conoce como el efecto avalancha: un pequeño cambio en el mensaje de entrada provoca grandes modificaciones en la secuencia de bits de salida. Las transformaciones a las que hace referencia esta permutación están presentadas en la Tabla 2.5. 32 01 02 03 04 05 04 05 06 07 08 09 08 09 10 11 12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25 24 25 26 27 28 29 28 29 30 31 32 01 Tabla 2.5: Permutación de Expansión El segundo método “xorTipo1E(ronda)” efectúa una simple XOR con el resultado anterior (f) y con la mitad izquierda del bloque de mensaje binario, “left” (Li). El tercer método “sustitucion()” introduce los 48 bits resultantes de la XOR entre la parte derecha “Ri” expandida y la subclave “Ki” y los introduce de seis en seis en ocho bloques que son conocidos como S-Box, de tal manera que el primer bloque de 6 bits se introduce en la S-Box 1, el segundo en la S-Box 2, y así sucesivamente. Como cada S-Box toma 6 bits como entrada y produce 4 bits como salida, al final obtenemos 32 bits (8 S-Box · 4 bits/S-Box = 32 bits). Cada S-Box es una tabla de cuatro filas y dieciséis columnas, donde cada posición de la tabla es un número de 4 bits. De los 6 bits de la entrada b1 b2 b3 b4 b5 b6, los bits b1 y b6 indican la fila, mientras que los otros cuatro indican la columna. Es decir, si la entrada de una S-Box es 35, esto en binario es 100011, lo que significa que hemos de tomar el valor de la fila 3 (11) y columna 1 (0001). El contenido de cada una de las S-Box es distinta del de las demás y se mantuvo en alto secreto por el gobierno de Estados Unidos hasta que el DES fue roto. Las llamadas S-Boxs encontradas en la referencia [B.R.1.6]. Se presenta como ejemplo la Tabla 2.6, correspondiente a la S-Box 1. El resto de tablas hasta la SBox 8, presentan el mismo formato. -51-
  • 66. Aplicación Software para el Desarrollo de Tareas Criptográficas 14 04 13 01 02 15 11 08 03 10 06 12 05 09 00 07 00 15 07 04 14 02 13 01 10 06 12 11 09 05 03 08 04 01 14 08 13 06 02 11 15 12 09 07 03 10 05 00 15 12 08 02 04 09 01 07 05 11 03 14 10 00 06 13 Tabla 2.6: S-Box 1 El cuarto método “permutacionP()”, se encarga de los 32 bits resultantes de la anterior operación, en esta transformación los bits son permutados otra vez (Tabla 2.7), pero esta vez no se eliminan ni añaden bits como se había hecho en las permutaciones de compresión y expansión. 16 07 20 21 29 12 28 17 01 15 23 26 05 18 31 10 02 08 24 14 32 27 03 09 19 13 30 06 22 11 04 25 Tabla 2.7: Permutación P Para finalizar la ronda, se ejecuta el método quinto, “xorTipo2()”, que coge la salida de la permutación P para alimentar una XOR en la que el otro operando es la parte izquierda “left” (Li). Si no se esta en la ronda 16, el resultado de la XOR anterior se convierte en la parte derecha de la siguiente ronda Ri+1, y la parte derecha de la ronda en la que estamos Ri pasará a ser la parte izquierda del siguiente Li+1. Y así sucesivamente hasta completar las 16 rondas. Este entrecruce se expone mediante las siguientes expresiones: Li+1=Ri (2.5) Ri+1= Li XORƒ(Ri ,ki) (2.6) La única excepción a este proceso está en la última ronda, en la que el entrecruce de las dos partes no se produce. Una vez fuera del bucle para las rondas característico del DES, la concatenación de L16 y R16 se introduce en una permutación final, que ya se había comentado al inicio de la explicación del algoritmo. Esta permutación es la inversa de la permutación inicial (Tabla 2.4) quedando de la manera que se muestra en la Tabla 2.8. 40 08 48 16 56 24 64 32 39 07 47 15 55 23 63 31 38 06 46 14 54 22 62 30 37 05 45 13 53 21 61 29 36 04 44 12 52 20 60 28 35 03 43 11 51 19 59 27 34 02 42 10 50 18 58 26 33 01 41 09 49 17 57 25 Tabla 2.8: Permutación Final (inversa de la Permutación Inicial) -52-
  • 67. Capítulo 2: Algoritmos Criptográficos Desarrollados Se podría haber hecho que en la ronda final se intercambiaran las partes derecha e izquierda, y adaptar la permutación final para que tuviera en cuenta este intercambio de más. Pero no se hizo porque de esta manera se puede utilizar el mismo algoritmo tanto para el cifrado como para el descifrado. De toda esta explicación sobre el Cuadro de Código 2.9, referente al cifrado DES y sus correspondientes ajustes de implementación, se presenta en la Figura 2.4 el diagrama referido al cifrado propiamente dicho, centrándose dentro del bucle para las rondas, en los entrecruces y en el uso de la función “f” explicada. Cada uno de los elementos que aparecen, han sido referenciados con anterioridad por lo que no debe suponer ninguna perdida, sino un resumen esquematizado que ayude a la comprensión del código. La parte central de la Figura 2.4, correspondiente a la incursión de la subclave de ronda en la función “f” a lo largo de las 16 vueltas, se detalla en la Figura 2.5. Para la cual también se ha visto conveniente desarrollar el esquema de generación de las subclaves de ronda (lado derecho), explicado con anterioridad en el Apartado 2.2.2. Haciendo referencia al código, en la figura se muestran “keygen()” y el bucle de rondas (con la ausencia de “xorTipo2()”), es decir, “Expansion()”, “xorTipo1E(ronda)”, ”sustitucion()” y “permutacionP()”. La figura puede suscitar que las subclaves se van obteniendo a medida que van siendo efectuadas las rondas en el bucle, lo que no es cierto, pues la ejecución de “keygen()” se finaliza en una fase anterior almacenando todas las subclaves para su posterior utilización con “xorTipo1()”. 2.2.4 Descifrado. El algoritmo de descifrado es el mismo que el de cifrado (véanse cuadros de código y figuras del Apartado 2.2.3), con la única matización de que las subclaves deben utilizarse en el orden inverso. Es decir, si en el algoritmo de cifrado las subclaves de cada ronda eran K1, K2,…, K16, en el descifrado las subclaves son K16, K15,..., K1, entendiendo que la primera subclave (K1 en el cifrado y K16 en el descifrado) es la que se utiliza en la primera ronda; la segunda subclave (K2 en el cifrado y K15 en el descifrado), en la segunda ronda, y así sucesivamente. Además, el algoritmo mediante el cual se generan las subclaves es circular. Así que para generar las subclaves necesarias para el descifrado, los registros de rotación en lugar de desplazar hacia la izquierda, lo deben hacer hacia la derecha y el número de desplazamientos viene dado por la Tabla 2.9. Ronda 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Desplazamiento 0 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1 Tabla 2.9: Desplazamiento de las mitades según la ronda para el descifrado 2.2.5 Conclusiones. Las conclusiones tras el desarrollo y estudio de DES, demuestran que como método criptográfico a implementar es bastante más complejo que RSA pese a utilizar operaciones más sencillas. El problema no reside en la base -53-
  • 68. Aplicación Software para el Desarrollo de Tareas Criptográficas criptográfica sino en el aumento de líneas de código, ya que en programación aumentan los descuidos según aumenta el número de horas y “líneas picadas” a lo que se suma la dificultad para encontrarlos si no se detectan por el compilador. Referente a las ventajas, algunas de las cuales se comentaron en el Capítulo 1, apartado 1.3.1, se puntualizan en los subsecuentes renglones terminando con la descripción de las desventajas que lo llevaron a su desuso. Las ventajas que posee DES, son aquellas mismas que en sus tiempos lo hicieron estar a la cabeza de la criptografía, es decir, la facilidad que posee para su implementación hardware proporcionada por la sencillez de las operaciones que utiliza en su cifrado y descifrado. Operaciones como las permutaciones, que se pueden conseguir simplemente cambiando el orden de las pistas; el uso de las XORs, las cuales disponen de circuitos integrados que ejecutan dicha función; o el recurrido indexado de tablas, que puede conseguirse mediante ROM's. Esta cualidad junto con su uso de eficiencia en aplicaciones en las que la latencia es un factor importante, así como la robustez de su sistema que hacen que la seguridad no dependa del conocimiento del algoritmo si no de clave, terminaron por llevarlo a la base en la seguridad de algunos gobiernos. Sin embargo, cuenta con grandes desventajas. Entre ellas la existencia de claves débiles (Tabla 2.10). Pues debido al modo en el que se generan las subclaves para las diferentes rondas, existen una serie de claves que no son aptas para ser utilizadas. Las primeras de estas claves son conocidas como claves débiles. La debilidad de estas claves es que todos los bits de cada una de las dos mitades que entran en los registros de rotación son todo unos o todo ceros. Entonces, por mucho que se roten estas palabras de bits, siempre se obtendrá la misma subclave. Claves Débiles Subclave 101010101010101 0000000 0000000 1F1F1F1F0E0E0E0E 0000000 FFFFFFF E0E0E0E0F1F1F1F1 FFFFFFF 0000000 FEFEFEFEFEFEFEFE FFFFFFF FFFFFFF Tabla 2.10: Mismas subclaves para cada Clave Débil ´ También es posible encontrar pares de claves de tal manera que el criptograma generado por una de las claves del par puede ser descifrado por la otra clave. O lo que es lo mismo, las dos claves del par generan el mismo criptograma a partir del mismo texto en claro. Esto se debe a que esas claves, en lugar de generar 16 subclaves distintas, sólo generan dos subclaves, y cada una es usada ocho veces. A estas claves se le llaman claves semidébiles y existen 12 claves que cumplen esta condición. Para finalizar, existen otras claves que producen únicamente cuatro subclaves distintas, que son usadas cuatro veces cada una. Estas son conocidas como claves posiblemente débiles. De este tipo de claves, existen 48. Pero a pesar de la existencia de estas 64 claves débiles (4 + 12 + 48), hay que decir que -54-
  • 69. Capítulo 2: Algoritmos Criptográficos Desarrollados son una minúscula porción de las 256 = 72.057.594.037.927.936 claves que puede utilizar el DES. No obstante con la fuerza de computo de hoy en día el DES por si solo ya no es seguro, su longitud de clave se ha quedado insuficiente. Es por este ultimo detalle que desde que se rompió el DES, empezó a caer en desuso. Figura 2.4: Cifrado en DES -55-
  • 70. Aplicación Software para el Desarrollo de Tareas Criptográficas Figura 2.5: Esquema de la función (f) y la generación de las subclaves -56-
  • 71. Capítulo 2: Algoritmos Criptográficos Desarrollados 2.3 Triple – DES 2.3.1.- Introducción. TDES fue desarrollado por IBM, consecuencia directa de su antecesor, el DES. Básicamente se puede resumir como la triple aplicación del DES. No llega a ser un cifrado múltiple, porque no son independientes todas las subclases. Este hecho se basa en que DES tiene la característica matemática de no ser un grupo, lo que implica que si se cifra el mismo bloque dos veces con dos claves diferentes se aumenta el tamaño efectivo de la clave. Conocidos los entresijos del DES, desarrollados en Apartado 2.2, el TDES no presentará problema alguno, pues todos los algoritmos usados son los mismos, únicamente se hacen algunas adiciones en el encriptado y el desencriptado DES, como consecuencia directa de su triple aplicación así como un cambio pertinente en la gestión de clave que permita la nueva longitud (192 bits = 3*64). 2.3.2.- Cifrado y Descifrado. La variante más simple de TDES, es la que se ha implementado, mostrándose únicamente las partes que han cambiado con respecto a DES (Cuadros de Código 2.10 y 2.11). Para su definición en el cifrado, se tiene la expresión: K3 K2 K1 c ≡ E DES ( E DES ( E DES ( M ))) (2.7) Para el descifrado el proceso es el mismo, solo que el orden al colocar las claves es el inverso. Véase la Figura 2.6, para ambos. for(int vuelta=0;vuelta<3;vuelta++){//vamos cogiendo parte de la claveT y coligándola switch(vuelta){ case 0: for(i=0;i<64;i++) clave[i]=claveT[i]; break; case 1: for(i=64;i<128;i++) clave[i-64]=claveT[i]; break; case 2: for(i=128;i<192;i++) clave[i-128]=claveT[i]; break; } Cuadro de Código 2.10: Adición al principio del cifrado DES para conformar TDES Como se puede observar en el Cuadro 2.10 ha sido necesaria la declaración de una nuevo array denominado “claveT[i]”. Este contiene la clave original y con su ayuda se sustrae lo que seria la clave inicial en DES, para luego continuar con el proceso según se explico en el Apartado 2.2. -57-
  • 72. Aplicación Software para el Desarrollo de Tareas Criptográficas mensajeIni.clear();//Borramos para encriptar ahora el texto encriptado for(int i=0;i<mc;i++){ mensajeIni.append(QChar(encriptado[i]));//ahora el mensaje es este if(vuelta==2) encriptadoList.insert(i,QString::number(encriptado[i]));//copiamos mi encriptado } Cuadro de Código 2.11: Adición al final del cifrado DES para conformar TDES Con Cuadro de Código 2.11, se hace referencia a la adición necesaria al final del proceso, pues con cada vuelta en TDES, habrá que ir adjuntando el cifrado y limpiando la variable usada. El resultado de la transformación del mensaje no se devolverá hasta no haberlo cifrado tres veces consecutivas con claves diferentes. Una última nota acerca del Cuadro de Código 2.11, es el hecho de que esta implementación posibilita la supresión de huecos de desplazamiento que surgían al pasar a cadena de carácter los bloques de 64 bits (problema comentado en el Apartado de las Fases de Trabajo). 2.3.3.- Conclusiones. Las conclusiones tras el desarrollo y estudio de TDES, demuestran que como método criptográfico a implementar es muy sencillo partiendo de la reutilización de su antecesor, el DES. Y si este funciona perfectamente, también lo hará su triple aplicación. Referente a las ventajas, algunas de las cuales se comentaron en el Capítulo 1, Apartado 1.3.4, se puntualizan en los subsecuentes renglones terminando con la descripción de las desventajas que lo están llevando poco a poco a su desuso. Cuando se descubrió que una clave de 56 bits no era suficiente para evitar un ataque de fuerza bruta, TDES fue elegido como forma de agrandar el largo de la clave sin necesidad de cambiar de algoritmo de cifrado. Este método de cifrado es inmune al ataque por encuentro a medio camino, doblando la longitud efectiva de la clave, pero en cambio es preciso triplicar el número de operaciones de cifrado, haciendo este método muchísimo más seguro que el DES. Sin embargo está desapareciendo lentamente, siendo reemplazado por el algoritmo AES (Apéndice C, Apartado 2), pese a que la mayoría de las tarjeta de crédito y otros medios de pago electrónico tienen como estándar el algoritmo Triple DES (anteriormente usaban el DES). Por el diseño de DES y por lo tanto también el de TDES, estos sistemas son lentos, dentro de los criptosistemas asimétricos y si se compara con AES, este último puede llegar a ser hasta 6 veces más rápido y a día de hoy aun no se encontró ninguna vulnerabilidad. -58-
  • 73. Capítulo 2: Algoritmos Criptográficos Desarrollados Figura 2.6: Esquema del algoritmo Triple DES -59-
  • 74. Aplicación Software para el Desarrollo de Tareas Criptográficas 2.4 RSA Digital 2.4.1. Introducción. Habiéndose explicado el sistema RSA, DES y TDES, puede suscitar que sea obligatorio escoger una de las dos alternativa, simétrica o asimétrica, reemplazando una por otra según el caso que más convenga al usuario. Pero nada más desencaminado, pues gracias a la implementación de la posibilidad de elegir RSAD, se permite el uso conjunto de ambos, lo que los complementa solventando sus mayores deficiencias. El DES proporcionará cifrado para encriptado masivo de datos mientras que el RSA creará un medio seguro de comunicaciones. El RSA agrega dos funciones importantes que no proporciona el sistema DES: el intercambio seguro de claves sin un previo intercambio de claves secretas y la firma digital que verifica que el transmisor dice ser quien es. Para encriptar mensajes, se utiliza RSA y DES en combinación según se pasa a explicar a continuación. En primer lugar se encripta el mensaje con una clave DES elegida por el transmisor. Antes de enviarlo por un medio poco seguro, se encripta la clave DES por medio del RSA. Para finalizar, se envían juntos, el mensaje DES encriptado y la clave DES encriptada a través del RSA. Este protocolo se conoce como RSA Digital y en CriptoYenet a parte de la implementación con DES se ha ofrecido la posibilidad de elegir también TDES. Se podría preguntar el motivo por el cual no se utiliza el sistema RSA para encriptar el mensaje directamente y así evitar el uso del sistema DES. Aunque podría aplicarse a mensajes cortos, el DES (u otro sistema de encriptado) es preferible en el caso de un mensaje largo ya que es mucho más veloz que el RSA. En algunas situaciones, RSA no es necesario y basta con DES. Esto incluye a los entornos con multiusuarios donde es posible intercambiar claves DES en forma segura, por ejemplo, si ambas partes se reúnen en privado. El sistema RSA es poco necesario en un entorno con un solo usuario, por ejemplo, si se desea mantener encriptados los archivos personales, solo se necesita el sistema DES. El RSA y la criptografía con clave pública, en general, se aplican mejor en entornos con multiusuarios. Cualquier sistema que utilice firmas digitales necesita del RSA o de algún otro sistema con clave pública. Es verdad que se ha comentado que el DES no es seguro, pero también depende de la reutilización de claves que se haga y de las necesidades del usuario. Es decir, un ataque no es algo inmediato y si a esto se añade el desconocimiento del algoritmo y del uso que hace de este un particular, la seguridad es la adecuada (aunque no infranqueable). Una opción recomendada y probablemente la mejor que deba existir y que se menciona entre las posibles líneas futuras de CriptoYenet (Capítulo 4) seria el uso de AES (irrompible hasta la fecha y 6 veces más rápido que DES) junto con RSA. -60-
  • 75. Capítulo 2: Algoritmos Criptográficos Desarrollados 2.4.2. Cifrado y Descifrado. Para el cifrado y el descifrado la utilización de RSA Digital como protocolo para utilizar en la práctica esta muy extendido, refiriéndose al paquete formado por la clave y el mensaje como “sobre digital RSA. Aunque ya se ha comentado el protocolo, a continuación se reitera su explicación de manera detallada para el uso de dos usuarios (A y B) identificando las claves. El contexto es el siguiente: El usuario A (transmisor) desea enviar un mensaje encriptado al usuario B (receptor). Para ello elige una clave privada al azar (clave en DES) con la que cifrar el mensaje. Dicha clave es encriptada con la clave pública de B (exponente “e” en RSA), la cual esta presente en una red pública. El mensaje encriptado mediante el sistema DES y la clave DES encriptada mediante el sistema RSA, forman el sobre digital RSA y se envían al usuario B. Una vez recibido el sobre digital, B desencripta la clave DES con su clave privada (exponente “d” en RSA) y luego utiliza esa clave DES para desencriptar el mensaje. Este proceso ha sido implementado dentro de la clase “micriptosistema” (véase Cuadro de Código 1.7), encaminando tal y como se acaba de detallar el uso de las clases de los criptosistemas implementados que utiliza a excepción de cifrar el mensaje primero, cosa que se deja para el final anteponiendo el encriptado asimétrico de la clave simétrica. Este cambio, sin consecuencias en el protocolo, se realizó para que confluyera con el resto de procesos en el que únicamente al final se muestra el resultado de la operación criptográfica. 2.4.3. Firmado Digital. Aunque no es propósito de CriptoYenet, merece la pena comentar el uso de RSA como firma digital, pues como ya se ha comentado en varias ocasiones este tipo de uso esta muy extendido y a decir verdad, aunque no este implementado en si, el firmado digital esta presentado con el sobre RSA Digital, pues solo el usuario B se identifica con la clave privada “d” de B. Para entender mejor esto véase el siguiente ejemplo en el que el usuario A desea enviar un mensaje firmado al usuario B. En primer lugar el usuario A hace un resumen del mensaje27 que usará como firma y lo encripta con su clave privada (exponente “d”), formando la firma digital que enviará junto con el mensaje al usuario B. Este recibe la firma digital y la desencripta con la clave pública de A (exponente “e”) luego hace un resumen del mensaje con la misma función utilizada por A y lo compara con el descifrado. Si son iguales, la firma queda verificada y se puede comprobar que el mensaje proviene de A. Si no son iguales el mensaje no fue enviado por A, es falso. Se debe tener en cuenta que para la autenticación o firma digital, los roles 27 Los resúmenes del mensaje que se hacen para utilización como huella digital son realizados por lo que se conoce como funciones de “hash”. Se debe aclarar que no es probable que alguien encuentre un mensaje cuyo "hash" arroje un valor predeterminado o dos mensajes cuyos "hash" arrojen el mismo valor. Si alguna de estas alternativas fuera posible, un intruso podría adjuntar un mensaje falso a la firma de A. Las funciones de "hash" como MD4 y MD5 se han diseñado específicamente para demostrar que encontrar un número duplicado es casi imposible y se las considera apropiadas para utilizarlas en criptografía. -61-
  • 76. Aplicación Software para el Desarrollo de Tareas Criptográficas de las claves pública y privada son los opuestos que en el encriptado, donde la clave pública se utiliza para encriptar y la privada para desencriptar. En la práctica, el exponente público es mucho menor que el exponente privado. Esto significa que la verificación de una firma se efectúa más rápidamente que la firma misma. Es mejor así, ya que un mensaje o documento será firmado por un individuo una vez, en cambio, la firma será verificada varias veces. Para aumentar la fiabilidad, la firma digital puede estar acompañada por uno o más certificados28. Su propósito es evitar que una persona se haga pasar por otra utilizando una clave pública fraudulentamente registrada por ésta en nombre de otro. Si se incluye un certificado, el receptor del mensaje (o un tercero) puede comprobar la autenticidad de la clave pública del mensaje, presuponiendo que la clave pública es confiable. En lo que se refiere a la detección de alteraciones y errores. Una firma digital RSA es superior a una firma manuscrita ya que atestigua el contenido del mensaje y, al mismo tiempo, la identidad del firmante. Siempre que se utilice la función segura de "hash", no hay posibilidades de quitarle la firma a un documento y adjuntársela a otro o de alterar el mensaje firmado. El más mínimo cambio en un documento firmado hará fracasar el proceso de verificación de la firma digital. El sistema de autenticación RSA permite verificar la integridad de un documento firmado. Por supuesto, si la verificación de la firma falla, no quedará claro si hubo un intento de fraguarla o si se trató de un mero error en la transmisión de la información. 2.4.3. Conclusiones. Las conclusiones tras el desarrollo y estudio de RSAD, demuestran que como protocolo criptográfico a implementar solo consta de algoritmos para el correcto encaminamiento y uso de las clases de los criptositemas RSA, DES y TDES, resultando sencilla su programación. Referente a las ventajas, algunas de las cuales se comentado repetidamente a lo largo de los capítulos anteriores, se resumen en los siguientes renglones terminando con la descripción de las desventajas que lo están llevando poco a poco a su desuso. Las ventajas que posee RSAD son debidas al uso conjunto de RSA y DES, que solventa sus inconvenientes por separado, es decir, se evita por completo el problema del intercambio de claves en DES proporcionando un canal seguro para la clave con RSA. Una vez obtenida la clave en el receptor se produce una comunicación segura y privada mediante DES que resulta más rápida que si la hiciéramos directamente con RSA. También utilizando solo RSA aparte de ser el proceso más lento, las claves deberían ser de mayor tamaño que en DES y los mensajes cifrados ocuparían más espacio que los mensajes en claro. Antes se comentaba como posible inconveniente que el DES se había roto (concretamente cuando lo hicieron 1999 tardaron dos días) mediante clusters 28 Un certificado es un documento firmado que atestigua la identidad del firmante y su clave pública. -62-
  • 77. Capítulo 2: Algoritmos Criptográficos Desarrollados esto quiere decir que en una comunicación real mediante ordenadores convencionales no supondría ningún problema de seguridad y más aún cuando la clave se renueva por mensaje. Para finalizar decir que las famosas topologías usadas en SSL (Secure Sockets Layer) y PGP (Pretty Good Privacy) para proporcionar comunicaciones seguras en Internet hacen lo mismo, aprovechan las ventajas de combinar los algoritmos simétricos y asimétricos. 2.5 Gestión de Claves de los Algoritmos Desarrollados. 2.5.1.- Introducción. Tras haber explicado como se han implementado los algoritmos, ya solo queda referirse a la gestión de claves (Figura 1.8, Parte inferior del Nivel 2), de la que se pretende mostrar y explicar las partes del código más relevantes. Existen básicamente tres gestiones, una para el algoritmo asimétrico, otra para los simétricos y la del protocolo. Si se comparan a nivel de programación, RSA resulto ser más fácil de implementar como método que DES, sin embargo su gestión para las claves es más compleja. Y al contrario, el tiempo empleado para el desarrollo de DES tuvo su recompensa con una gestión de claves casi inmediata. 2.5.2.- Gestión de claves en RSA. La gestión de claves en RSA configurada por diálogos en los que las claves se pasan por señales (Cuadro de Código 2.12) y de la cual ya se comentó su generación, es la más compleja de todas, reflejándose en las distintas posibilidades de enrutamiento disponibles en la Figura 1.9. Tal y como se puede apreciar en el Cuadro de Código 2.12, el cual muestra la parte del diálogo únicamente para el encriptado. Se crea el diálogo del Nivel 2 (Figura 1.9 y Figura 1.8 en la parte izquierda) que proporciona el Nivel 3 para las entradas de las claves en RSA. Estas señales encargadas de proporcionar las claves son: “generadas(mpz_class, mpz_class)”, que crea paso a paso a partir de números primos las claves; “introducidas(mpz_class, mpz_class)”, que reciben por entrada del teclado las claves que ha decidido el usuario; “exportadas(mpz_class, mpz_class)”, que usa la carga de un archivo de claves; y por último está la señal declarada como “usadasSesion (mpz_class, mpz_class)”, que proporciona las claves que se han seleccionado de una lista de las que se han ido utilizando desde el inicio de la ejecución de la aplicación. Todas y cada una se conectan con el Cuadro de Código 2.13 (para este caso protocoloRSAD = falso, pues estamos en RSA). A su vez el uso de cualquiera de estas activa una señal que se encarga de ir registrándolas para su posterior almacenamiento en archivo. Para el caso del descifrado el cual es idéntico, exceptuando el paso de la -63-
  • 78. Aplicación Software para el Desarrollo de Tareas Criptográficas clave privada, es necesario activarlo, ya que por defecto encripta. Con el desencriptado se hace una nueva conexión para el Cuadro de Código 2.14. Todas y cada una de estas señales a su vez requieren de otros diálogos (se continua bajando de nivel) los cuales permiten el seleccionamiento correcto de la clave o la derivación en más diálogos contenidos, caso del descifrado en el que se llega al Nivel 5. void MiCriptosistema::crearDiálogoRSA(){ rsa= new MiRsa; listaCPsRSA= new QStringList; //Esta variable me permite encriptar/desesencriptar la clave privada Simétrica en vez del texto protocoloRSAD=false;//por defecto tenemos desactivado el protocolo RSA Digital, //Diálogo Encriptar dEncriptarRSA= new MiGeneCargOSesiRSA;//diálogo para generar, cargar o usar sesión dEncriptarRSA->ponerNombre(tr("Encriptando con RSA - Elija opción para claves:")); dEncriptarRSA->setBoolDesencriptar(false);//ponemos modo encriptar (modo por defecto) //CPs connect(dEncriptarRSA, SIGNAL(generadas(mpz_class, mpz_class)), this, SLOT(ponerClavesPúblicasRSA(mpz_class, mpz_class))); connect(dEncriptarRSA, SIGNAL(introducidas(mpz_class, mpz_class)), this, SLOT(ponerClavesPúblicasRSA(mpz_class, mpz_class))); connect(dEncriptarRSA, SIGNAL(exportadas(mpz_class, mpz_class)), this, SLOT(ponerClavesPúblicasRSA(mpz_class, mpz_class))); connect(dEncriptarRSA, SIGNAL(usadasSesion(mpz_class, mpz_class)), this, SLOT(ponerClavesPúblicasRSA(mpz_class, mpz_class))); connect(dEncriptarRSA, SIGNAL(dameCPsLista()), this, SLOT(darListaClavesPúblicasRSA())); connect(this, SIGNAL(tomaCPsListaRSA(QStringList*)), dEncriptarRSA, SIGNAL(tomaCPsLista(QStringList*))); //Para abandonar todo el proceso connect(dEncriptarRSA, SIGNAL(abandona()), this, SLOT(abandonar())); Cuadro de Código 2.12: Diálogo de Encriptado para la Gestión de Claves en RSA Se a de aclarar que todos los registros realizados son únicamente para el par público de claves, así como el almacenamiento en un archivo para su posterior colocación en una red pública (parte fundamental del proceso para la comunicación). No se registra, ni almacena la clave privada por cuestiones de seguridad de acceso. En principio puede parecer lógico, pero muchos programas almacenan estas en lugares y de modos concretos pudiendo ser encontradas por los que conocen sus entresijos, y aunque esta se protegiese siempre tendría que existir al final en algún lugar una clave privada en claro (por ejemplo, el caso de RSA Digital), es por todo esto que se ha dejado el almacenamiento de la clave privada a decisión libre del usuario. -64-
  • 79. Capítulo 2: Algoritmos Criptográficos Desarrollados void MiCriptosistema::ponerClavesPúblicasRSA(mpz_class n, mpz_class e){ QString clavesPúblicasRSA; /*Codigo referente al formato a seguir en el archivo elegido para clavesPúblicasRSA*/ listaCPsRSA->append(clavesPúblicasRSA); //Colocamos los valores de las claves públicas en RSA rsa->n=n; rsa->e=e; if(encriptar){//ya tenemos n y e podemos encriptar if(protocoloRSAD){//si estamos trabajando con la cPrivada Simétrica en vez de con el texto posibleGuardarClaveRSAD();//Encriptamos y guardamos la clave priv simétrica con RSA mpz_class cPrivi; bool ok; //Carga con control de errores ok=(cPrivi.set_str(cPrivadaSimetricaRSAD.toAscii().data(),10)==0)&&(cPrivi>=0); if(ok){//si no ha habido problemas, es que tenemos la clave desencriptada switch(algoritmo){//según sea DES o TDES case 1: des->adaptarDefinidaOk(cPrivi);emit(encripta()); break; case 2: tDes->adaptarDefinidaOk(cPrivi);emit(encripta()); break; }//si no es ninguno de los dos no se encriptará //emit(encripta()) no activa RSA en este caso pq estamos en RSA Digital }else{/*Código referente a aviso de errores*/} }else{ emit(encripta());//Emitimos señal correspondiente} }else{//falta d, emitimos desencripta() cuando pongamos la clavePrivada} } Cuadro de Código 2.13: Entrada del par de Claves Públicas de RSA y gestiones según se haya habilitado RSA Digital. void MiCriptosistema::ponerClavePrivadaRSA(mpz_class d){ rsa->d= d;//ya tenemos d if(protocoloRSAD){//si estamos trabajando con la cPrivada Simétrica en vez de con el texto bool ok; //Desencriptamos o Encriptamos con RSA la clave Simétrica cifrada mpz_class cPrivi; //Carga con control de errores ok=(cPrivi.set_str(desencriptarRSA(cPrividaSimetricaRSADCifrada).toAscii().data(),10)==0)& &(cPrivi>=0); if(ok){//si no ha habido problemas, es que tenemos la clave desencriptada switch(algoritmo){//según sea DES o TDES case 1: des->adaptarDefinidaOk(cPrivi);emit(desencripta()); break; case 2: tDes->adaptarDefinidaOk(cPrivi);emit(desencripta()); break; }//si no es ninguno de los dos no se desencriptará //emit(desencripta()) no activa RSA en este caso pq estamos en RSA Digital }else{/*Código referente a aviso de errores*/} }else{emit(desencripta());//Emitimos señal correspondiente} } Cuadro de Código 2.14: Entrada de la Clave Privada de RSA y gestiones según se haya habilitado RSA Digital. -65-
  • 80. Aplicación Software para el Desarrollo de Tareas Criptográficas 2.5.3.- Gestión de claves en DES y TDES. La gestión de la clave en DES y TDES, también esta configurada por diálogos y señales (Cuadro de Código 2.15), pero a diferencia del resto de gestiones, esta es la más sencilla, reflejándose en las distintas posibilidades de enrutamiento disponibles en la Figura 1.9 (véase también Figura 1.8 en su parte central inferior). No presenta una función de generación, simplemente el usuario decide si quiere utilizar una clave interna (señal “interna()”) o si desea introducir una por teclado (“cPrivada(mpz_class)”). La primera señal permitirá la encriptación de manera inmediata mientras que para el segundo caso será necesaria comprobaciones y su colocación en el algoritmo. El código presentado en el Cuadro de Código 2.15 expone únicamente la parte para el cifrado DES, ya que el descifrado es igual. En TDES la creación es la misma únicamente cambia el puntero a la clase del criptosistema que en este caso refiere a TDES en vez de a DES y los diálogos derivados, es decir, aquellos de donde se obtiene la señal29. void MiCriptosistema::crearDiálogoDES(){ des= new MiDes; //Diálogo Encriptar dEncriptarDES= new MiDefinirOInteriorDES; dEncriptarDES->ponerNombre(tr("Encriptando con DES - Elija opción para clave:")); dEncriptarDES->setBoolDesencriptar(false);//ponemos modo encriptar (modo por defecto) //cPrivada connect(dEncriptarDES, SIGNAL(interna()), this, SIGNAL(encripta())); connect(dEncriptarDES, SIGNAL(cPrivada(mpz_class)), this, SLOT(ponerClavePrivadaDES(mpz_class))); //Para abandonar todo el proceso connect(dEncriptarDES, SIGNAL(abandona()), this, SLOT(abandonar())); Cuadro de Código 2.15: Diálogo de Encriptado para la Gestión de la Clave en DES. La parte a la que se conecta “cPrivada(mpz_class)”, es decir, ponerClavePrivadaDES(mpz_class), solo introduce la clave y emite la señal para el encriptado tal cual se hace en el Cuadro de Código 2.14 para RSA (el cual se a dejado por que además de servir para referencias como esta, se le hacen llamadas para la mayoría de su líneas desde el siguiente apartado, la Gestión en RSAD). 2.5.4.- Gestión de claves en RSA Digital. La gestión de claves en RSA Digital, nuevamente esta configurada por diálogos y señales (Cuadro de Código 2.16), pero en este caso la implementación 29 La notación que hace Qt para conectar señales y métodos (en este caso slots) de distintas clases esta muy extendida en la programación, de hecho ellos no fueron los pioneros. Lo que se hace es mediante una función enlazar lo que se desea, lo que con un ejemplo en pseudolenguaje sería: conectar(del objetoA, la señal abrir, con el método del objetoB, puerta ) -66-
  • 81. Capítulo 2: Algoritmos Criptográficos Desarrollados esta dividida en dos partes claramente diferenciadas: una similar a la gestión del apartado anterior (2.5.3) que permite elegir entre DES y TDES y otra que hace uso de las gestiones RSA (Apartados 2.5.2). Las distintas posibilidades de enrutamiento disponibles en RSAD se pueden observar en la Figura 1.9 (véase también Figura 1.8 parte inferior derecha para la primera parte de la gestión). Según el Cuadro de Código 2.16 al usuario se le posibilita la capacidad de elegir entre DES y TDES a la hora de escoger una clave privada para las comunicaciones (primera parte de la gestión RSAD). En el momento que este escoge uno de los caminos y se ajusta la clave, se produce una llamada a RSA en cuyas gestiones de claves la mayor parte del código esta dedicado a la gestión del protocolo RSAD. void MiCriptosistema::crearDiálogoRSADigital(){ //Diálogo Encriptar dEncriptarRSADigital= new MiDESOTDES; dEncriptarRSADigital->ponerNombre(tr("Encriptando con RSA Digital - Elija algoritmo:")); dEncriptarRSADigital->setBoolDesencriptar(false);// modo encriptar (modo por defecto) //cPrivada connect(dEncriptarRSADigital, SIGNAL(cPrivadaDES(QString)), this, SLOT(cPrivadaDESRSAD(QString))); connect(dEncriptarRSADigital, SIGNAL(cPrivadaTDES(QString)), this, SLOT(cPrivadaTDESRSAD(QString))); //Para abandonar todo el proceso connect(dEncriptarRSADigital, SIGNAL(abandona()), this, SLOT(abandonar())); Cuadro de Código 2.16: Diálogo de Encriptado para la Gestión de la Clave en RSAD (Primera parte de la gestión). Para la segunda parte de la gestión intervienen los Cuadros de Código 2.13 de RSA. En este caso con “protocoloRSAD=verdadero” se encargará en primer lugar de guardar en archivo la clave privada selecciona en la primera parte y encriptarla con RSA. Luego también se encripta el mensaje con esta misma clave DES o TDES. En la parte del desencriptado el proceso es el mismo en la primera parte de gestión, únicamente que ahora se carga el archivo guardado con la clave cifrada en vez de escribirlo. Para la segunda parte el cambio es exactamente el mismo que en RSA al desencriptar, ya que se usa su Cuadro de Código 2.14. Recapitulando se tiene que en la primera fase de gestión RSAD el encriptado y el desencriptado son procesos idénticos al igual que ocurría en DES-TDES pero sin la existencia de la elección de una clave interna y con la carga desde archivo en vez de introducción por el teclado en el caso del desencriptado. Para la segunda fase de gestión si existe diferencias al igual que con RSA, en está ultima gestión se guarda la clave o recupera y se cifra el mensaje o descifra según se este encriptando o desencriptando RSAD. -67-
  • 82. Aplicación Software para el Desarrollo de Tareas Criptográficas La implementación del protocolo RSAD esta básicamente en su gestión de claves y enrutamiento, pues se hace valer de las gestiones anteriores y los criptosistemas desarrollados. -68-
  • 83. CAPÍTULO 3 - Descripción de la Aplicación -
  • 85. Proyecto Fin de Carrera Capítulo 3: Descripción de la Aplicación CAPÍTULO 3 – Descripción de la Aplicación. La creación de RSA, DES, TDES y RSAD descrita en el capítulo anterior no fue una fase aislada sino que estuvo ligada íntegramente al desarrollo de la interfaz, siendo la parte de gestión de las claves la más determinante para esta. En este capítulo no se hará alusión alguna al código fuente de la interfaz principal (clase “miproject”) por tratarse del aspecto y manejo de la aplicación (nivel superior por encima del criptográfico, véase Figura 1.8) únicamente se deja la declaración descrita anteriormente sobre esta base en el Cuadro de Código 1.6 para ir constatando con algunas de las figuras presentadas que acompañan a las descripciones de CriptoYenet. 3.1 Introducción. Aunque el funcionamiento es muy intuitivo, se pretende explicarlo a través de las distintas partes que conforman la interfaz con el usuario: la pantalla principal que se sitúa en el ámbito de la clase “miproject”, el menú algoritmo criptográfico que se sitúa en el ámbito de la clase “micriptosistema” y los menús de cada uno de ellos, menú RSA, DES, TDES y RSAD que se sitúan dentro del ámbito de las clases de gestión de claves y que conectan con las respectivas clases de los algoritmos criptográficos por medio de la clase “micriptosistema”. 3.2. Pantalla principal. La pantalla principal es la estructura base que se le presenta al usuario en el momento de iniciar la aplicación. Consta de los elementos básicos característicos de la mayoría de programas de escritorio, proporcionando cierto conocimiento sobre donde pueden estar las opciones necesarias de CriptoYenet, estos elementos son: la Barra de Menús, la Barra de Herramientas, el Área de Trabajo y la Barra de Estado (Figura 3.1). El área de trabajo es una hoja de texto que se encuentra en la parte central y sobre la que actúan una serie de herramientas y procesos (Figura 3.2). El usuario puede escribir texto en esta para después realizar copias, pegados, cortes, cifrados o descifrados de una selección aleatoria30, de palabras (mediante doble clic), de texto entre saltos de línea (mediante triple clic) o de todo el documento (mediante la selección disponible en el menú editar). También se permite exportar texto con o sin formatos desde otros software a CriptoYenet, habilitando la compatibilidad para visualizarlos el formato en los casos simples de colores, tipos de letra, subrayados... siendo únicamente en la necesidad de querer cifrar o descifrar cuando se eliminará este formato, ya que estás características de la apariencia del texto no se han considerado información relevante del mensaje como para querer encriptarlas, aunque no queda descartada su implementación en líneas futuras (véase Capítulo 4). 30 Mediante cursores de teclado o de ratón, acompañados o no de la tecla para adiciones sucesivas: “Shift”. -71-
  • 86. Aplicación Software para el Desarrollo de Tareas Criptográficas Figura 3.1: La interfaz principal. Una vez se haya realizado alguna operación con la aplicación, el usuario podrá avanzar o retroceder en las ejecuciones según crea conveniente mediante la implementación de un “Deshacer” y un “Rehacer” a nivel global. También estarán habilitadas las herramientas para guardar: “Guardar” y “Guardar Como”; la primera para una vez guardado (con cualquiera de las dos opciones) continuar guardando en el mismo documento y la segunda opción para guardar en un documento diferente. Dentro de este conjunto de funciones típicas necesarias se encuentra “Nuevo” que dejando el documento activo (caso de haber sido modificado) abre un nuevo documento y “Abrir” que dejando el documento activo (caso de haber sido modificado) abre un documento existente. Por último dentro de los accesos de la pantalla principal se encuentran las funciones de “Cerrar” y “Salir”, la primera cierra el documento actual dejando, caso de haberlos, el resto de documentos abiertos y la segunda sale de la aplicación cerrando todos los documentos consigo. Aparte se han implementado una serie de diálogos para constatar las intenciones del usuario en el caso de las opciones de “Guardar”, “Guardar Como”, “Cerrar” y “Salir” que advierten de si se quiere proceder con la continuación del proceso habilitando los mecanismos necesarios para ello, ejemplos de este tipo son: “Sobrescribir”, “Salir sin Guardar”, “Salir Guardando”, “Explorar Archivos”, “Guardar claves usadas”… (véase uno de estos ejemplos en la Figura 3.3). -72-
  • 87. Capítulo 3: Descripción de la Aplicación CIFRAR Elegir Algoritmo DESCIFRAR Ventana Principal Figura 3.2: Esquema de la interfaz principal. Figura 3.3: Esquema de la interfaz principal. Todas estas opciones comentadas están disponibles a través de la barra de menús (Figura 3.4) en los menús Archivo31 y Edición32, y carecen de 31 Las opciones del menú Archivo se corresponden con las pintadas con colores calidos en la parte izquierda de la Figura 3.2. 32 Las opciones del menú Edición se corresponden con las pintadas con colores fríos en la parte inferior de la Figura 3.2. -73-
  • 88. Aplicación Software para el Desarrollo de Tareas Criptográficas carácter criptográfico pero son necesarias para las gestiones y el manejo con la aplicación. Para el carácter criptográfico es necesario acceder a las opciones de “Encriptar” o “Desencriptar” (dentro del menú Criptosistema) que abren el menú de algoritmos criptográficos (Apartado 3.3.). Figura 3.4: Barra de Menús. La parte de la barra de herramientas (Figura 3.5) constituye el acceso a las herramientas más usadas consideradas por el programador (con vistas a las líneas futuras se pretende incorporar esta posibilidad según las más usadas por el usuario, véase Capítulo 4). Estas herramientas son, por orden de aparición de izquierda a derecha: “Nuevo”, “Abrir”, “Guardar”, “Cortar”, “Copiar”, “Pegar”, “Deshacer”, “Rehacer”, “Cifrar” y “Descifrar”. Figura 3.5: Barra de Herramientas A la hora realizar los diseños de los dibujos de estas herramientas se pretendió que fueran lo más representativos posible a las opciones que representan, a la vez que creativos. Por comentarlos brevemente en orden de aparición: “Nuevo” se representa mediante una hoja en blanco cogida por una pinza, “Abrir” es un clasificador abierto lleno de documentos, “Guardar” es un diskete, “Cortar” unas tijeras, “Copiar” equivale a un documento colocándose encima de otro, “Pegar” es una barra de pegamento sobre una hoja en blanco, “Deshacer” una flecha que gira en sentido antihorario, “Rehacer” la misma flecha pero en sentido horario, “Encriptar” es un documento escrito al que se le ha echado un candado para encerrarlo dentro de una jaula, “Desencriptar” es su contrapuesto, es decir, el documento al que se le abre el candado para sacarlo de la jaula. El hecho de que en la Figura 3.5, aparezcan varios de ellos en escala de grises es por que se le imposibilita al usuario la opción de usarlos. Habiendo explicado las herramientas de la interfaz principal y visto el esquema de la Figura 3.2, se podría sacar el siguiente estado de la aplicación a partir de la barra de herramientas de la Figura 3.4. Al estar la herramienta de “Guardar” habilitada se sabe que el usuario ha utilizado la Hoja de Texto, al no estar habilitadas las herramientas de “Cortar”, “Copiar”, “Encriptar” y “Desencriptar” se sabe que el usuario no tiene hecha ninguna selección, sin embargo ha colocado texto en el portapapeles porque la herramienta de “Pegar” esta habilitada y ya en última instancia el usuario se encuentra en un estado intermedio de los procesos realizados ya que puede tanto “Deshacer” como “Rehacer”. -74-
  • 89. Capítulo 3: Descripción de la Aplicación La parte correspondiente al nombre que toma por defecto cada documento de CriptoYenet se define como “Sesion” acompañada de un número según la secuencia de documentos nuevos abiertos, este nombre también es usado para referenciar el archivo de claves pública en caso de guardarlo (véase el Apartado 3.3.1). Para terminar comentar que el usuario puede posicionar y redimensionar la aplicación a su gusto para que en las sucesivas sesiones se mantenga gracias a que se guardan los parámetros de ventana en el escritorio. 3.3. Menú Algoritmo Criptográfico. El menú para la elección del algoritmo criptográfico es la estructura que se le presenta al usuario una vez que haya seleccionado texto y pulsado encripar o desencriptar (Figura 3.6.), para cuyos casos la interfaz de este menú que aparece es la misma, únicamente cambia el texto del titulo del menú que guía al usuario a través de lo que debe hacer. Consta de las posibilidades que presenta CriptoYenet, es decir, de los algoritmos criptográficos: RSA, DES y TDES; y del protocolo RSAD, así como de la elección de abandonar el proceso. Figura 3.6: La interfaz del menú algoritmo. Para el caso de la Figura 3.6, se pulso encriptar haciendo aparecer justo debajo el menú algoritmo, cuyo esquema es el mostrado en la Figura 3.7. Esta concuerda en aspecto con la figura anterior ya que se ha implementado que la interfaz de menús emergentes represente el diagrama de bloques explicativos de los esquemas haciendo más sencilla su navegación. Según se elija uno de los métodos presentes en la Figura 3.7, estos aparecerán justo de bajo del menú algoritmo (el cual continua visible, Figura 3.6) doblegando el proceso en una serie de submenús que seguirán guiando al usuario hasta alcanzar el cometido. Estos menús “Menú RSA”, “Menú DES”, “Menú TDES” y “Menú RSAD” que se encargan de la generación y gestión de claves de cada criptosistema se presentan en los siguientes apartados. -75-
  • 90. Aplicación Software para el Desarrollo de Tareas Criptográficas CIFRAR DESCIFRAR Elegir Algoritmo Figura 3.7: Esquema de la interfaz que proporciona los algoritmos criptográficos. 3.3.1. Menú RSA. El menú RSA es para la elección de generar sus claves, cargarlas o usarlas desde sesión (Figura 3.8.) presenta el mismo aspecto tanto para el cifrado como para el descifrado cambiando únicamente la barra de título informativa. El usuario podrá hacer una de las tres posibles gestiones, volver a tras o abandonar todo el proceso. Figura 3.8: La interfaz del menú RSA. Este menú aparece justo debajo del menú algoritmo, mostrándose como si fuese la extensión de un árbol, de forma que cuando el usuario llegue al la última rama se procederá con el encriptado o desencriptado según la elección que se tomó en la base. Aunque la interfaz al igual que todas las demás es muy intuitiva, se muestra el esquema de la parte del funcionamiento criptográfico en la Figura 3.9. Según se elija uno de los métodos presente en la Figura 3.9., estos aparecerán justo de bajo del menú RSA (el cual continua visible, Figura 3.8.) doblegando el proceso en una serie de submenús que seguirán guiando al usuario hasta alcanzar el cometido. Estos menús “Menú Generar”, “Menú Cargar” y “Menú Sesión” que se encargan de la generación y gestión de claves del criptosistema RSA se presentan en los siguientes puntos. -76-
  • 91. Capítulo 3: Descripción de la Aplicación ! Figura 3.9: Esquema de la interfaz que proporciona el menú RSA. • Menú Generar Claves. El menú generar claves es para la creación de las claves usadas por RSA a partir de la elección de una par de número primos (Figura 3.9.). Este menú contiene 5 pasos consecutivos y no se podrá seleccionar el siguiente a menos que su antecesor haya sido activado, pues dependen de los valores anteriores (exceptuando el primer caso). También al igual que los menús comentados presenta el mismo aspecto tanto para el cifrado como para el descifrado. El usuario podrá deshacer los valores obtenidos, volver al menú anterior, abandonar todo el proceso o aceptar. Figura 3.10: La interfaz del menú generar claves de RSA. Tanto para los cálculos del “Primo p”, “Primo q” y “Clave Pública e”, se le ofrece al usuario las posibilidades de obtener el número de una lista definida con ayuda de un margen dinámico (Figura 3.11). Puede que el usuario sepa, si un número es primo o no cuando este se trate de un valor pequeño, pero para el caso de RSA resulta complicado. El jugar con valores elevados hace impracticable la comprobación de la primicidad de un número. Gracias a una función en donde se sitúa el inicio y la cantidad de primos a buscar, se configura una lista, el usuario podrá elegir comodamente el número primo deseado (Cuadro de Código 2.1). Para el caso de la “Clave Pública e”, se presenta de la misma situación (Figura 3.11 con diferente título), pero su obtención es bien distinta -77-
  • 92. Aplicación Software para el Desarrollo de Tareas Criptográficas (Cuadro de Código 2.4). Figura 3.11: La interfaz para la elección de un número primo de RSA. Una vez terminada la selección de cada uno de los parámetros, el botón “Aceptar” se habilitará permitiendo continuar. Para el caso de cifrado no aparecerán más menús simplemente se cifra el texto para terminar el proceso. Si por el contrario lo que se pretendía era descifrar aparece un menú (Figura 3.12) pidiendo al usuario su clave privada con la que recuperar el mensaje. Figura 3.12: La interfaz para introducir la clave privada de RSA. También al igual que en todos los menús, el de la petición del exponente “D” surge lo más próximo posible a la opción que lo antecede y contiene la posibilidad de volver a un paso anterior o abandonar el proceso así como un control de valores incorrectos tal y como se muestra en la Figura 3.16., pero para su caso. -78-
  • 93. Capítulo 3: Descripción de la Aplicación Para terminar con el la descripción del menú generar claves de RSA, se resume su funcionamiento mediante el esquema de la Figura 3.13. ! " # $ " ! " #&$ " % " " ! % # $ # $ " # $ # $ Figura 3.13: Esquema de la interfaz que proporciona el menú generar claves de RSA. Se puede observar por conjunto de colores, la elección de los números primos y las claves, siendo decisión del usuario las partes que disponen de listas. • Menú Cargar Claves. El menú cargar claves es para la introducción de las claves usadas por RSA. Este menú (Figura 3.14) permite que el usuario las introduzca a través del teclado (“Manual”) o bien mediante la carga de un archivo de claves RSA (“Archivo”). A su vez contiene las opciones de navegación propias de todos los menús de CriptoYenet. Figura 3.14: La interfaz del menú cargar claves de RSA. -79-
  • 94. Aplicación Software para el Desarrollo de Tareas Criptográficas Según el usuario haya pulsado “Manual” o “Archivo” aparecerán los menús de la Figura 3.15 o Figura 3.17 respectivamente. Figura 3.15: La interfaz del menú manual de RSA. Si se pulso el botón “Manual” aparece un menú donde el usuario debe introducir las claves públicas. Estas no deben ser aleatorias sino que deben haber sido calculadas según el procedimiento estipulado para ellas por RSA, de lo contrario aunque se encripte el mensaje, este no podrá ser recuperado. El par de claves puede ser uno creado a partir del menú “Generar”, o bien proporcionados por una red para tal cometido, sea cual fuere su procedencia el modulo “N” y el exponente “E” deben estar relacionados. También existe un control de errores para evitar valores incorrectos como reales, enteros negativos y caracteres (Figura 3.16). Aceptando el usuario obtendrá el mensaje cifrado si se encuentra en esa opción o por el contrario caso de estar descifrando le aparecerá el menú para introducir la clave privada (Figura 3.12). Figura 3.16: Mensaje de error al introducir claves incorrectas. La otra opción del menú cargar es “Archivo” (Figura 3.17) en el que haciendo uso de un explorador de archivos a través del botón “Examinar” se debe buscar un archivo de claves públicas de RSA33 para que lo lea el programa. Una vez cargado el archivo de claves y no habiéndose producido ningún error (para el que aparecería un mensaje similar al que antes se comento en la Figura 3.16), se obtiene debajo del botón “Examinar” una lista con todas las claves disponibles. Seleccionando la clave que interese se activara el botón “Aceptar” y se podrá finalizar cifrando, o descifrando mediante la introducción de la clave privada. 33 Este archivo se ha diseñado para que contenga una lista de claves usadas previamente en una sesión de CriptoYenet. El archivo tiene extensión “txt”, guarda los pares de claves por renglones y anota la fecha de uso. (En vistas a desarrollos futuros se pretende implementar un propio formato de código, ver Capítulo 4) -80-
  • 95. Capítulo 3: Descripción de la Aplicación Figura 3.17: La interfaz del menú exportar desde archivo de RSA. El conjunto de diálogos que conlleva la carga de claves en RSA se puede esquematizar mediante la Figura 3.18, lógicamente para el caso de descifrado siempre habría que añadir un diálogo más al final, al igual que se dijo con los anteriores caminos del “Árbol”. ' ( ! " ' Figura 3.18: Esquema de la interfaz que proporciona el menú cargar claves de RSA. • Menú Usar Claves de Sesión. El menú usar claves de sesión es la última opción de las disponibles dentro del menú RSA para su gestión de claves. Este menú (Figura 3.19.) permite que el usuario seleccione de una lista el par de claves públicas. Para la generación de dicha lista CriptoYenet se encarga de ir almacenando todos los pares de claves que se han ido usando tanto para el encriptado como para el desencriptado. Esta opción no está disponible caso de no haberse usado con anterioridad RSA cargando o generando claves. A su vez también contiene las opciones de navegación propias de todos los diálogos. El menú usar claves presentado en la Figura 3.19 dispone de la misma interfaz que el menú “Archivo” para la carga de claves (Figura 3.17). Esto es -81-
  • 96. Aplicación Software para el Desarrollo de Tareas Criptográficas debido a que ambos se surten del registro interno de claves que almacena CriptoYenet. Ese registro de claves es accesible en cualquier momento a través del menú “Usar sesión” pero a parte el programa hace una copia de sesión en un archivo a supervisión del usuario para su posterior carga con el menú “Archivo”, pues al cerrarse el programa las claves se borran. Figura 3.19: La interfaz del menú usar sesión de RSA. A partir de la opción “Ver Claves” se cargan todas las claves usadas en una lista para visualizar que se sitúa justo debajo. Seleccionando uno de los pares se activa el botón aceptar y se puede concluir la operación con el cifrado o descifrado según sea el caso. La interfaz de este diálogo que conlleva el uso de las claves de sesión en RSA, se puede esquematizar mediante la Figura 3.20, teniendo que añadirse al final, como se ha visto hasta hora, un recuadro más para la clave privada caso de estar desencriptando. ! ! " Figura 3.20: Esquema de la interfaz que proporciona el usar claves de sesión de RSA. -82-
  • 97. Capítulo 3: Descripción de la Aplicación 3.3.2. Menú DES y TDES. El menú utilizado para DES es exactamente el mismo que para TDES (Figura 3.21), proporcionando la capacidad al usuario de elegir una clave definida por él mismo (“Definir”) o a través de una clave interna (“Interior”). Este menú presenta el mismo aspecto tanto para el cifrado como para el descifrado cambiando únicamente la barra de titulo informativa. El usuario podrá hacer una de las dos posibles gestiones, volver a tras o abandonar todo el proceso. Figura 3.21: La interfaz del menú DES y TDES. Este menú aparece justo debajo del menú algoritmo, mostrándose como si fuese la extensión de un árbol, de forma que cuando el usuario llegue al la última rama se procederá con el encriptado o desencriptado según la elección que se tomó en la base (de forma idéntica al proceso llevado a cabo desde el menú RSA). Si el usuario seleccionó “Definir” se le presentará un diálogo donde introducir una clave aleatoriamente a su parecer34 (Figura 3.22), dicha clave debe cumplir con un requisito en su longitud de bits según sea DES o TDES, ya que de lo contrario no se dejará cifrar al usuario (Figura 3.23). Este requisito es una longitud de bits menor a 64 para DES y menor a 192 bits para TDES. El usuario deberá escribir el valor en decimal al igual que en todas las entradas numéricas de CriptoYenet Figura 3.22: La interfaz para introducir la clave en DES y TDES. Una vez escrita la clave el usuario podrá cifrar o descifrar sin la necesidad de introducir ningún parámetro adicional, a diferencia de cómo ocurría con RSA 34 Para el caso de RSA no es posible elegir sus claves aleatoriamentes por el usuario por que necesitan estar relacionadas, lo que si se podría haber hecho es implementar una generación aleatoria que crease las claves n, e y d a partir de números primos elevados aleatorios (ver Capítulo 4). -83-
  • 98. Aplicación Software para el Desarrollo de Tareas Criptográficas para el caso del descifrado. DES y TDES utilizan una clave para todo y RSA no. En caso de haber pulsado “Interior” se cifra o descifra mediante el uso de una clave interna predefinida para DES o TDES según sea el caso. Figura 3.23: Mensaje de error al introducir claves con longitud incorrecta en DES y TDES. El usuario se podrá encontrar al introducir la clave con errores de varios tipos que podrán solventar gracias a las aclaraciones de los mensajes de error como los de la Figura 3.16 y Figura 3.23. Mediante el resumen en forma de esquema presentado en la Figura 3.24 se da por concluida la descripción del menú DES y TDES, la interfaz más sencilla para la gestión de entre todos los algoritmos. ) Figura 3.24: Esquema de la interfaz que proporciona el menú DES y TDES. 3.3.3 Menú RSA Digital. El menú RSAD hereda directamente de los menús anteriores (RSA, y DES y TDES). Con este al usuario se le ofrece un menú adicional para que elija entre DES y TDES al principio (Figura 3.25), después según se esté encriptando o desencriptando así se hará uso de unos diálogos u otros. A parte se han detallado en las figuras de los diálogos que utiliza RSAD el final del proceso a diferencia de en los menús anteriores ya que en este caso aclara el desarrollo. Para el caso concreto del cifrado, el proceso hará uso del menú del algoritmo simétrico para seguir con el menú RSA tal y como se puede apreciar en la Figura 3.26. Únicamente a diferencia de en DES y TDES se ha excluido la -84-
  • 99. Capítulo 3: Descripción de la Aplicación posibilidad de usar la clave interna por todo lo demás es igual. Se a de recordar que RSAD no es un criptosistema sino un protocolo que utiliza los algoritmos criptográficos anteriores, es por ello que incorpora los menús de dichos algoritmos. En el esquema de la Figura 3.26 se detalla el uso de este protocolo para el encriptado, desde el uso de los menús propios hasta de los que hereda del resto. Figura 3.25: La interfaz del menú RSAD. El usuario es guiado en todo momento. Se le informa cuando se está encriptando la clave simétrica escogida y cuando se encripta el mensaje. Al final se obtiene un “pack” formado por el archivo generado automáticamente que contiene la clave simétrica cifrada asimétricamente y otro archivo con el mensaje cifrado simétricamente que debe guardar el usuario desde CriptoYenet. En el caso del descifrado RSAD, se parte de los archivos generados con el cifrado, es decir, una vez elegido el algoritmo simétrico de forma que coincida con el escogido en el estado anterior del proceso, el programa pedirá la ubicación de la clave simetría encriptada con RSA para cargarla (Figura 3.28). Esta carga desde archivo es exactamente igual que la que se hacia para la lista de de pares de claves públicas en RSA (Figura 3.16) con la diferencia de que ahora el formato de archivo es distinto. El usuario examinará para cargar la clave y seleccionarla terminando así con todo el proceso de desencriptado (Figura 3.27). El usuario es guiado en todo momento. Se le informa cuando se está desencriptando la clave simétrica escogida y cuando se desencripta el mensaje. Es necesario disponer del modulo n y el exponente d para recuperar la clave simétrica. -85-
  • 100. Aplicación Software para el Desarrollo de Tareas Criptográficas ) * ) * + ) ) Figura 3.26: Esquema de la interfaz para el cifrado que proporciona el menú RSAD. ' ) ( * * ) + " ) Figura 3.27: Esquema de la interfaz para el descifrado que proporciona el menú RSAD. -86-
  • 101. Capítulo 3: Descripción de la Aplicación Figura 3.28: La interfaz para introducir la clave simétrica. -87-
  • 103. CAPÍTULO 4 - Conclusiones - Líneas Futuras y - Limitaciones -
  • 105. Proyecto Fin de CarreraCapítulo 4: Conclusiones, Líneas Futuras y Limitaciones CAPÍTULO 4 – Conclusiones, Líneas Futuras y Limitaciones. Este último capítulo, arranca con las conclusiones generales presentadas con CriptoYenet. Conclusiones en base a la realización software, al tratado de la criptografía a nivel de programación y a las implicaciones de sus algoritmos. También se abarcan las líneas futuras, explicando las ideas más interesantes que fueron apareciendo de cara a la realización de nuevas versiones. Para terminar, se indican las limitaciones del programa en el cumplimiento de sus objetivos. 4.1 Conclusiones. Toda realización software es “infinita”. Por decirlo de alguna manera. A medida que el desarrollador va marcando unas pautas dentro de unos objetivos y avanza, salen multitud de funcionalidades nuevas, mejoras, e infinidad de código nuevo para “picar”. El software se puede moldear al gusto, no implica costes directos, no se rompe y tiene la cualidad de la reutilización. Propiedades de las que carece la realización hardware, pues las maquinas estarán limitadas, por ejemplo por el máximo de memoria, velocidad, espacio físico de integración….Y una vez culminados sus recursos, por muchas ideas nuevas que tenga el desarrollador, estas en su mayoría no serán aplicables. Así que a priori, el software parece tener una gran ventaja, pero puede convertirse en un arma de doble filo, pues se puede desbordar la realización. Por eso se debe intentar no abarcar más de lo que se pueda, sobre todo con vistas a unos plazos de entrega del producto. Es necesario ponerse unos límites. Por muy tentadoras que sean las nuevas y fabulosas ideas, se debe desistir de ellas, o desistir para una primera versión. Este y no otro es el caso particular de CriptoYenet, el cual en principio iba a ser una aplicación básica para el cifrado asimétrico con RSA, y sin embargo a su favor se ha convertido en una herramienta mucho más poderosa. La realización de CriptoYenet no solo trajo consigo el aprendizaje criptográfico y de programación, a parte abrió las puertas al mundo de las librerías libres y al uso de ventajas de Linux dentro de Windows [B.R. 2.7-2.9]. Es interesante destacar las discrepancias descubiertas entre las implementaciones asimétricas y simétricas desarrolladas. Las primeras, basadas en el cálculo de primos, exponentes y módulos, resulto ser sencilla de implementar en su criptosistema, pero complicada en su gestión de claves. Las segundas, basadas en operaciones lógicas, sustituciones y transposiciones, resultó ser mucho más extensa de implementar en su criptosistema, pero sencilla en su gestión de claves. Implicaciones directas de la disponibilidad de claves. Por su parte, la estructuración y depuración del código, una vez realizada la versión de CriptoYenet con la incorporación de RSA y DES, facilitó la adaptación de TDES y RSAD. TDES se baso en DES. RSAD se baso en DES/TDES y RSA. -91-
  • 106. Aplicación Software para el Desarrollo de Tareas Criptográficas Refiriéndonos al uso de criptosistemas en general. Estos requieren de un hardware potente y de la realización software adecuada. Siendo este segundo el mayor problema para el programador, debido a que los tipos de variables definidas están limitadas. El uso de estos con las funciones criptográficas correspondientes conlleva la sobrecarga del procesador. Gracias al tratado matemático por medio de cadenas de caracteres, GMP solventa dicha sobrecarga, convirtiendo procesos sumamente cuantiosos de calcular, en resultados inmediatos. La incorporación de GMP tuvo mayores consecuencias para RSA, al utilizar funciones complejas y claves indefinidamente largas. Como era de esperar, al principio, el completo analfabetismo de cara a la realización del proyecto, acortaba las vistas a un horizonte para competir con otras aplicaciones del mismo carácter como es el caso “a años luz” de PGP. Es una lastima que solo conforme se llegaba al final de la realización del software se empezase a alumbrar las ideas más interesantes para desarrollar35. Intentando que todo el camino recorrido no sea en vano, se pretende que con las siguientes ideas de desarrollo futuras, se puedan desarrollar nuevas versiones de esta fabulosa herramienta que es CriptoYenet. De este modo, con la continuación del trabajo, se pretenden incorporar mayor número de funciones y mejoras que luzcan de un mayor aporte estético. Todo sin deteriorar la facilidad de uso, pues es en la facilidad de uso y en la interfaz donde quizás se le pueda ganar mayor terreno al software existente al respecto. 4.2 Líneas Futuras. Las líneas a seguir con CriptoYenet de cara al futuro fueron surgiendo a medida que se iba programando. Algunas de ellas estaban previstas para próximas versiones y tuvieron su luz en está versión. Caso de la incorporación de TDES y RSAD, o las mejoras con la incorporación de la librería GMP. El resto de ideas que surgieron y que se pretenden implementar para CriptoYenet, se presentan a continuación. • Incorporaciones de nuevos criptosistemas y protocolos: Gracias a la depuración y reorganización que se hizo en el código para incorporar el algoritmo criptográfico TDES y el protocolo RSAD, se posibilitó la capacidad de incorporar nuevos sistemas de una forma sencilla y sin la necesidad de reorganizar o cambiar el código existente. Así, haciendo referencia a la Figura 1.8 para incorporar nuevos algoritmos, solo habría que implementar su funcionamiento y su gestión. Los nuevos sistemas se seleccionaría por medio de un “switch” y un identificador, que será lo único necesario a añadir para su acople. Otra gran ventaja es la posibilidad de heredar casi por completo las gestiones de claves, pues para la mayoría de los casos las gestiones simétricas serán comunes, y las asimétricas entre si también. Además sería de gran utilidad poder heredar o reutilizar código de las partes que implementan el funcionamiento de otros sistemas. Esto para el caso de funciones matemáticas compartidas sería 35 Ideas interesantes, pero fuera del marco de los objetivos del presente proyecto. -92-
  • 107. Capítulo 4: Conclusiones, Líneas Futuras y Limitaciones posible, pero para lo que es el caso de la implementación del criptosistema en si no daría resultado. El hecho de que los distintos algoritmos dentro de un grupo compartan algunas estructuras similares, no quiere decir que su desarrollo vaya a ser inmediato, pero se facilitan las cosas (véase Apéndice C). Respecto a los protocolos. Una vez implementados todos los algoritmos, se podrían inventar multitud de ellos o utilizar las combinaciones siempre acertadas de un asimétrico con un simétrico tal y como se comento en el Capítulo 2. Un ejemplo de esto podría ser el uso de las ventajas de AES, opción recomendada y probablemente una de las mejores que deba existir (irrompible hasta la fecha y 6 veces más rápido que DES) junto con RSA. Para este protocolo se reutilizaría exactamente lo mismo que con RSAD, solo que donde se hace uso de DES se pone AES, así de simple y rápido. Para este punto quedaría propuesta la selección de los algoritmos dados en el Apéndice C, cuyas listas de referencias a su documentación se encuentran al final del proyecto. También se propone la invención de nuevos criptosistemas y protocolos. • Formato de código especifico: La aplicación realizada, a pesar de tener un formato específico para obtener los datos, utiliza el formato de archivos de texto sin formato, es decir, archivos por ejemplo con la extensión “txt”. Y sería deseable disponer de un formato específico con una extensión propia que codificase con un lenguaje entendible solo por CriptoYenet. Para entender mejor esto bastaría simplemente abrir un archivo con un formato por un programa que no soporte dicho formato. Los resultados serán el permiso de acceso denegado o la lectura de datos ilegibles. Con el formato “cpty” quedarían todos los archivos para uso específico o código cerrado con CriptoYenet, dificultando a su vez las lecturas de otros softwares. • Adaptación de formatos de código externo: La adaptación de formatos de código externo subyace directamente de la anterior mejora. No es de extrañar, que los software que puedan abrir formatos de archivos de otros software del mismo tipo sean más apetitosos. Este es el caso de OpenOffice que entre sus muchas ventajas es capaz de abrir documentos de su homologo el MS Word (cosa que a la viceversa este no puede). Por lo tanto sería una ventaja añadida. Estando los usuarios de software criptográfico supuestamente en la encrucijada futura de elegir entre: PGP para abrir unos tipos de archivo y CriptoYenet para otros; si CriptoYenet pudiera abrir también los de PGP, siendo a su vez igual de bueno, el traspaso de los usuarios acostumbrados a PGP hacia CriptoYenet será más inmediato. -93-
  • 108. Aplicación Software para el Desarrollo de Tareas Criptográficas Algo bastante más eventual a la adaptación de otros formatos de softwares criptográficos, sería la posibilidad de abrir documentos de texto de casi cualquier procesado. Actualmente CriptoYenet puede hacerlo gracias a la adaptabilidad que ofrece el portapapeles, sin embargo si se abre directamente un archivo, a parte del texto legible aparecen caracteres ilegibles propios del formato del procesador. • Cifrado y descifrado de imágenes, sonido y video: CriptoYenet no puede cifrar y descifrar cualquier tipo de archivo, pues como hemos comentado antes no soporta todos los formatos. Solo podrá únicamente con aquellos que usen texto. Lo que se pretende para el futuro es cargar imágenes, sonidos y videos. Las imagenes (jpg, jpeg, bmp, gif, tiff) se visualizarán para cifrar o descifrar las partes deseadas. Con el sonido (mp3, wav, rm, midi) sería similar, pero visualizando su espectro al igual que hacen los editores. Y por ultimo una extensión al uso de videos (mpg, mpeg, mov, avi, wmv). Tanto para imágenes, sonido y video se mantendría interfaz, solo cambiaria el área de visualización y el modo de selección. Para realizar este cometido sería necesario conocer los formatos de estos archivos y realizar las lecturas de sus cabeceras adecuadamente para la representación. Además sería bastante más interesante, aunque solo tendría un carácter puramente didáctico y entretenido, el hecho de mantener las cabeceras intactas de forma que el usuario pueda escuchar un sonido tras el cifrado con su clave o ver su foto cifrada en AES por ejemplo. • Modo automático: Desde sus principios el software de este proyecto pretendía cierto cometido de aplicación didáctica. Por ello y por el hecho de disponer de la elección de claves, el usuario en todo momento tiene que participar en la ejecución. Con la utilización de variables aleatorias se pretende automatizar los resultados. Mediante un solo clic, el programa devolvería la clave privada necesaria y el texto cifrado. De todas las líneas futuras, la realización de un modo automático es la más inmediata de implementar. Creando una función aleatoria que sustituya las entradas del usuario y se rija por las propiedades numéricas de cada clave según el algoritmo. • Barra de herramientas inteligente: Como se pudo observar en la Figura 3.5, la barra de herramientas constituye el acceso a las herramientas más usadas consideradas por el programador. Puede ser necesario con el aumento de funciones vistas para el programa, que cada usuario use unas herramientas más que otras. Con la implementación de una barra de herramientas inteligente, se detectaría aquellas funciones más usadas y se colocarían en la barra en detrimento de las que están en desuso. Con la integración de este recurso se agilizaría el proceso para usuarios acostumbrados a la interfaz. -94-
  • 109. Capítulo 4: Conclusiones, Líneas Futuras y Limitaciones 4.3 Limitaciones. El software desarrollado para el cifrado y descifrado de las partes deseadas de un texto cuenta con una serie de limitaciones. Estas en su mayoría debidas a su uso inapropiado de claves infinitamente largas con documentos de texto ingentes. Tras innumerables pruebas con los tiempos de procesos se establecieron dos limitaciones para evitar demoras. Una restricción en la lista de primos que imposibilita al usuario la generación de una lista indefinidamente larga. Para ello se definieron los límites de lista entre 0 y 100 (cantidad de primos a buscar). Esto no disminuye los permisos del usuario, sino que facilita su elección en el rango deseado (el usuario podrá en todo momento establecer el inicio de búsqueda). La otra restricción es debida al uso de texto con longitudes demasiado largas como para ser soportadas por el SO y la CPU. Estas cantidades de caracteres se han definido para que no sean superiores a las 100000 unidades. Sobre este límite se ha comprobado (en un Pentium IV con 3GHz y 1 GB) de RAM, que el hecho de mover semejantes cantidades de texto puede ralentizar demasiado los procesos, llegando incluso a bloquearse con cantidades bastante mayores. Este límite en 100000 se aplica tanto al cifrado como al descifrado, pero surgió con el cifrado pues este aumentaba el tamaño del mensaje de manera considerable. Para DES y TDES influirá en el alcance de esta restricción únicamente el tamaño del mensaje, pues su cifrado hace uso de una clave de longitud fija. Mientras que para RSA influirá tanto el mensaje como la clave (longitud variable). -95-
  • 111. APÉNDICE A - Manual de Usuario -
  • 113. Proyecto Fin de Carrera Apéndice A: Manual de Usuario APÉNDICE A – Manual de Usuario. El manual de usuario pretende mostrar los pasos a seguir para el uso de las operaciones criptográficas de manera visual y sencilla. Presenta todas las posibilidades así como el comportamiento a llevar a cabo en caso de errores de usuario. Se recomienda previamente la lectura y comprensión del Capítulo 3. A.1.- Pasos comunes para todos los algoritmos. La utilización de cualquiera de los algoritmos de CriptoYenet presenta una serie de pasos en común al principio de su ejecución. Todos y cada unos de estos pasos aunque puedan parecer muy simples se detallan a continuación. Paso 1. Abrir CriptoYenet (Figura A.1) Figura A.1: Abrir CriptoYenet. Paso 2. Obtener el mensaje de texto a cifrar o descifrar. Para ello existen varias posibilidades: Escribir texto (Figura A.2), abrir un documento CriptoYenet (Figura A.3. y A.4), abrir un documento de texto en CriptoYenet o pegar texto desde otra aplicación. Figura A.2: Escribir texto en CriptoYenet. Los archivos usados por CriptoYenet suelen tener el nombre “Sesión” acompañados por una secuencia numérica, pero de haber sido cambiado su nombre podría ser cualquiera archivo de texto con la extensión “txt”, con la única particularidad de que CriptoYenet no podrá descifrar aquellos archivos que no estén cifrados en formato CriptoYenet, es decir, listas numéricas separadas por puntos (Figura A.5). El software podrá realizar su función para cualquier archivo de texto que desee ser cifrado, incluso aunque se trate de texto exportado de otras aplicaciones con formatos diversos en cuyo caso CriptoYenet elimina el -99-
  • 114. Aplicación Software para el Desarrollo de Tareas Criptográficas formato y procede a su cifrado. También es posible cifrar varias veces un mensaje si así se desea. Figura A.3: Abrir en CriptoYenet. Todas las opciones de CriptoYenet se pueden acceder a través de su barra de menú y para aquellas más usadas se puede recurrir a la barra de herramientas como es el caso de la opción “Abrir” (Figura A.3). Figura A.4: Abrir un documento CriptoYenet. -100-
  • 115. Apéndice A: Manual de Usuario El archivo que se abra (por ejemplo: “Sesion1” Figura A.4) podrá tener un aspecto en claro como el de la Figura A.2 o podrá ser un archivo cifrado de CriptoYenet (Figura A.5). Figura A.5: Documento cifrado de CriptoYenet abierto. Paso 3. Seleccionar las partes del mensaje con las que se quieren realizar operaciones criptográficas. Partiendo del texto de la Figura A.2, se supone que se quieren cifrar la palabra “escribiendo”, para ello se hace doble clic sobre la palabra e inmediatamente después aparecen habilitadas las opciones de cifrado y descifrado (Figura A.6). Figura A.6: El texto señalado (esto activa las opciones criptográficas). -101-
  • 116. Aplicación Software para el Desarrollo de Tareas Criptográficas Paso 4. Cifrar o Descifrar. Para ello se debe de pulsar el icono correspondiente al cifrado (documento entre rejas) o al descifrado (documento sin rejas) de la Figura A.6. Paso 5. Elección del Algoritmo. Del menú que aparece (Figura 3.6) se debe elegir una de las opciones criptográficas que ofrece CriptoYenet mediante botones con sus nombres. Una vez se haya llegado a este punto los caminos se dividen (Apartados A.2, A.3, y A.4) según el algoritmo seleccionado en el paso 5. A.2.- Usando RSA. Los pasos a seguir para encriptar con RSA partiendo del paso 5 del apartado A.1, se muestran nuevamente tal cual le aparecerán al usuario. Paso 6. Elección de la gestión de claves RSA. El usuario debe elegir entre generar las claves a partir de primos (botón con el nombre “Generar”), Cargarlas manualmente o desde archivo (botón central con el nombre “Cargar”) o usar claves utilizadas con anterioridad en la sesión actual (botón con el nombre “Sesión”). Si se decide por el botón “Generar” (Figura A.7) se deberá seguir un proceso para la creación de varios parámetros. El usuario deberá ir pulsando el botón del parámetro a generar y seleccionándolo una lista (Figura 3.11) en caso de que se posibilite. Si se opta por “Cargar” (Figura A.8) se deberá elegir entre una carga manual (botón con el nombre “Manual”) o una carga a través de archivo (botón “Archivo”). Para el caso manual (Paso 6a) los valores introducidos deben ser enteros positivos que hayan sido generados para el modulo y el exponente público, es decir, esta opción se suele usar si el usuario conoce de antemano un par público, ya pueda ser generado a través de CriptoYenet (menú “Generar”) o a través de otra fuente fiable, en cualquier caso en dicha obtención el usuario debe obtener la clave privada con par para que este sea útil. En el caso de carga por archivo (Paso 6b) solo existe la posibilidad de usar un archivo de claves RSA de CriptoYenet. Una vez en el cargado se debe elegir una de las claves de la lista. Si se elije la opción de “Sesión” (Figura A.9), a través del botón de “Ver Lista” aparecerán todas las claves disponibles de sesión, se a de detener en cuenta que no podrá ser usada si no se han usado claves RSA desde que se abrió la aplicación. Paso 7. Paso final para el cifrado. Pulsar el botón “Aceptar” para cifrar. Si todo ha salido correctamente tendría que aparecer la palabra “escribiendo” transformada en una secuencia numérica (Figura A.10). -102-
  • 117. Apéndice A: Manual de Usuario Figura A.7: Generando las Claves con RSA. Figura A.8: Cargando las Claves con RSA. -103-
  • 118. Aplicación Software para el Desarrollo de Tareas Criptográficas Figura A.9: Usando Claves de Sesión con RSA. Figura A.10: Palabra cifrada con RSA. Paso 8. Paso final para el descifrado. Caso de estar descifrando, el paso anterior llevaría al usuario hasta otro diálogo más en el cual se debe introducir la clave privada de RSA. Como ejemplo para está ocasión el origen podría haber sido el texto cifrado de la Figura A.10 y el final la frase legible del principio (Figura A.6) A.3.- Usando DES y TDES. Los pasos a seguir para encriptar o desencriptar con DES o TDES son los mismos. Partiendo del paso 5 del apartado A.1 se muestran nuevamente tal cual le aparecerán al usuario (Figura A.11). Se debe remarcar que todo cuanto se dice para DES es igual que para TDES con la única diferencia de que con TDES se puede escoger una clave de mayor longitud. Del paso 5 se pasa a la elección de una clave interna (botón con el nombre “Interior”) en donde finaliza el proceso, o se pasa a la elección de definir la clave (botón “Definir”). Paso 6. Paso final para el cifrado o descifrado caso de haber definido el usuario la clave. El mensaje encriptado se mostrará en el mismo formato que con RSA y el resto. -104-
  • 119. Apéndice A: Manual de Usuario Figura A.11: Definiendo clave o usando clave interior con DES. A.4.- Usando RSA Digital Los pasos a seguir para encriptar con RSAD son distintos a los pasos para el desencriptado. Partiendo del paso 5 del apartado A.1 se muestran nuevamente tal cual le aparecerán al usuario (Figura A.12) en el caso de haber elegido el encriptado. Del paso 5 se pasa a la elección de una clave interna para DES o TDES en la que solo existe la posibilidad de definirla tal cual se hacia con el botón “Definir” en el Apartado A.3. Figura A.12: Definiendo clave DES o TDES para RSAD. Paso 6. Paso final para la elección de la clave simétrica en RSAD, ”Aceptar”. Paso 7. Encriptación de la clave simétrica de DES o TDES mediante RSA. -105-
  • 120. Aplicación Software para el Desarrollo de Tareas Criptográficas Figura A.13: Aviso de cifrado de la clave privada simétrica. Los pasos que se deben seguir a partir de aquí solo surtirán efecto en la clave privada. Estos son los llevados a cabo por RSA así que se debe ir al apartado A.2 para continuar. Paso 8. Guardar la clave privada simétrica. Una vez el usuario haya elegido los parámetros RSA, el programa avisa de que se va proceder a guardar la clave encriptada. (Figura A.14) Figura A.14: Aviso para guardar la clave privada simétrica. Paso 9. Paso final para el cifrado. El usuario deberá pulsar el botón “OK” (Figura A.15). para que se cifre el mensaje con la clave simétrica. Si el usuario -106-
  • 121. Apéndice A: Manual de Usuario quiere que la comunicación mediante RSAD surta efecto deberá mandar el pack RSAD al receptor. Figura A.15: Aviso para la correcta ejecución de RSAD Los pasos a seguir para el desencriptado con RSAD a nivel externo son distintos a los pasos del encriptado. Partiendo del paso 5 del apartado A.1 se muestran nuevamente tal cual le aparecerán al usuario (Figura A.16) en el caso de haber elegido el cifrar el mensaje. Del paso 5 se pasa a la elección de una clave interna para DES o TDES en la que solo existe la posibilidad de definirla tal cual se hacia con el botón “Definir” en el Apartado A.3. Figura A.16: Cargando clave privada simétrica cifrada en RSAD. Paso 6. Paso final para la elección de la clave simétrica cifrada en RSAD mediante el pulsado del botón “Aceptar” Paso 7. Desencriptación de la clave simétrica de DES o TDES mediante RSA. Para ello los pasos que se deben seguir a partir de aquí son los llevados a cabo por RSA así que se debe ir al apartado A.2 para continuar. Una vez se haya desencriptado dicha clave se recuperará el mensaje cifrado. -107-
  • 123. APÉNDICE B - Conceptos básicos sobre Criptografía -
  • 125. Proyecto Fin de Carrera Apéndice B: Conceptos Básicos sobre Criptografía APÉNDICE B – Conceptos básicos sobre Criptografía. [B.R.1.1] B.1.- Historia. Criptografía, suena a números, enrevesado y matemáticas, pero si usted pregunta hoy en día a la mayoría de persona sobre criptografía, claves, encriptar, desencriptar datos, seguramente obtenga respuestas del tipo: televisiones de pago, tarjetas de crédito, seguridad y protección de datos por Internet…Saben de que se le esta hablando o al menos tienen una ligera idea. Sin embargo aunque la criptografía gracias a la globalización esta más de actualidad que nunca, millones de datos y personas en Internet lo corroboran, las personas desconocen de su historia y la sitúan en el ámbito de las Guerras Mundiales, desgraciadamente es verdad que en las guerras la Criptografía sufrió enormes avances y sobre todo en la última, pero nada más erróneo pues es casi tan antigua como la escritura. Basándonos en pruebas fehacientes de restos arqueológicos, las primeras formas para ocultar un mensaje secreto requirieron de pluma y los análogos de papel, pues la mayoría de la gente no sabia leer, con lo que en si la escritura en sus orígenes era un proceso criptográfico. Pero para una criptografía real requerida tenemos que situarnos en La Grecia Antigua donde aparecieron los dos tipos clásicos principales, los cuales hemos comentados anteriormente y a partir de los cuales se sustentan el resto. Se trata de la transposición, que cambia la posición de las letras en un mensaje, por ejemplo un esquema simple de cambio sería: “por ejemplo” que codificado es “premoje pol” y de la substitución, que substituye sistemáticamente letras o grupos de letras por otras letras o grupos de letras: “por ejemplo” que codificado es “qps dknqmp” Substituimos cada letra por su siguiente en el alfabeto. Algunos ejemplos sencillos de cifrado fueron: • La Escitala, usada por los espartanos, hacia el 400 a.C. puede considerarse el primer sistema de criptografía por transposición. Los militares de la ciudad-estado griega escribían sus mensajes sobre una tela que envolvía una vara. El mensaje sólo podía leerse cuando se enrollaba la tela sobre un bastón del mismo grosor, que poseía el destinatario lícito del mensaje. • El Código de Cesar (Tabla B.1), usada por Julio Cesar, hacia el 100 a.C. para comunicarse con sus generales durante las campañas militares, tenía una substitución de cada letra por la que la seguía en la 3 posición del alfabeto, apenas como el código Excess - 3 en álgebra boleana. Por ejemplo, si se quiere enviar el mensaje ATACARALAMANECER, lo que se escribirá realmente es DWDFDUDÑDODPHFHU. -111-
  • 126. Aplicación Software para el Desarrollo de Tareas Criptográficas Alfabeto en claro: A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z Alfabeto cifrado: D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z A B C Tabla B.1: El Código de Cesar. • El famoso número del demonio, el 666, era utilizado en manuscritos cristianos para referirse al implacable perseguidor de cristianos, el emperador romano Nerón. (Existen otros ejemplos similares, palabras código anteriores datadas de los Hebreos) Más antiguo en si que la modificación del propio mensaje para ocultarlo, era ocultar el mensaje usando multitud de caminos. Algunos ejemplos sencillos de ocultar mensajes fueron: • Ocultar la información tatuada en las cabezas rapadas de los esclavos para una vez cubiertos de pelo enviarlos a sus destinos (Herodes). • El uso de alimentos para ocultar mensajes (Cleopatra). Ejemplos más modernos de ocultar los mensajes son: • El uso de tinta invisible, de los microdots (micro puntos) y de las filigranas digitales de encubrir la información. Con el desarrollo de las ciencias, y más concretamente de las matemáticas, la criptografía fue avanzando. En la Edad Media comenzó a adquirir una gran importancia cuando un siervo del Papa Clemente VII escribió el primer manual sobre el tema de la historia. En 1466 León Battista Alberti ideó el sistema poli alfabético basado en la rotación de unos rodillos. Un siglo más tarde, Giovan Battista Belaso inventó la clave criptográfica basada en una palabra o texto que se transcribía letra a letra sobre el mensaje original... Pero si un punto ha marcado un antes y un después en la criptografía, como decíamos antes, ese ha sido la Segunda Guerra Mundial. Ya a principios del pasado siglo XX se idearon los denominados “traductores mecánicos”, basados en el concepto ideado en el siglo XV por Alberti de las ruedas concéntricas, y el sistema comenzó a tornarse sumamente complejo, ya no bastaba con analizarlo concienzudamente para comprenderlo. Y eso nos llevó a la Segunda Guerra Mundial, a los años 30 y 40 y a la máquina Enigma. Aunque mucha gente no lo sepa, la criptografía fue uno de los principales motivos para que los aliados ganaran la guerra, pues los alemanes creían el código de su máquina Enigma inviolable, y de hecho sí que era extremadamente complejo. Pero al igual que antes comentaba que el anhelo humano de esconder secretos es eterno, mayor es aun su anhelo por desenterrarlos, de hay el progreso y los avances de la ciencia. Un equipo de criptoanalistas, matemáticos y demás mentes privilegiadas (entre ellos Alan Turing, uno de los padres de la informática) lograron en 1942 lo que parecía imposible: romper el cifrado de Enigma. Para ello diseñaron las llamadas “bombas navales”, aparatos de cálculo mecánicos que se encargaban de romper el cifrado alemán y entregar todos los secretos a los aliados. -112-
  • 127. Apéndice B: Conceptos Básicos sobre Criptografía Igualmente, el Purple (versión japonesa de Enigma) fue roto en Midway por un equipo dirigido por el comandante Joseph J. Rochefort. El hecho de conocer los secretos, de tener todas las llaves, dio la vuelta a la guerra y cambió el curso de la historia. También hay que tener en cuenta que la perspicacia, persuasión… usados por los espías del bando italiano, entre otros muchos métodos, daban los mismos resultados que las portentosos descifrador. El nacimiento de la informática y de los criptosistemas informáticos supuso un cambio radical del concepto de criptografía, y también del criptoanálisis. Los criptosistemas y los algoritmos aumentaron repentinamente y de forma descomunal su complejidad. Desde el DES hace ya mucho, el cual es uno de los bloques desarrollados en este proyecto, hasta los criptosistemas asimétricos como el RSA, el otro gran bloque, o como los asimétricos de curvas elípticas actuales todo ha cambiado (CCE). Gracias a la extensión de la criptografía, al aumento de su demanda por parte de los ciudadanos y a desarrolladores como Philip Zimmermann, el privilegio de guardar secretos que estaba exclusivamente en manos de los gobiernos o poderosos, ya hoy en día, es un derecho de cualquier ciudadano: El derecho a la libertad de comunicarnos de forma segura. Y es tan solo cuestión de tiempo, que se imponga a nivel global como uso cotidiano, una navegación real a través de Internet que nos proporcione seguridad y privacidad. Por supuesto hay que dar las gracias también a desarrolladores de criptosistemas informáticos, tales como: Rivest, Shamir, Adleman, Diffie, Hellman, ElGamal, Rijmen, Daemen, Massey, Miller, Goldwaser... Todos ellos son padres de lo que hoy se llama criptografía. B.2.- Criptología. Criptografía, el arte de ocultar. La palabra tiene su origen en el griego: kryptos (oculto, escondido) y graphein (escribir). El arte de ocultar un mensaje mediante signos convencionales es muy antiguo. Y efectivamente siempre ha sido considerado un arte hasta hace relativamente poco, cuando Claude E. Shannon publicó en dos años dos documentos que supusieron la fundación de la moderna Teoría de la Información. A partir de entonces, y unido al desarrollo de la computación moderna, el desarrollo de la criptografía alcanzó nuevos horizontes. Antes de entrar en más detalles, hay que comprender que la criptografía se complementa con otra rama de estudio, el criptoanálisis, que estudia el camino inverso de la criptografía, dedicando sus esfuerzos a desentrañar los secretos que la criptografía se empeña en mantener ocultos. Ambas ramas conforman lo que entendemos como criptología. B.3.- Terminología. La terminología usada en criptografía requiere básicamente de lo que se denomina mensaje y criptograma. -113-
  • 128. Aplicación Software para el Desarrollo de Tareas Criptográficas • Texto en claro o plain text (mensaje): es la información original, el mensaje, que se quiere cifrar. • Texto cifrado o cripher text (criptograma): es la información resultante una vez se ha cifrado el mensaje. En el ámbito criptográfico, entendemos por texto en claro cualquier información que resulta legible y comprensible. Un texto en claro sería cualquier información antes de ser encriptada o después de ser desencriptada. Se considera que cualquier información es vulnerable si se encuentra en este estado. Así mismo, denominamos criptograma a cualquier información que se encuentre convenientemente cifrada y no resulte legible ni comprensible más que para el destinatario legítimo de la misma. El mecanismo de transformar un texto en claro en un criptograma lo denominamos encriptación o cifrado, y al proceso de recuperación de la información a partir de un criptograma lo denominamos desencriptación o descifrado. Es muy importante no confundir estos términos con codificación o decodificación, pues codificación es el acto de representar la información de distintas formas, pero no necesariamente encriptadas. Por ejemplo, un número decimal puede codificarse como hexadecimal, y no por ello se convierte en un criptograma. Desgraciadamente pocas personas saben esta clara diferenciación, como ejemplo los comúnmente llamados “decodificadores de la televisión satélite de pago”, cuando introduces la “RSA key” lo que estamos haciendo no es decodificar sino descifrar los canales. B.4.- Canal de información. B.2). En un criptosistema la información sigue un camino siempre fijo (Figura Figura B.1: Flujo de Información en un canal criptográfico. El emisor cifra el texto en claro (m) para obtener el criptograma (c), que viaja por un canal potencialmente peligroso. El receptor descifra el criptograma y obtiene de nuevo el texto en claro que el emisor le envió. Durante toda la transmisión, el mensaje es ilegible. -114-
  • 129. Apéndice B: Conceptos Básicos sobre Criptografía B.5.- Criptosistemas. Los criptosistemas están íntimamente relacionados con las matemáticas, es por ello que antes de nada, es conveniente definir qué entendemos “matemáticamente” por criptosistema. Un criptosistema matemático se define por los siguientes cuatro elementos: • Un conjunto finito llamado alfabeto, que según unas normas sintácticas y semánticas, permite emitir un mensaje en claro así como su correspondiente criptograma. • Un conjunto finito denominado espacio de claves formado por todas las posibles claves, tanto de encriptación como de desencriptación, del criptosistema. • Una familia de aplicaciones del alfabeto en sí mismo que denominamos transformaciones de cifrado. • Una familia de aplicaciones del alfabeto en sí mismo que denominamos transformaciones de descifrado. A su vez, los criptosistemas también están íntimamente relacionados con la informática, es por ello que es conveniente definir qué entendemos “informáticamente” por criptosistema. Un criptosistema informático se definiría por los siguientes cuatro elementos: • Un conjunto finito denominado alfabeto, que permite representar tanto el texto en claro como el criptograma. A bajo nivel hablaríamos de bits, y a más alto nivel podríamos hablar de caracteres ASCII o MIME. • Un conjunto finito denominado espacio de claves. Estaría constituido por la totalidad de las claves posibles del criptosistema. • Una familia de transformaciones transformaciones de cifrado. aritmético-lógicas que denominamos • Una familia de transformaciones transformaciones de descifrado. aritmético-lógicas que denominamos Se trata simplemente de un criptosistema adaptado a las posibilidades y limitaciones de un ordenador. El alfabeto o espacio de caracteres suele ser un estándar de representación de información (típicamente MIME o UNICODE por motivos de compatibilidad) y a más bajo nivel, por bits. Las transformaciones de cifrado y descifrado se ciñen a las normas de computación de los ordenadores actuales. En realidad, a efectos prácticos no existe mucha diferencia entre criptosistema matemático e informático, pues los matemáticos suelen diseñarse -115-
  • 130. Aplicación Software para el Desarrollo de Tareas Criptográficas pensando en representaciones computacionales (pues solamente los ordenadores tienen la potencia necesaria para soportar los complejos algoritmos), y los informáticos se desarrollan siempre con una base matemática. Suele ocurrir, debido al frenético avance de los computadores que ciertos criptosistemas puedan ser criptoanalizados por equipos convencionales, lo que con el tiempo hace que algunos vayan quedando obsoletos y necesiten de nuevas premisas. Fue el caso del DES descartado por el gobierno de USA, que dejo paso al Triple-DES, cuyo criptoanálisis necesitaba de mayor computo y el cual es otro de los algoritmos implementados en este proyecto. B.6.- Algoritmo criptográfico. Para definir un algoritmo criptográfico comenzaremos definiendo el término algoritmo, que se define como un conjunto ordenado y finito de operaciones que permite hallar la solución de un problema. Esta es la definición general pero para el caso concreto de la criptografía nos convendría una desde el punto de vista de la programación, es decir, aquella que lo define como una descripción precisa de una sucesión de instrucciones que permiten llevar a cabo un trabajo en un número finito de pasos. Así pues, un algoritmo debe describir de forma unívoca y sin dar lugar a interpretaciones, la solución a un problema en un número de pasos concreto. Ya podemos deducir qué es un algoritmo de encriptación: una descripción unívoca y concreta de cómo funciona un criptosistema determinado. B.7.- Clave criptográfica. El concepto de clave criptográfica surge con el propio concepto de la criptografía, y es el alma de un algoritmo de encriptación. Obviamente un algoritmo tiene que poseer la capacidad de ser usado muchas veces sin que su mecanismo sea idéntico, pues de lo contrario cada persona debería tener su propio algoritmo de encriptación, y créanme si ya es difícil implementarlos los conocidos, disponiendo de gran documentación cuan seria inventarlos. Pues bien, para implementar esta funcionalidad, se usan las claves. La clave es un dato que interviene de forma activa en la ejecución del algoritmo y lo personaliza. Atendiendo únicamente al tipo de clave, podemos distinguir dos tipos de criptosistemas (véase Apéndice C): • Sistemas de clave única o criptosistemas simétricos: Son aquellos en los que los procesos de cifrado y descifrado son llevados a cabo por una única clave. • Sistemas de clave pública o criptosistemas asimétricos: Son aquellos en los que los procesos de cifrado y descifrado son llevados a cabo por dos claves distintas y complementarias. -116-
  • 131. Apéndice B: Conceptos Básicos sobre Criptografía B.8.- Longitud de clave. Gracias a los ordenadores y los superordenadores (típicamente clusters) es posible realizar complejos cómputos matemáticos en un espacio de tiempo relativamente corto. Así pues, el campo del criptoanálisis está íntimamente ligado a esta potencia de cálculo. Para que un algoritmo se considere seguro, su criptoanálisis sin la clave necesaria debe ser computacionalmente imposible de resolver. Consideramos “imposible” de resolver un sistema cuya vulneración necesite mayores recursos (económicos o en tiempo) que el beneficio reportado. Por ejemplo, ser consideraría seguro un criptosistema que requiriera miles de años para ser descifrado. Para lograr semejante complejidad, se tratan números o conjuntos de números enormes. Es obvio que a mayor tamaño de estos números, existe un mayor número de claves posibles, y la posibilidad de éxito del criptoanálisis es menor. Hoy en día este tamaño se denomina longitud de clave, y se mide típicamente en los bits que ocupa la clave. Así, una clave de un número de 1024 bits sería un número cualquiera desde el 0 hasta el 1,8 * 10^308 (2^1024). Al representar las longitudes de clave como potencias de dos, es importante darse cuenta de la relación existente entre las longitudes de clave. Una clave de 1025 bits es el doble de larga que una de 1024 (2^1025 frente a 2^1024). Actualmente se usan claves que oscilan entre los 512 bits y los 4096 bits de longitud. B.9.- Base Matemática RSA. El RSA se basa en lo que en matemáticas se denomina aritmética modular y en los conceptos de primo, máximo común divisor y primos relativos, lo que implica el uso decimal. Todos estos conceptos conforman lo necesario para poder entender este algoritmo asimétrico. B.9.1.- Introducción a la aritmética modular. Aunque de entrada la aritmética modular por el nombre pueda asustar, resulta bien sencillo. Supongamos que nos ponemos a sumar o restar horas, en un reloj de esfera de 12 horas, nada de digitales. Si son las 8 y le sumamos 6 horas, nos quedan las 2. Es decir, cuando pasamos de 12 empezamos por el 1. Pues eso es la aritmética modular. En este caso sería módulo 12. Así podemos decir que (8 + 14) mod 12 = 10 (Figura B.2). La única diferencia es que en la aritmética modular incluimos el cero. Entonces en nuestro caso del reloj los números que existirían serían del 0 al 11. No habría por ejemplo el 12, porque "daría la vuelta" y pasaría a ser cero, o el 13 que pasaría a ser 1. Solo existen esos números. Ahora en módulo 7. Nuestro -117-
  • 132. Aplicación Software para el Desarrollo de Tareas Criptográficas universo de números sería {0,1,2,3,4,5,6}. Si hiciéramos 3*5, en los número reales sería 15, pero en módulo 7 serían 2 vueltas (7+7) y uno mas. Es decir,3*5mod7=1 Como vemos, en realidad lo que hacemos para calcular el módulo es dividir 15 entre 7 y quedarnos con el resto, que es 1. De esta misma forma, si dividimos 64 entre 7, nos sigue quedando que el resto es 1 (lo único que hemos hecho es "darle mas vueltas" al reloj), así que podemos decir que 64 = k*7 + 1. K nos da igual porque es el número de vueltas que le vamos a dar al reloj. De forma genérica, si un número a (el 64) mod n (el 7) = resto (el 1), su expresión seria la siguiente: a = k.n + resto. (B.1) Figura B.2: Aritmética modular comparada con las vueltas de un reloj. B.9.2.- Inversa de un número en aritmética modular. Para la explicación de la inversa de un número en aritmética modular [B.R.3.1-3.2] vamos a fijarnos en el mismo ejemplo anterior. Vemos que en mod 7, 3*5 = 1. Al igual que con los números reales, si dos números se multiplican y dan 1, es que son inversos (5 * 1/5 = 1). Así podemos decir que 3 y 5 son inversos en módulo 7. Pues existe una propiedad, para relacionarla con lo anterior, que dice que un número a tiene inversa módulo n , si no existe ningún número (excepto 1) menor que a y menor que n que los divida de forma exacta. Esto es a lo que se llama primos relativos. Por ejemplo 8 y 5 serían primos relativos, porque no hay ningún número que los divida, aunque 8 no sea primo. Su máximo común divisor es 1. En el caso del módulo 7, se tiene que todos los números (el cero no cuenta) tienen que tener inversa, porque 7 es primo absoluto y no va a existir ningún número que lo divida. B.9.3.- El número φ (phi). El número φ nos dice la cantidad de números que tienen inversa para un módulo. En nuestro caso, vemos que en el módulo 7, todo su conjunto de números, menos el cero, tienen inversa, porque 7 es un número primo y nos lo dice la -118-
  • 133. Apéndice B: Conceptos Básicos sobre Criptografía propiedad anterior. Es decir, hay 6 números (del 1 al 6) que tienen inversa, y si φ (7) nos dice la cantidad de números que tienen inversa, queda que φ (7) = 6 . De forma genérica, si n es un número primo, tenemos que φ se puede expresar como: φ (n) = n − 1 . (B.2) (El menos 1 es porque no contamos con cero). Por la misma razón, si n está formado por la multiplicación de dos números primos, es decir, n = pq , entonces podemos expresar φ tal que: φ (n ) = ( p − 1)(q − 1) (B.3) B.9.4.- Números Primos. Un numero es primo si solo es divisible por si mismo y por uno. B.9.5.- Máximo Común Divisor. El máximo común divisor de dos o más números es el mayor divisor posible de todos ellos. Para el cálculo del máximo común divisor de dos o más números se descompondrán los números en factores primos y se toman los factores comunes con su menor exponente. Por ejemplo, de las factorizaciones de 6936 y 1200, 6936 = 23 · 3 · 172 1200 = 24 · 3 · 52 Tenemos que su m.c.d. es 23 · 3 = 24 B.9.6.- Algoritmos de Euclides. El Algoritmo de Euclides [B.R.2.15] de entre sus muchas utilidades sirve para calcular el máximo común divisor de números grandes, puesto que en para ese caso el método ordinario anterior (B.9.5) no funciona. Para su explicación (Figura B.3) supongamos que tenemos el mismo ejemplo anterior: a= 6936 y b= 1200, datos a partir de los cuales entraríamos en el bucle que representa dicho algoritmo. B.9.7.- Primos Relativos. Dos números son primos relativos entre si, si cumplen que su máximo común divisor es uno. (Véase B.9.2) -119-
  • 134. Aplicación Software para el Desarrollo de Tareas Criptográficas MIENTRAS b>0 NO SI b SI Vuelta 1 2 3 …. 15 16 a 5736 4536 3336 …. 24 24 b 1200 1200 1200 …. 24 0 ¿Es a>b? NO a=a - b En a nos queda el b=b - a MCD Figura B.3: Algoritmo de Euclides. B.10.- Base Matemática DES. DES se puede resumir como una serie de permutaciones, sustituciones y XORs que se realizaran a nivel de bits. B.10.1.- Permutaciones. Las permutaciones realizadas son expansiones y comprensiones; adiciones y sustracciones; y desplazamientos de bits. Algunas serán fijas y otras dependerán de la clave y la ronda en la que nos encontremos. B.10.2.- Sustituciones. Las sustituciones se llevan a cabo mediante una serie de cajas llamadas SBox (fijas), en las que indicamos la sustitución mediante una posición de fila y columna. B.10.3.- Lógica Booleana. La lógica booleana es una lógica de conjuntos y nos sirve, principalmente, para definir formas de intersección entre conjuntos (Tabla B.2) La operación OR es suma y la operación AND es multiplicación. La operación XOR (OR exclusiva ” ⊕ ”) realiza la función booleana A!B+A!B -120-
  • 135. Apéndice B: Conceptos Básicos sobre Criptografía A 0 0 1 1 B 0 1 0 1 OR 0 1 1 1 A 0 0 1 1 B 0 1 0 1 AND 0 0 0 1 A NOT 0 1 1 0 A 0 0 1 1 B 0 1 0 1 XOR 0 1 1 0 Tabla B.2: Algebra Booleana. -121-
  • 139. Proyecto Fin de Carrera Apéndice C: Criptosistemas APÉNDICE C - Criptosistemas. C.1 Clasificación. Los criptosistemas se pueden clasificar según los tipos de claves que utilizan (simétrico o asimétricos) y el trato del mensaje que realizan a la hora de cifrarlo o descifrarlo (bloque o flujo). Simétricos o Asimétricos (clave privada o clave pública): Los simétricos son conocidos como sistemas de clave secreta, se utiliza la misma clave tanto para cifrar como para descifrar, por lo tanto, las distintas partes involucradas en la comunicación de los datos cifrados (emisor y receptor) deben compartir el conocimiento de esta clave. Los sistemas asimétricos o sistemas de clave pública utilizan dos claves, una para cifrar y la otra para descifrar, de tal manera que el criptograma producido por una de ellas sólo puede ser descifrado por la otra. Esta división de dos claves permite la existencia de lo que se ha venido a conocer como firmas digitales. (Figura C.1) Figura C.1: Simétrico o asimétrico según la clave en el transmisor y en el receptor. Si k=l → Criptosistema Simétrico Si k≠l → Criptosistema Asimétrico Bloque o Flujo: También podemos dividir los sistemas de cifrado según operen sobre bloques o sobre “streams” (flujos de bits). Los primeros dividen la información a cifrar en bloques de un determinado tamaño y aplican una serie de operaciones sobre ese bloque para producir el criptograma (Figura C.2). Los segundos, cifran la información bit a bit (Figura C.3). Ambas clasificaciones pueden superponerse, de forma que mientras que en los simétricos podremos distinguir entre los que cifran en flujo y los que cifran en bloque, en los asimétricos el cifrado será siempre en bloques. En los apartados siguientes se detallarán los algoritmos principales simétricos y asimétricos junto al tipo de cifrado de bloque o flujo que realizan. -125-
  • 140. Aplicación Software para el Desarrollo de Tareas Criptográficas Figura C.2: Cifrado por bloques. Figura C.3: Cifrado por flujo. C.2 Simétricos. Son los criptosistemas más sencillos. Como comentamos antes se trata de algoritmos que trabajan con una única clave de doble función (cifrado y descifrado). Dentro de los sistemas simétricos que exponemos a continuación tenemos aquellos que trabajan por medio de bloques (por ejemplo 64 bits) y los cifran bloque a bloque o los de cifrado de flujo, que cifran bit a bit o byte a byte, algunos algoritmos pueden tener las dos modalidades. También encontraremos aquellos que usan una longitud de clave fija o los que posibilitan una longitud de clave variada. Veamos pues los principales algoritmos criptográficos simétricos. C.2.1.- DES [B.R.1.1 y B.R.1.3-1.7] Nombre completo: Data Encryption Standard (1976). Descripción: Algoritmo simétrico de cifrado en bloques de 64 bits basado en LUCIFER (criptosistema interno de IBM). Fue ideado por IBM y aceptado por el NIST (National Institute of Standars and Technology) en 1976. Se trata de un algoritmo de 64 bits de clave de los cuales 56 bits componen la clave de cifrado propiamente dicha, mientras los 8 -126-
  • 141. Apéndice C: Criptosistemas restantes son de paridad y se usan para corrección de errores. Su funcionamiento se basa en permutaciones, sustituciones y XORs. DES actualmente ya no es estándar criptográfico y fue roto en Enero de 1999 con un sistema de cómputo que analizaba 250.000.000.000 claves por segundo. Su principal ventaja es la rapidez de cálculo y la sencillez de su implementación. Sus principales defectos son la poca longitud de clave que maneja, unido a la incapacidad de manejar claves de longitud variable; y su debilidad en un uso continuado de la misma clave, pues si se disponen de suficientes criptogramas, mediante criptoanálisis diferencial es posible romper la clave en 2^47 iteraciones. C.2.2.- Triple – DES. [B.R.1.8-1.9] Nombre completo: Triple - Data Encryption Standard (1995) Descripción: Dada la capacidad de cómputo actual y la relativa facilidad que supone romper el algoritmo DES, se desarrolló un sistema de triple aplicación al algoritmo DES, con tres claves diferentes para aplicar sucesivamente (en realidad se usa una clave externa dividida para aplicación intermedia dado que DES matemáticamente no es grupo, y su aplicación repetida ocasionaría un aumento efectivo de tamaño). Mediante este sistema se obtiene un cifrado de 192 bits (168 efectivos y 24 de paridad) con tres claves que resulta mucho más complejo de vulnerar. C.2.3.- AES (Rijndael). [B.R.1.10-1.12] Nombre completo: Advanced Encryption Standard (2000) Descripción: En 1977 el NIST organizó un concurso a nivel mundial para crear un sistema que cumpliera los requisitos de seguridad necesarios para convertirse en estándar a nivel mundial. Este estándar se denomina AES (Advanced Encryption Standard) y el algoritmo AEA (Advanced Encryption Algorithm). Muchos expertos presentaron sus propuestas, pero el ganador fue el conocido como algoritmo Rijndael, creado por los belgas Vincent Rijmen y Joan Daemen. Se trata de un algoritmo simétrico que puede funcionar mediante cifrado -127-
  • 142. Aplicación Software para el Desarrollo de Tareas Criptográficas en bloques de longitud variable o en flujo y que se sirve de claves de longitud variable (128, 192 ó 256 bits). Su funcionamiento se basa en sustituciones no lineales, trasposiciones de filas y mezclas de columnas. C.2.4.- IDEA [B.R.1.13-1.15] Nombre completo: International Data Encryption Algorithm (1990) Descripción: IDEA fue creado en 1990 por Xuejia Lai y L. Massey. Se trata de un algoritmo simétrico de cifrado en bloques de 64 bits. Trabaja con claves de 128 bits de longitud. Su funcionamiento se basa en operaciones sencillas como multiplicaciones de enteros, sumas y XORs. Es importante reseñar que IDEA es un algoritmo que si bien es de uso libre para fines no comerciales, sí que está cubierto por patentes, concretamente: • USA y Canadá - Patente 5.214.703 - Expira el 25 de Mayo de 2010. • Europa - Patente 0482154 - Expira el 16 de Mayo de 2011. • Japón - Patente JP3225440B2 - No hay información de la fecha de expiración. C.2.5.- RC6 [B.R.1.16-1.19] Nombre completo: Rivest Cypher 6 (1998) Descripción: RC6 fue uno de los finalistas del concurso AES del NIST. Fue ideado por el matemático Ron Rivest (autor de muchos y famosos algoritmos criptográficos) en 1998. El algoritmo es propiedad de la empresa RSA Security. RC6 supone la evolución de los algoritmos RC, RC2, RC4 y RC5. Concretamente, se trata de una adaptación del sistema RC5 para cumplir los requisitos del concurso AES. Se trata de un algoritmo simétrico de cifrado de flujo con claves de longitud variable entre 40 y 2040 bits, siendo por defecto 128. Su algoritmo se basa en una mezcla de sumas, restas, multiplicaciones, XORs y rotaciones. -128-
  • 143. Apéndice C: Criptosistemas C.2.6.- CAST – 256 [B.R.1.20-1.21] Nombre completo: Carlisle Adams - Stafford Tavares - 256 (1997) Descripción: CAST-256 fue desarrollado a partir del algoritmo CAST-128. Se trata de un algoritmo simétrico de cifrado en bloques de 128 bits que maneja claves de longitud variable: 128, 160, 192, 224, ó 256 bits. Su funcionamiento es muy complejo, combinando el sistema de permutación-rotación similar al utilizado por DES con otros sistemas más complejos, como combinaciones de XOR o uso de ffunciones (de tres formas distintas y excluyentes). C.2.7.- Twofish [B.R.1.22-1.23] Nombre completo: Twofish (1998) Descripción: Twofish es un algoritmo simétrico de cifrado en bloques de 64 bits. Supone la evolución natural de su antecesor, Blowfish, y fue otro de los cinco finalistas del concurso AES del NIST. El algoritmo es totalmente libre, tanto de patentes como de copyright. Twofish maneja claves de longitud variable 128, 192 ó 256 bits. Su funcionamiento se basa en el uso de permutaciones, sustituciones y XORs. Es muy potente a la par que extremadamente sencillo de implementar y rápido (18 ciclos por byte en una arquitectura Pentium I, más rápido que RC5, IDEA, DES, Triple DES, Serpent, Square, Cast-128, Feal-32, etc). Estas características le han llevado a ser incluido en el estándar SSH (Secure Shell). C.3 Asimétricos. Se trata de criptosistemas más modernos y complejos que los simétricos, a la vez que mucho más seguros. Se fundamentan en la existencia de un par de claves complementarias que denominamos clave pública y clave privada respectivamente (aunque ambas pueden actuar como pública o privada, su función la da el usuario mediante su utilización). Un criptograma generado por una de las claves puede ser descifrado únicamente por la otra clave, y viceversa. Cifran en bloque y con longitud de clave variante y a pesar de ser computacionalmente mucho más complejos, son el estándar hoy en día, usados -129-
  • 144. Aplicación Software para el Desarrollo de Tareas Criptográficas en sistemas que combinan cifrado asimétrico y simétrico (Pretty Good Privacy y Secure Socket Layer entre ellos). Estos sistemas duales aúnan las ventajas de ambos sistemas, pues un cifrado continuado en clave asimétrica requiere mucho esfuerzo computacional, y un sistema de clave simétrica no es seguro, pues necesita un canal seguro de traspaso de información para la clave. El cifrado asimétrico proporciona ese canal seguro de traspaso de información, y el uso de claves únicas en cifrado simétrico garantiza la seguridad a la vez que se reduce sensiblemente el nivel de recursos necesarios. Existen principalmente tres familias de algoritmos asimétricos, según el principio matemático en el que basan su potencia y seguridad: • Problema de la factorización entera: Estos algoritmos basan su seguridad en una debilidad de las máquinas de cómputo actuales. Para un computador es relativamente trivial el cálculo de enormes productos o potencias, pero el proceso contrario resulta muy costoso. Así pues, la potencia de estos algoritmos reside en que no existe un método eficiente para factorizar números enteros muy grandes. A esta familia pertenecen RSA (Rivest-Shamir-Adleman) y RW (RabinWilliams) entre otros. • Problema del logaritmo discreto del grupo multiplicativo de un campo finito: La potencia de los algoritmos basados en el problema del logaritmo discreto se basan en que no existe un método eficiente de calcular x a partir de la expresión y= ax (mod p) donde p es un número primo. Matemáticamente se trata de un método bastante más complejo, pero computacionalmente es igual de complicado que el problema de la factorización entera. A esta familia pertenecen DH (Diffie-Hellman), DSA (Digital Signature Algorithm), ElGamal y Nyberg-Rueppel entre otros. • Problema del logaritmo discreto sobre el grupo de puntos racionales de una curva elíptica sobre un campo finito: Este grupo es un derivado del problema del logaritmo discreto, solo que en lugar de estudiarlo en un grupo multiplicativo, lo estudia en curvas elípticas (no obstante este grupo es conocido también como “método de curvas elípticas”). Este método es relativamente moderno (surgió en 1986 de la mano de Miller). Estos algoritmos basan su potencia en que el cálculo de logaritmos sobre un sistema de curvas elípticas es computacionalmente aún más costoso que su cálculo sobre cuerpos finitos. -130-
  • 145. Apéndice C: Criptosistemas No hay muchos algoritmos de curvas elípticas definidos, pero no obstante existen versiones elípticas de los algoritmos DH (Diffie-Hellman) y ElGamal. Existe un cuarto grupo de criptografía asimétrica, los criptosistemas probabilísticos, que fundamentan su potencia en el hecho de que un mismo texto en claro puede dar lugar a un gran número de criptogramas distintos. Estos sistemas evitan la fuga de información que supone el cifrado asimétrico tradicional (PKCS) (C = E k (M)), pero no han sido muy estudiados aún, y mucho menos trasladados a criptosistemas informáticos. A continuación criptográficos asimétricos: vemos algunos de los principales algoritmos C.3.1.- DH/DSS [B.R.1.24-1.28] Nombre completo: Diffie - Hellman / Digital Standard Signature (1976 / 1991) Descripción: La historia del nacimiento del algoritmo DH/DSS es bastante compleja. En 1976, Dres. W. Diffie y M.E.Hellman publicaron el documento [DIH76] en el que nació el sistema Diffie-Hellman como algoritmo de intercambio de claves. En aquella época, Diffie y Hellman creían que su algoritmo no podía constituir un criptosistema asimétrico completo para cifrado de clave pública. Tuvieron que pasar muchos años hasta que en 1985 ElGamal publicara [ELG85] y demostrara que se podía desarrollar un criptosistema asimétrico completo a partir del sistema Diffie-Hellman, lo que supuso el nacimiento del algoritmo DH. Pero aún había un problema, pues el sistema de firma ideado por ElGamal ocasionaba que la firma de un mensaje ocupara el doble que el mensaje original, lo cual representaba un problema grave de eficiencia. Este problema fue corregido en 1991, cuando el NIST propuso un sistema de firma nuevo para el sistema Diffie-Hellman, que denominaron DSS (Digital Standard Signature). Así, en 1991 nació el algoritmo completo que hoy conocemos como DH/DSS. DH/DSS es un algoritmo de cifrado asimétrico basado en el problema del logaritmo discreto del grupo multiplicativo de un campo finito. Aunque matemáticamente es mucho más complejo con diferencia que el problema de la factorización entera, se ha demostrado que ambos son computacionalmente de una complejidad muy similar. Hay que decir, eso sí, que DH/DSS y los demás algoritmos basados en el problema del logaritmo discreto no tiene sobre su cabeza la espada de Damocles que supone el algoritmo de Shor para los criptosistemas basados en el problema de la factorización entera. -131-
  • 146. Aplicación Software para el Desarrollo de Tareas Criptográficas C.3.2.- RSA [B.R.1.1 y B.R.1.29-1.31] Nombre completo: Rivest - Shamir - Adleman (1978) Descripción: El algoritmo RSA nació en 1978 de la mano de Ron Rivest, Adi Shamir y Leonard Adleman [RSA78]. Se trata de un algoritmo de cifrado asimétrico basado en el problema de la factorización entera, y aunque la descripción de este algoritmo fue propuesta en 1973 por Clifford Cocks [COCK73], fue secreta hasta 1978 cuando se publicó RSA. Aunque el algoritmo fue patentado, la patente expiró en el año 2000 y actualmente se trata de un algoritmo libre. C.3.3.- ELGAMAL [B.R.1.32-1.34] Nombre completo: El Gamal (1984) Descripción: El algoritmo de ELGamal nació en 1984 y fue descrito por Taher ElGamal. Se trata de un algoritmo de cifrado asimétrico basado en la exponenciación discreta sobre el grupo multiplicativo de un cuerpo finito. La seguridad del algoritmo depende en la dificultad de calcular logaritmos discretos. C.3.4.- DSA [B.R.1.35-1.36] Nombre completo: Digital Signature Algorithm (1991) Descripción: Es un estándar del Gobierno Federal de los Estados Unidos de América o FIPS para firmas digitales. Fue un Algoritmo propuesto por el Instituto Nacional de Normas y Tecnología de los Estados Unidos para su uso en su Estándar de Firma Digital (DSS), especificado en el FIPS 186. DSA se hizo público el 30 de agosto de 1991, este algoritmo asimétrico como su nombre lo indica, sirve para firmar y para cifrar información. Se basa en el problema de la factorización entera, Una desventaja de este algoritmo es que requiere mucho más tiempo de cómputo que RSA. -132-
  • 147. Apéndice C: Criptosistemas C.3.5.- CCE [B.R.1.37-1.39] Nombre completo: Criptografía de Curva Elíptica (1985) Descripción: Es una variante de la criptografía asimétrica o de clave pública basada en las matemáticas de las curvas elípticas. Sus autores argumentan que la CCE puede ser más rápida y usar claves más cortas que los métodos antiguos — como RSA — al tiempo que proporcionan un nivel de seguridad equivalente. La utilización de curvas elípticas en criptografía fue propuesta de forma independiente por Neal Koblitz y Víctor Miller en 1985. -133-
  • 151. Proyecto Fin de Carrera Índices Extraordinarios I.1.- Cuadros de Código. Cuadro de Código 1.1: Cabecera de funciones y procedimientos de la 1ª Versión de la Aplicación…………………………………………………………………………………. 7 Cuadro de Código 1.2: Cálculo del resto “%” a sucesivos productos en Cifrar_Mensaje…7 Cuadro de Código 1.3: Cabecera de procedimientos de la 1ª Versión de la Aplicación DES…………………………………………………………………………………………9 Cuadro de Código 1.4: Definición de la clase “mirsa” con Qt…...……………………… 12 Cuadro de Código 1.5: Definición de la clase “mides” con Qt……………………………13 Cuadro de Código 1.6: Definición de la clase “miproject” con Qt………...………….17-18 Cuadro de Código 1.7: Definición de la clase “micriptosistema” con Qt...…………...22-24 Cuadro de Código 2.1: Cálculo de la lista de números primos...………………………... 38 Cuadro de Código 2.2: Cálculo del producto de los números primos (clave pública “n”)..39 Cuadro de Código 2.3: Mínimo Común Divisor por Euclides en su forma iterativa..……39 Cuadro de Código 2.4: Cálculo de la lista de claves públicas “e”………………………...40 Cuadro de Código 2.5: Cálculo de la clave privada “d”…………………………………. 41 Cuadro de Código 2.6: Cifrado RSA…...………………………….…………………….. 42 Cuadro de Código 2.7: Descifrado RSA…………………………….…………………….43 Cuadro de Código 2.8: Generación de subClaves en DES………………………………. 47 Cuadro de Código 2.9: Cifrado DES…………………………………………………..49-50 Cuadro de Código 2.10: Adición al principio del cifrado DES para conformar TDES…. 57 Cuadro de Código 2.11: Adición al final del cifrado DES para conformar TDES ..……..58 Cuadro de Código 2.12: Diálogo de Encriptado para la Gestión de Claves en RSA……..64 Cuadro de Código 2.13: Entrada del par de Claves Públicas de RSA y gestiones según se haya habilitado RSA Digital……………………………………………………………….65 -137-
  • 152. Aplicación Software para el Desarrollo de Tareas Criptográficas Cuadro de Código 2.14: Entrada de la Clave Privada de RSA y gestiones según se haya habilitado RSA Digital…………………………………………………………………….65 Cuadro de Código 2.15: Diálogo de Encriptado para la Gestión de la Clave en DES…...66 Cuadro de Código 2.16: Diálogo de Encriptado para la Gestión de la Clave en RSAD…67 I.2.- Figuras. Figura 1.1: Menú consola RSA (1ª Versión de la Aplicación desarrollada)……………….7 Figura 1.2: Cifrado DES (1ª Versión de la Aplicación DES)………………………………8 Figura 1.3: Cifrado y Descifrado DES (2ª Versión de la Aplicación DES)………………10 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++………………………………………………… 11 Figura 1.5: Esquema del proceso de trabajo para la Adaptación de la clase RSA y la clase DES a Qt…………………………………………………………………………………...15 Figura 1.6: Esquema del proceso de trabajo para el Diseño y desarrollo de la Interfaz de la Aplicación…………………………………………………………………………………19 Figura 1.7: Esquema del proceso de trabajo para la Gestión de claves e implementación de las clases TDES y RSA Digital……………………………………………………………25 Figura 1.8: Relación entre las clases implementadas……………………………………..32 Figura 1.9: Caminos posibles para las comunicaciones de los criptosistemas y el protocolo. ……………………………………………………………………………………………..33 Figura 2.1: Sistema RSA………………………………………………………………….37 Figura 2.2: Demostración del Descifrado en RSA………………………………………..44 Figura 2.3: Clave DES…………………………………………………………………….46 Figura 2.4: Cifrado en DES……………………………………………………………….55 Figura 2.5: Esquema de la función (f) y la generación de las subclaves………………….56 Figura 2.6: Esquema del algoritmo Triple DES…………………………………………..59 -138-
  • 153. Índices Extraordinarios Figura 3.1: La interfaz principal…………………………………………………………..72 Figura 3.2: Esquema de la interfaz principal……………………………………………...73 Figura 3.3: Esquema de la interfaz principal……………………………………………...73 Figura 3.4: Barra de Menús……………………………………………………………….74 Figura 3.5: Barra de Herramientas………………………………………………………..74 Figura 3.6: La interfaz del menú algoritmo……………………………………………….75 Figura 3.7: Esquema de la interfaz que proporciona los algoritmos criptográficos………76 Figura 3.8: La interfaz del menú RSA…………………………………………………….76 Figura 3.9: Esquema de la interfaz que proporciona el menú RSA………………………77 Figura 3.10: La interfaz del menú generar claves de RSA……………………………….77 Figura 3.11: La interfaz para la elección de un número primo de RSA………………….78 Figura 3.12: La interfaz para introducir la clave privada de RSA………………………..78 Figura 3.13: Esquema de la interfaz que proporciona el menú generar claves de RSA….79 Figura 3.14: La interfaz del menú cargar claves de RSA…………………………………79 Figura 3.15: La interfaz del menú manual de RSA……………………………………….80 Figura 3.16: Mensaje de error al introducir claves incorrectas…………………………...80 Figura 3.17: La interfaz del menú exportar desde archivo de RSA………………………81 Figura 3.18: Esquema de la interfaz que proporciona el menú cargar claves de RSA…...81 Figura 3.19: La interfaz del menú usar sesión de RSA…………………………………...82 Figura 3.20: Esquema de la interfaz que proporciona el usar claves de sesión de RSA….82 Figura 3.21: La interfaz del menú DES y TDES………………………………………….83 Figura 3.22: La interfaz para introducir la clave en DES y TDES………………………..83 Figura 3.23: Mensaje de error al introducir claves con longitud incorrecta en DES y TDES………………………………………………………………………………………84 -139-
  • 154. Aplicación Software para el Desarrollo de Tareas Criptográficas Figura 3.24: Esquema de la interfaz que proporciona el menú DES y TDES…………….84 Figura 3.25: La interfaz del menú RSAD…………………………………………………85 Figura 3.26: Esquema de la interfaz para el cifrado que proporciona el menú RSAD…...86 Figura 3.27: Esquema de la interfaz para el descifrado que proporciona el menú RSAD..86 Figura 3.28: La interfaz para introducir la clave simétrica……………………………….87 Figura A.1: Abrir CriptoYenet……………………………………………………………99 Figura A.2: Escribir texto en CriptoYenet………………………………………………...99 Figura A.3: Abrir en CriptoYenet………………………………………………………..100 Figura A.4: Abrir un documento CriptoYenet…………………………………………...100 Figura A.5: Documento cifrado de CriptoYenet abierto………………………………...101 Figura A.6: El texto señalado (esto activa las opciones criptográficas)…………………101 Figura A.7: Generando las Claves con RSA…………………………………………….103 Figura A.8: Cargando las Claves con RSA………………………………………………103 Figura A.9: Usando Claves de Sesión con RSA…………………………………………104 Figura A.10: Palabra cifrada con RSA…………………………………………………..104 Figura A.11: Definiendo clave o usando clave interior con DES……………………….105 Figura A.12: Definiendo clave DES o TDES para RSAD……………………………….105 Figura A.13: Aviso de cifrado de la clave privada simétrica…………………………….106 Figura A.14: Aviso para guardar la clave privada simétrica…………………………….106 Figura A.15: Aviso para la correcta ejecución de RSAD………………………………..107 Figura A.16: Cargando clave privada simétrica cifrada en RSAD………………………107 Figura B.1: Flujo de Información en un canal criptográfico…………………………….114 Figura B.2: Aritmética modular comparada con las vueltas de un reloj………………...118 Figura B.3: Algoritmo de Euclides………………………………………………………120 -140-
  • 155. Índices Extraordinarios Figura C.1: Simétrico o asimétrico según la clave en el transmisor y en el receptor……125 Figura C.2: Cifrado por bloques…………………………………………………………126 Figura C.3: Cifrado por flujo…………………………………………………………….126 I.3.- Tablas. Tabla 2.1: Permutación Tipo 1…………………………………………………………….47 Tabla 2.2: Desplazamiento de “mitadA_pT1” y “mitadB_pT1”, según la ronda……….. 48 Tabla 2.3: Permutación Tipo 2……………………………………………………………48 Tabla 2.4: Permutación Inicia…………………………………………………………….50 Tabla 2.5: Permutación de Expansión…………………………………………………….51 Tabla 2.6: S-Box 1………………………………………………………………………...52 Tabla 2.7: Permutación P………………………………………………………………….52 Tabla 2.8: Permutación Final (inversa de la Permutación Inicial)……………………..….52 Tabla 2.9: Desplazamiento de las mitades según la ronda para el descifrado…………….53 Tabla 2.10: Mismas subclaves para cada Clave Débil…………………………………….54 Tabla B.1: El Código de Cesar…………………………………………………………...102 Tabla B.2: Algebra Booleana…………………………………………………………….121 I.4.- Expresiones. Expresión 2.1: Generador de claves RSA……………..…………………………………. 38 Expresión 2.2: Inversa Modular RSA……………………….…………………………… 40 Expresión 2.3: Cifrado RSA………………………………………………………………41 Expresión 2.4: Descifrado RSA……….…………………………………………………..42 -141-
  • 156. Aplicación Software para el Desarrollo de Tareas Criptográficas Expresión 2.5: Expresión parte izquierda DES……………………………………………52 Expresión 2.6: Expresión parte derecha DES ………….…..……………………………..52 Expresión 2.7: Cifrado Triple DES………………………..…………..…………………..57 Expresión B.1: Resto modular……………………………………………………………118 Expresión B.2: Generador de claves……………………………………………………..119 -142-
  • 159. Proyecto Fin de Carrera Bibliografía-Referencia BIBLIOGRAFÍA – REFERENCIA B.R.1.- Criptografía. B.R.1.1. Amparo Fúster, Dolores de la Guía, Luís Hernández, Fausto Montoya, Jaime Muñoz: Técnicas criptográficas de protección de datos. 3ª Edición Actualizada, 2004 B.R.1.2. C. E. Shannon: A mathematical theory of communication. Bell System Technical Journal, vol. 27, pp. 379–423 and 623–656, July and October, 1948. B.R.1.3. C. E. Shannon: Communication theory of secrecy systems. Bell System Technical Journal, vol. 28, 656-715, 1949. B.R.1.4. Eli Biham, Adi Shamir, Differential Cryptanalysis of the Data Encryption Standard, Springer Verlag, 1993. ISBN 0-387-97930-1, ISBN 3-540-97930-1. B.R.1.5. John Gilmore, "Cracking DES: Secrets of Encryption Research, Wiretap Politics and Chip Design", 1998, O'Reilly, ISBN 1-56592-520-3. B.R.1.6. Documentación Oficial de DES: http://csrc.nist.gov/públications/fips/fips46-3/fips46-3.pdf B.R.1.7. Implicaciones del uso de DES: http://www.rfc-editor.org/rfc/rfc4772.txt B.R.1.8. John Gilmore, "Cracking DES: Secrets of Encryption Research, Wiretap Politics and Chip Design", 1998, O'Reilly, ISBN 1-56592-520-3. B.R.1.9. Amplia descripción de TDES: http://csrc.nist.gov/públications/nistpubs/800-67/SP800-67.pdf B.R.1.10. Joan Daemen and Vincent Rijmen, "The Design of Rijndael: AES - The Advanced Encryption Standard." Springer-Verlag, 2002. ISBN 3540425802. -145-
  • 160. Aplicación Software para el Desarrollo de Tareas Criptográficas B.R.1.11. Breve descripción con multitud de enlaces útiles de AES http://www.iaik.tu-graz.ac.at/research/krypto/AES/old/%7Erijmen/rijndael/ B.R.1.12. Entretenida explicación animada de AES http://www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf B.R.1.13. Xuejia Lai and James L. Massey and S. Murphy, Markov ciphers and differential cryptanalysis, Advances in Cryptology — Eurocrypt '91, Springer-Verlag (1992), pp17–38. B.R.1.14. Hüseyin Demirci, Erkan Türe, Ali Aydin Selçuk, A New Meet in the Middle Attack on The IDEA Block Cipher, 10th Annual Workshop on Selected Areas in Cryptography, 2003. B.R.1.15. Pagina Oficial de IDEA : http://www.mediacrypt.com/ B.R.1.16. Scott Contini, Ron Rivest, Matthew Robshaw, Yiqun Lisa Yin, The Security of RC6. B.R.1.17. Pagina Oficial de RC6: http://www.rsa.com/rsalabs/node.asp?id=2251 B.R.1.18. Amplia Descripción de RC6: http://people.csail.mit.edu/rivest/Rc6.pdf B.R.1.19. Resumida Presentación de por que elegir RC6: http://people.csail.mit.edu/rivest/rc6-final-4.ppt B.R.1.20. C. Adams, “Constructing Symmetric Ciphers Using the CAST Design Procedure”, in Selected Areas in Cryptography, E. Kranakis and P. Van Oorschot (ed.), Kluwer Academic Publishers, 1997, pp.71-104 B.R.1.21. Detallada descripción con ejemplos desde la base de CAST-256: (http://www.mirrors.wiretapped.net/security/cryptography/algorithms/aestesting/cast/cast-256.pdf) -146-
  • 161. Bibliografía-Referencia B.R.1.22. Bruce Schneier, John Kelsey, Doug Whiting, David Wagner, Chris Hall, Niels Ferguson (1998-06-15). B.R.1.23. Pagina Oficial con multitud de enlaces útiles de Twofish: http://www.schneier.com/twofish.html B.R.1.24. Diffie, W. y M.E.Hellman. "New directions in cyptography", IEEE Transactions on Information Theory 22 (1976), pp. 644-654. B.R.1.25. Diffie, W., P.C. van Oorschot y M.J. Wiener. "Authentication and authenticated key exchanges", Design, Codes and Cryptography 2 (1992), pp. 107-125. B.R.1.26. Descripción sencilla sin matemáticas de DH/DSS: http://www.netip.com/articles/keith/diffie-helman.htm B.R.1.27. Explicación visual de DH/DSS: http://www.xml-dev.com/blog/index.php?action=viewtopic&id=196 B.R.1.28. Anuncio del estándar de DH/DSS: http://www.itl.nist.gov/fipspubs/fip186.htm B.R.1.29. R. Rivest, A. Shamir, L. Adleman. A Method for Obtaining Digital Signatures and Public-Key Cryptosystems. Communications of the ACM, Vol. 21 (2), pp.120–126. B.R.1.30. Amplia descripción de RSA: http://es.wikipedia.org/wiki/RSA B.R.1.31. Breve explicación con enlaces a los métodos matemáticos usados en RSA: http://www.matematicas.net/paraiso/cripto.php?id=rsa1 B.R.1.32. Pino Caballero Gil: Introducción a la criptografía, 2ª Edición Actualizada. Cap 3 apartado 3 y Cap 4 apartado 4.2.4 B.R.1.33. Amplia descripción sobre el Gamal: http://es.wikipedia.org/wiki/Cifrado_ElGamal -147-
  • 162. Aplicación Software para el Desarrollo de Tareas Criptográficas B.R.1.34. Breve explicación sobre el Gamal: http://www.zooglea.com/criptografia/apuntes-de-criptografia-v-elgamal/ B.R.1.35. Richard A Mollin: An Introduction to Cryptography - 2006 - Página 187 B.R.1.36. Amplia descripción de DSA: http://en.wikipedia.org/wiki/Digital_Signature_Algorithm B.R.1.37. Hankerson, Menezes, Vanstone: "Guide to Elliptic Curve Cryptography", 2004 B.R.1.38. Blake, Seroussi, Smart, "Elliptic Curves in Cryptography", Cambridge University B.R.1.39. Amplia descripción de CCE: http://www.certicom.com/index.php?action=ecc_tutorial,home B.R.2.- Programación. B.R.2.1. “Curso de Programación”, McGraw Hill. (1993), 2. ISBN 84-481-1959-2 B.R.2.2. Lenguajes de Programación: http://www.monografias.com/trabajos/lengprog/lengprog.shtml B.R.2.3. Python, Java, C, C++ y Matlab en la Wikipedia: http://es.wikipedia.org/wiki/Python http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Java http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_C http://es.wikipedia.org/wiki/C%2B%2B http://es.wikipedia.org/wiki/MATLAB B.R.2.4. Curso para C y C++: http://c.conclase.net/ B.R.2.5. IDE Dev-Cpp http://www.bloodshed.net/devcpp.html -148-
  • 163. Bibliografía-Referencia B.R.2.6. IDE CodeBlock http://www.codeblocks.org/ B.R.2.7. Compilador MinGW: http://www.mingw.org/ B.R.2.8. Mínimo sistema GNU para Windows: http://www.mingw.org/msys.shtml B.R.2.9. Sistema GNU para Windows: http://www.cygwin.com/ B.R.2.10. Referencia de la API de las clases de Qt http://doc.trolltech.com/4.3/classes.html B.R.2.11. Foro sobre Qt http://www.qtforum.org/index.php B.R.2.12. Proyecto GNU: http://www.gnu.org/home.es.html B.R.2.13. Programación para usuarios de GNU/Linux http://bulma.net/ B.R.2.14. Documentación oficial sobre el uso de GMP: http://gmplib.org/gmp-man-4.2.2.pdf B.R.2.15. Algoritmo de Euclides: http://es.wikipedia.org/wiki/Algoritmo_de_Euclides B.R.2.16. GCC: http://gcc.gnu.org/ -149-
  • 164. Aplicación Software para el Desarrollo de Tareas Criptográficas B.R.3.- Matemáticas. B.R.3.1. Aritmética modular: http://es.wikipedia.org/wiki/Aritm%C3%A9tica_modular B.R.3.2. Aritmética modular y criptografía: http://imerl.fing.edu.uy/matdisc2/Archivos/curso2001/cripto2001.pdf B.R.3.3. Algebra Booleana: http://es.wikipedia.org/wiki/%C3%81lgebra_de_Boole B.R.4.- Software similar. B.R.4.1. Página Oficial de PGP: http://www.pgpi.org/ B.R.4.2. SSL en la Wikipedia: http://es.wikipedia.org/wiki/Transport_Layer_Security B.R.5.- Diseño. B.R.5.1. Página oficial de Photoshop: http://www.adobe.com/es/products/photoshop/photoshop/ B.R.5.2. Curso de Photoshop CS3: http://www.aulaclic.es/photoshopcs3/ B.R.5.3. Página oficial de Gimp: http://www.gimp.org.es/ -150-