librería criptogr´afica basada en componentes utilizando el lenguaje

Anuncio
LIBRERÍA CRIPTOGRÁFICA BASADA EN COMPONENTES UTILIZANDO
EL LENGUAJE DE PROGRAMACIÓN OZ
YULIBAN FERNANDO PENAGOS GÓMEZ
UNIVERSIDAD DISTRITAL FRANCISCO JOSÉ DE CALDAS
FACULTAD DE INGENIERÍA
INGENIERÍA DE SISTEMAS
BOGOTÁ
2015
LIBRERÍA CRIPTOGRÁFICA BASADA EN COMPONENTES UTILIZANDO
EL LENGUAJE DE PROGRAMACIÓN OZ
Yuliban Fernando Penagos Gómez
Informe Final
Director:
Ing. Henry Alberto Diosa, Ph.D.
UNIVERSIDAD DISTRITAL FRANCISCO JOSÉ DE CALDAS
FACULTAD DE INGENIERÍA
INGENIERÍA DE SISTEMAS
BOGOTÁ
2015
Tabla de Contenido
1 Introducción
1.1 Descripción del problema . . . . . . . . .
1.2 Objetivos . . . . . . . . . . . . . . . . . .
1.2.1 Objetivo general . . . . . . . . . .
1.2.2 Objetivos especı́ficos . . . . . . . .
1.3 Marco teórico . . . . . . . . . . . . . . . .
1.3.1 Seguridad . . . . . . . . . . . . . .
1.3.2 Tipos de Criptografı́a según el tipo
1.3.3 Algoritmos de Codificación . . . .
1.3.4 Fundamentos Matemáticos . . . .
1.4 Marco metodológico . . . . . . . . . . . .
1.4.1 Reutilización de Software . . . . .
1.4.2 Componentes . . . . . . . . . . . .
1.4.3 Metodologı́a de diseño: Proceso
Adaptado al DSBC . . . . . . . . .
1.4.4 UML 2.x . . . . . . . . . . . . . .
1.5 Marco tecnológico . . . . . . . . . . . . .
1.5.1 Lenguaje Oz . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
de clave . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
de Desarrollo
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
Unificado
. . . . . .
. . . . . .
. . . . . .
. . . . . .
1
2
3
3
3
3
3
4
5
6
9
9
9
13
22
23
23
2 Fase de Requerimientos: Modelo funcional basado en casos de Uso
2.1 Especificación de requerimientos . . . . . . . . . . . . . . . . . . . .
2.1.1 Requerimientos funcionales . . . . . . . . . . . . . . . . . . .
2.1.2 Requerimientos no funcionales . . . . . . . . . . . . . . . . .
2.2 Diagrama general de casos de uso . . . . . . . . . . . . . . . . . . . .
2.2.1 Descripción de los casos de uso, modelo extendido . . . . . .
2.3 Modelo conceptual de negocio . . . . . . . . . . . . . . . . . . . . . .
2.3.1 Descripción de Conceptos . . . . . . . . . . . . . . . . . . . .
26
26
26
27
29
29
36
36
3 Fase de Especificación:
Identificación de Componentes y
Arquitectura Prescriptiva
3.1 Identificación de interfaces . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Interfaces del sistema . . . . . . . . . . . . . . . . . . . . . .
3.1.2 Interfaces del negocio . . . . . . . . . . . . . . . . . . . . . .
3.1.3 Identificación de las operaciones de negocio . . . . . . . . . .
3.2 Especificación de la arquitectura (prescriptiva) basada en componentes
3.3 Especificación de componentes . . . . . . . . . . . . . . . . . . . . .
3.3.1 Especificación de interfaces . . . . . . . . . . . . . . . . . . .
39
39
39
39
40
46
48
48
iii
4 Fase de Provisión y Ensamble de Componentes
4.1 Arquitectura descriptiva de componentes . . . . .
4.2 Diagramas intercomponentes: refinamiento . . .
4.3 Modelos de Realización de Interfaces . . . . . . .
4.4 Modelado intra-componente . . . . . . . . . . . .
4.4.1 Modelos estructurales . . . . . . . . . . .
4.5 Modelos dinámicos intra-componente . . . . . . .
.
.
.
.
.
.
55
55
57
62
65
65
68
5 Modelado de la Interfaz Gráfica de Usuario y estructura de CD
5.1 Diagrama de navegación . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Estructura de CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
71
72
6 Manual de instalación y de usuario Librerı́a Criptográfica
6.1 Manual de configuración (dirigido a desarrolladores) . . . . . . . .
6.1.1 Requerimientos hardware para instalación . . . . . . . . . .
6.1.2 Requerimientos de software para instalación . . . . . . . . .
6.1.3 Procedimiento para instalación (dirigido a desarrolladores)
6.1.4 Código fuente y generación de ejecutable . . . . . . . . . .
6.2 Manual de instalación (orientado a usuario final) . . . . . . . . . .
6.3 Manual de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
73
73
73
74
75
75
75
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7 Conclusiones
80
8 Trabajo Futuro
85
Anexos
87
A Casos de uso
88
B Diagramas intercomponentes: Fase de especificación, Arquitectura
Prescriptiva
119
C Refinamiento Diagramas intercomponentes
121
D Modelos de realización de interfaces
123
E Modelos estructurales intra-componente
125
iv
Lista de Tablas
1.1
Subclaves (Zi ) empleadas en el algoritmo IDEA. . . . . . . . . . . .
7
2.1
2.2
Tabla de requerimientos funcionales para el algoritmo genético. . . .
Tabla de requerimientos no funcionales . . . . . . . . . . . . . . . . .
27
28
v
Lista de Figuras
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
Sistema Simétrico. [Adaptado de [1]] . . . . . . . . . . . . . . . . . .
Criptografı́a con clave pública. [Adaptado de [1]] . . . . . . . . . . .
Algoritmo IDEA [Adaptado de [2] ] . . . . . . . . . . . . . . . . . . .
Interfaces de requerimiento y de servicio [Elaboración propia] . . . .
Meta modelo de un componente [Tomado de [3, p.8]] . . . . . . . . .
Flujos de trabajo en el proceso de desarrollo [Adaptado de [4, p. 27]]
Capas de Arquitectura en el DSBC [Adaptado de [4, p. 11]] . . . . .
Dependencias entre componentes [Adaptado de [4, p. 13]] . . . . . .
Diagrama de componentes para un sistema de comercio electrónico.
[Tomado de [5, p.133]] . . . . . . . . . . . . . . . . . . . . . . . . . .
1.10 Estereotipado de notación de componentes en UML 2.x como functor
[Elaboración propia]. . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
5
7
12
14
15
19
20
2.1
2.2
Diagrama general de casos de uso . . . . . . . . . . . . . . . . . . . .
Diagramas de casos de uso para la carga de archivos [Elaboración
propia basada en UML] . . . . . . . . . . . . . . . . . . . . . . . . .
Diagramas de casos de uso para codificación de texto [Elaboración
propia basada en UML] . . . . . . . . . . . . . . . . . . . . . . . . .
Diagramas de casos de uso para la decodificación [Elaboración propia
basada en UML] . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modelo conceptual . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
Modelo de tipos inicial . . . . . . . . . . . . . . . . . . . . . . . . . .
Arquitectura basada en componentes . . . . . . . . . . . . . . . . . .
Diagrama de secuencia CU017. Almacenar Archivo [Elaboración
propia] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operaciones IGestorArchivo . . . . . . . . . . . . . . . . . . . . . . .
Diagrama de secuencia CU002. Codificar [Elaboración propia] . . . .
Diagrama de secuencia CU006. Decodificar [Elaboración propia] . .
Operaciones interfaces de negocio . . . . . . . . . . . . . . . . . . . .
Arquitectura prescriptiva basada en componentes . . . . . . . . . . .
Modelo de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interface de sistema ICodificar [Elaboración propia] . . . . . . . . . .
Interface de sistema IDecodificar [Elaboración propia] . . . . . . . .
Interface de sistema ICargarArchivo [Elaboración propia] . . . . . .
Interface de sistema IGenerarLlaves [Elaboración propia] . . . . . . .
Interface de sistema IConsultarAyuda [Elaboración propia] . . . . .
41
42
2.3
2.4
2.5
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.9
3.8
3.10
3.11
3.14
3.15
3.12
vi
23
25
30
32
34
38
42
43
44
45
46
46
47
48
48
48
48
49
3.13 Interface de sistema AlmacenarArchivo [Elaboración propia] . . . . .
3.16 Interface de negocio IGestorOperacionesMatematicas [Elaboración
propia] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.17 Interface de negocio IGestorArchivo [Elaboración propia] . . . . . . .
3.18 Interface de negocio IGeneradorClave [Elaboración propia] . . . . . .
3.19 Interface de negocio ICodificadorIDEA [Elaboración propia] . . . . .
3.20 Interface de negocio ICodificadorRSA [Elaboración propia] . . . . . .
3.21 Interface de negocio IGestorNumero [Elaboración propia] . . . . . .
4.1
4.2
4.3
4.4
4.5
4.6
49
50
50
51
52
53
54
Arquitectura descriptiva del sistema [Elaboración propia] . . . . . .
Refinamiento CU001. Cargar Archivo [Elaboración propia] . . . . . .
Refinamiento CU017. Almacenar Archivo [Elaboración propia] . . .
Refinamiento CU002. Codificar [Elaboración propia] . . . . . . . . .
Refinamiento CU006. Decodificar [Elaboración propia] . . . . . . . .
Diagrama de realización componente CodificadorIDEA [Elaboración
propia] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Diagrama de realización componente CodificadorRSA [Elaboración
propia] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Diagrama de realización componente GeneradorClave [Elaboración
propia] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modelo estructural CodificadorIDEA [Elaboración propia] . . . . . .
Modelo estructural componente CodificadorRSA [Elaboración propia]
Modelo estructural componente GeneradorClave [Elaboración propia]
Diagrama de secuencia para la codificación utilizando RSA
[Elaboración propia basada en UML] . . . . . . . . . . . . . . . . . .
Diagrama de secuencia para la codificación usando IDEA[Elaboración
propia basada en UML] . . . . . . . . . . . . . . . . . . . . . . . . .
Diagrama de secuencia para la generación de llaves [Elaboración
propia basada en UML] . . . . . . . . . . . . . . . . . . . . . . . . .
56
58
59
60
61
5.1
5.2
Mapa de navegación Sistema de codificación . . . . . . . . . . . . . .
Estructura CD anexo . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
72
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
6.10
6.11
Generación de claves RSA [Elaboración propia] . .
Generación de claves RSA [Elaboración propia] . .
Selección archivo [Elaboración propia] . . . . . . .
Selección archivo [Elaboración propia] . . . . . . .
Contenido del archivo cargado [Elaboración propia]
Codificación [Elaboración propia] . . . . . . . . . .
Selección de la clave requerida [Elaboración propia]
Contenido codificado [Elaboración propia] . . . . .
Decodificación [Elaboración propia] . . . . . . . . .
Selección de la clave requerida [Elaboración propia]
Archivo decodificado [Elaboración propia] . . . . .
76
76
76
77
77
77
78
78
78
79
79
7.1
7.2
7.3
Arquitectura prescriptiva basada en componentes . . . . . . . . . . . 81
Arquitectura prescriptiva basada en componentes [Elaboración propia] 82
El generador de claves deja de funcionar [Elaboración propia] . . . . 83
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
vii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
63
64
65
65
66
67
68
69
70
A.1 Diagramas de casos de uso para codificación de texto mediante RSA
[Elaboración propia basada en UML] . . . . . . . . . . . . . . . . . .
A.2 Diagramas de casos de uso para codificación de texto por bloques
mediante RSA [Elaboración propia basada en UML] . . . . . . . . .
A.3 Diagramas de casos de uso para codificación de texto mediante IDEA
[Elaboración propia basada en UML] . . . . . . . . . . . . . . . . . .
A.4 Diagramas de casos de uso para codificación de texto por bloques
mediante el algoritmo IDEA [Elaboración propia basada en UML] .
A.5 Diagramas de casos de uso para la decodificación [Elaboración propia
basada en UML] . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.6 Diagramas de casos de uso para la decodificación usando el algoritmo
RSA [Elaboración propia basada en UML] . . . . . . . . . . . . . . .
A.7 Diagramas de casos de uso para la decodificación usando el algoritmo
IDEA [Elaboración propia basada en UML] . . . . . . . . . . . . . .
A.8 Diagramas de casos de uso para la consulta de ayuda [Elaboración
propia basada en UML] . . . . . . . . . . . . . . . . . . . . . . . . .
A.9 Diagramas de casos de uso para la generación de llaves RSA
[Elaboración propia basada en UML] . . . . . . . . . . . . . . . . . .
A.10 Diagramas de casos de uso para generación de números aleatorios
[Elaboración propia basada en UML] . . . . . . . . . . . . . . . . . .
A.11 Diagramas de casos de uso para la generación de claves del algoritmo
IDEA [Elaboración propia basada en UML] . . . . . . . . . . . . . .
A.12 Diagramas de casos de uso para la generación de subclaves de
codificación del algoritmo IDEA [Elaboración propia basada en UML]
A.13 Diagramas de casos de uso para la generación de subclaves de
decodificación algoritmo IDEA [Elaboración propia basada en UML]
A.14 Diagramas de casos de uso para el almacenamiento de archivos
[Elaboración propia basada en UML] . . . . . . . . . . . . . . . . . .
A.15 Diagramas de casos de uso para la generación de llaves [Elaboración
propia basada en UML] . . . . . . . . . . . . . . . . . . . . . . . . .
A.16 Diagramas de casos de uso para procesamiento del texto de entrada
[Elaboración propia basada en UML] . . . . . . . . . . . . . . . . . .
B.1
B.2
B.3
B.4
Arquitectura prescriptiva basada en componentes . . . . . .
Operaciones IConsultarAyuda [Elaboración propia] . . . . .
Diagrama de secuencia CU018. Generar Llaves [Elaboración
Operaciones interfaces de negocio . . . . . . . . . . . . . . .
. . . . .
. . . . .
propia]
. . . . .
88
90
92
94
96
98
100
101
103
105
107
109
111
113
115
117
119
119
120
120
C.1 Refinamiento CU010. Consultar Ayuda [Elaboración propia] . . . . . 121
C.2 Diagrama de secuencia CU018. Generar Llaves [Elaboración propia] 122
D.1 Diagrama de realización componente GestorArchivo [Elaboración
propia] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
D.2 Diagrama de realización componente GestorInformacion [Elaboración
propia] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
D.3 Diagrama de realización componente ComponenteMatematico
[Elaboración propia] . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
E.1 Diagrama intra-componente del GestorArchivo [Elaboración propia]
viii
125
E.2 Diagrama intra-componente del GestorInformacion [Elaboración
propia] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
E.3 Diagrama
intra-componente
del
ComponenteMatematico
[Elaboración propia] . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
ix
c 2015 Yuliban Fernando Penagos., Henry A. Diosa
Copyright A mi familia que con esfuerzo me ha ayudado a llegar más lejos de lo que ellos
mismos esperaban, a mis hijos, fuente diaria de motivación,a Lorena, fantástica
casualidad, apoyo incondicional y, especialmente, al director de este proyecto que
ofreció su guı́a, dedicación y tiempo para su realización.
Capı́tulo 1
Introducción
En la actualidad los sistemas de software hacen parte de la mayorı́a de actividades
que se realizan en el mundo que habitamos. Actividades que van desde ofrecer
publicidad o información hasta gestionar procesos más complejos en diferentes tipos
de compañı́as.
Este uso generalizado ha impactado en el tamaño y en el grado de complejidad
de los sistemas que a su vez ha incurrido en el surgimiento de diferentes tecnologı́as
que se adapten a las diferentes necesidades, dentro de las cuáles ha surgido el
Desarrollo de Software Basado en Componentes (DSBC) que propone la construcción
de grandes sistemas a partir de partes que puedan ser ensambladas y dar respuesta
a los requerimientos de determinado modelo de negocio.
Esta manera de desarrollo (componentes) se asimila a la manera en que se
construyen otros productos en otras áreas [6] como la industria automotriz, la
electrónica o incluso el sector de la construcción de grandes estructuras, entre
otras; por ejemplo ampliar las capacidades de un computador o repararlo es posible
sustituyendo componentes del mismo.
Lo que pretende el DSBC es generar componentes que se encarguen de ofrecer
una funcionalidad para posteriormente ensamblarse en una estructura completa.
Esta metodologı́a no solo busca disminuir la complejidad en la construcción del
sistema, gracias al uso de componentes es posible aumentar el factor de reuso del
software ya que un componente podrı́a ser usado en más de un dominio o modelo
de negocio.
La seguridad de la información es el otro aspecto que ha sido estudiado durante
las décadas recientes, especialmente a partir del surgimiento y gran auge del Internet.
El hecho es que la información viaja grandes distancias y está expuesta a ser
interceptada por personas que podrı́an resultar indeseables, y aunque la idea inicial
es impedir que se logre tener dicho acceso, el caso es que la posibilidad de que
suceda siempre está presente, por lo que se han creado algoritmos que se encargan
de esconder información a un posible atacante por medio de codificación de la misma.
1
Por medio de estos algoritmos las compañı́as pretenden proteger aquella
información que es fundamental para su continuidad y crecimiento, como por
ejemplo los estados financieros, los clientes con que cuentan, los planes de negocio,
entre otros tantos. De esta manera, en caso de que la información sea interceptada,
el tiempo y recursos que se deberán emplear para el descifrado de su contenido,
serán mayores al valor que se pueda obtener de ella.
Este proyecto se enfoca en la aplicación del DSBC a un caso particular
relacionado con la creación de una librerı́a de algoritmos criptográficos, de forma que
se vean reflejadas las bondades y caracterı́sticas que nos ofrece esta metodologı́a. En
la fase de construcción se hará uso del lenguaje de programación Oz para corroborar
su fortaleza en la realización de componentes de software.
1.1
Descripción del problema
El problema consiste en generar una abstracción que modele los algoritmos RSA e
IDEA usando el DSBC, abarcando análisis, diseño y construcción de los componentes
que se identifiquen y sean necesarios para obtener la funcionalidad que estos
algoritmos ofrecen y sirvan como artefactos iniciales que harán parte de una
librerı́a de componentes de codificación que pueda ser extendida añadiendo nuevos
componentes y reutilizando o reemplazando otros para la creación de nuevos
algoritmos o la mejora de los existentes. Los algoritmos escogidos, en un análisis
inicial comparten algunas funcionalidades que pueden ser modeladas dentro de
alguno de los componentes que se identifiquen permitiéndonos aprovechar el reuso
de componentes, una de las principales caracterı́sticas del modelo de desarrollo que
seguiremos.
2
1.2
1.2.1
Objetivos
Objetivo general
Diseñar y construir una librerı́a de componentes de codificación con los reconocidos
algoritmos RSA e IDEA usando el DSBC de manera que podamos aprovechar las
diferentes caracterı́sticas y beneficios descritos por su autor [4]. La implementación
de esta librerı́a será realizada en el lenguaje OZ usando la abstracción de componente
mediante el uso de functores propuesta por Henry Diosa [7].
1.2.2
Objetivos especı́ficos
• Analizar, diseñar, construir y, de ser posible, realizar aprovisionamiento de
los componentes que cumplirán con la funcionalidad de los algoritmos de
codificación antes mencionados.
• Construir una versión inicial de una librerı́a que en su inicio contará con
los algoritmos IDEA y RSA para que, en posteriores etapas o incluso en
otros proyectos, se desarrollen mejoras o se extiendan funcionalidades de la
librerı́a, ya sea incluyendo nuevos algoritmos o modificando y/o añadiendo
funcionalidades a los componentes existentes.
• Utilizar el lenguaje de programación OZ y su implementación de componente
mediante la definición de functor para crear y alambrar los componentes que se
identifiquen y sean requeridos para alcanzar el objetivo descrito anteriormente.
1.3
1.3.1
Marco teórico
Seguridad
Los conceptos descritos a lo largo de esta Sección, contextualizan la importancia y
principales caracterı́sticas que conllevan la seguridad, para un mejor entendimiento
de la necesidad de crear y usar algoritmos de codificación.
1.3.1.1
Criptologı́a
La criptologı́a [1] se puede definir simplemente como el estudio de dos ramas ligadas:
la criptografı́a y el criptoanálisis, que se definirán posteriormente.
1.3.1.2
Criptosistema
Un criptosistema comprende el lugar y elementos necesarios para que la codificación
y decodificación sea llevada a cabo. Si se desea ser un poco más riguroso, se define
un criptosistema como una quı́ntupla (M, C, K, E, D) [8], en donde:
• M representa los mensajes en texto claro, lo que comúnmente es llamado texto
plano.
• C representa el conjunto de los mensajes que han sido cifrados, llamados
criptogramas.
3
Figura 1.1: Sistema Simétrico. [Adaptado de [1]]
• K se refiere a las posibles claves de codificación, usadas en el criptosistema.
• E es la transformación (algoritmo de codificación) aplicada al elemento
mensaje M, para convertirlo en el mensaje cifrado C.
• D se refiere a la transformación de descifrado, es decir, el proceso inverso de
la transformación E.
Todo criptosistema cumple con la siguiente condición:
Dk (Ek (m)) = m
1.3.2
Tipos de Criptografı́a según el tipo de clave
Las técnicas de criptografı́a moderna se pueden clasificar en dos tipos, según el tipo
de clave [1], estas son: Criptografı́a simétrica y criptografı́a asimétrica. En el caso de
estudio actual, el algoritmo RSA utiliza los dos tipos de criptografı́a. Esta Sección
contiene descripciones breves de las caracterı́sticas de estas técnicas.
1.3.2.1
Criptografı́a simétrica o de clave privada
La criptografı́a simétrica es el sistema más antiguo que se ha empleado. Su principal
caracterı́stica es el uso de una misma clave para codificar y para decodificar [1], como
se puede ver en la Figura 1.1.
1.3.2.2
Criptografı́a asimétrica o de clave pública
El concepto fue introducido por Whitfield Diffie y Martin Hellman a mediados de
los 70’s, con su artı́culo New directions in cryptography [9]. La criptografı́a de clave
pública propone el uso de una clave para codificar y otra para decodificar. La idea
principal de este tipo de criptografı́a, es que cualquier usuario puede tener acceso a
cualquier clave pública de otro, en una comunidad (como se puede ver en la gráfica
1.2) esta clave le servirá al usuario (por ejemplo Yuliban) para codificar un mensaje y
que solo el dueño de la clave privada pueda decodificar el mensaje. Con este sistema
se asegura la confidencialidad, al igual que con los sistemas simétricos, autenticación
y se puede realizar firma digital, además de evitar el problema de la distribución de
las claves simétricas.
4
Figura 1.2: Criptografı́a con clave pública. [Adaptado de [1]]
1.3.3
1.3.3.1
Algoritmos de Codificación
Algoritmo RSA
El algoritmo de codificación RSA, llamado ası́ por sus creadores Ron Rivest, Adi
Shamir y Led Adleman en MIT y tuvo su primera publicación en 1978 [10], y estuvo
bajo patente por los Laboratorios RSA hasta el 20 de septiembre del 2000. El
algoritmo RSA es muy popular para trasmitir datos a través de canales inseguros,
es tal vez uno de los algoritmos asimétricos mas sencillos de entender e implementar
Funcionamiento:
Los pasos para describir el algoritmo RSA, son:
1. Se escogen dos números primos p y q significativamente grandes (de más de
doscientas cifras), y se multiplican, obteniendo n = p ∗ q.
2. El receptor obtiene el valor de la función multiplicativa de Euler (ver Sección
5.7.3) (Φ(n)), que será calculada por: Φ(n) = Φ(p ∗ q) = Φ(p)Φ(q) =
(p − 1) ∗ (q − 1), esta igualdad se cumple, dado que p y q son primos entre sı́,
y cada uno de ellos es un número primo.
3. El receptor escoge un número e tal que 1 < e < Φ(n) de manera que sea primo
relativo con Φ(n), y calcula su inverso en módulo Φ(n), que será llamado d:
d = [(e(−1) )](Φ(n) )
4. La combinación de los números generados (d, n), es la llamada clave privada,
y el par de números (e, n), es la llamada clave pública.
5. El mensaje es codificado mediante la ecuación:
Enc(x) = xe (mod n),
siendo x el valor a codificar.
6. Para recuperar el mensaje, se utiliza el par de llaves privadas, y la ecuación:
Des(y) = y d (mod n),
siendo y el valor a decodificar.
5
1.3.3.2
Algoritmo IDEA
El algoritmo IDEA (International Data Encryption Algorithm) tuvo su primera
publicación en 1990 por Lai y Massey del Swiss Federal Institute of Technology. En
1992 se publicó la segunda versión, la cual es resistente a ataques de criptografı́a
diferencial, no presenta claves débiles (existe una excepción pero la probabilidad de
hallarlas es de 1 entre 296 , por lo que no es considerado como un peligro real) y
su longitud de clave hace imposible practicar un ataque por fuerza bruta [8]. Una
de sus mayores bondades es que es un algoritmo de libre distribución, lo cual lo ha
convertido en uno de los algoritmos más populares, sobre todo en Europa. Es un
algoritmo de cifrado por bloque. Usa bloques de 64 bits y claves de 128 bits. El
corazón del algoritmo son tres operaciones básicas que son:
• XOR: Operación bit a bit, que retorna 1 solo cuando uno de los dos bits es 1.
• Suma módulo 216 : Suma normal, y luego se aplica el módulo 216 .
• Producto módulo 216 + 1: Se realiza la multiplicación y se calcula el módulo
216 + 1.
Funcionamiento:
Generación de subclaves: A partir de la clave de 128 bits se generan 52 claves,
cada una de 16 bits, representadas como K0,1..i..,51 , que se necesitarán a lo largo del
algoritmo. Las primeras 8 sub claves se generan dividiendo en grupos de 16 bits la
clave de 128 bits. Para obtener las siguientes 8 sub claves (9 a la 16) se realiza una
rotación de 25 posiciones a la izquierda y se toman igual que las 8 primeras. Para
las siguientes se realiza el mismo proceso.
Pasos del algoritmo: El texto X de 64 bits a codificar, se divide en 4 partes
(XA , XB , XC , XD ) cada una de 16 bits [8]. En la Figura 1.3 se muestra el diagrama
bloques que muestra el flujo de operaciones del algoritmo.
Decodificación El proceso de descifrado se logra básicamente con la misma
estructura descrita en la Figura 1.3, solo que se utiliza una diferente selección de
subclaves. Las claves de descifrado Z0,1..i..,51 son obtenidas según lo definido en la
Tabla 1.1 [11]:
Primero es necesario cambiar de orden las subclaves (Zi ) para luego calcular
sus inversas multiplicativas (Zi−1 ) y aditivas −Zi [11] [8]. Es decir que a partir de
cada subclave debe obtenerse su inverso, sea multiplicativo o aditivo, de acuerdo a
la Tabla 1.1. En el caso de la subclave (Z49 ), por ejemplo, la tabla nos indica que
−1
se debe calcular su inverso multiplicativo que serı́a notado como (Z49
).
1.3.4
1.3.4.1
Fundamentos Matemáticos
Algoritmo de Euclides
El algoritmo de Euclides permite el cálculo del máximo común divisor (MCD) entre
dos números enteros. El algoritmo parte del teorema de la división, el cual nos dice
6
Figura 1.3: Algoritmo IDEA [Adaptado de [2] ]
Ronda
1
2
3
4
5
6
7
8
Final
Subclaves de Cifrado
Z1
Z7
Z 13
Z 19
Z 25
Z 31
Z 37
Z 43
Z 49
Z2
Z8
Z 14
Z 20
Z 26
Z 32
Z 38
Z 44
Z 50
Z3
Z9
Z 15
Z 21
Z 27
Z 33
Z 39
Z 45
Z 51
Z4
Z 10
Z 16
Z 22
Z 28
Z 34
Z 40
Z 46
Z 52
Z5
Z 11
Z 17
Z 23
Z 29
Z 35
Z 41
Z 47
Subclaves de Descifrado
Z6
Z 12
Z 18
Z 24
Z 30
Z 36
Z 42
Z 48
Z −1
49
Z −1
43
Z −1
37
Z −1
31
Z −1
25
Z −1
19
Z −1
13
Z −1
7
Z −1
1
−Z 50
−Z 45
−Z 39
−Z 33
−Z 27
−Z 21
−Z 15
−Z 9
−Z 2
−Z 51
−Z 44
−Z 38
−Z 32
−Z 26
−Z 20
−Z 14
−Z 8
−Z 3
Tabla 1.1: Subclaves (Zi ) empleadas en el algoritmo IDEA.
7
Z −1
52
Z −1
46
Z −1
40
Z −1
34
Z −1
28
Z −1
22
Z −1
16
Z −1
10
Z −1
4
Z 47
Z 41
Z 35
Z 29
Z 23
Z 17
Z 11
Z5
Z 48
Z 42
Z 36
Z 30
Z 24
Z 18
Z 12
Z6
[8]:
∀ a Z, b N existen unos únicos q, r Z, tales que : a = q • b + r, 0 ≤ r < b
La idea básica del algoritmo es realizar la división de a entre b, si el ri = 0 entonces
se dice que M.C.D.(a, b) = b. Si no, se divide q (el coeficiente) entre ri , si ri = 0
entonces M.C.D.(a, b) = ri , si no, se continúa hasta hallar un ri = 0.
El Algoritmo 1 describe una forma de implementar lo mencionado en los párrafos
anteriores[8]:
Algoritmo 1 Algoritmo de Euclides [Tomado de [8]]
i ← 1;
g[0] ← a;
g[1] ← b;
while g[i] 6= 0 do
g[i + 1] ← g[i − 1]%g[i];
end while
return (g[i − 1]);
1.3.4.2
Algoritmo Extendido de Euclides
El algoritmo extendido de Euclides, es un algoritmo muy eficiente para calcular el
MCD de dos números a y b. Para aplicar este algoritmo[8]:
• Se realiza la división de a entre b (y se deja expresado), donde a > b,
a = b • r + q.
• Si q es 0 se toma el mcd(a, b) = mcd(b, r), sino se toma b y se divide por q. Y
se continúa hasta que q = 0.
A continuación se presenta una posible implementación del algoritmo.
Algoritmo 2 Algoritmo extendido de Euclides [Tomado de [8]]
g[0] ← n; g[1] ← a;
u[0] ← 1; u[1] ← 0;
v[0] ← 0; v[1] ← 1;
i←1
while g[i] 6= 0 do
c ← g[i − 1] ÷ g[i];
g[i + 1] ← g[i − 1]%g[i];
u[i + 1] ← u[i − 1] − (c ∗ u[i]);
v[i + 1] ← v[i − 1] − (c ∗ v[i]);
i++
end while
while v[i − 1] ≥ 1 do
v[i − 1] ← v[i − 1] + n;
end while
return (v[i − 1]%n);
8
1.3.4.3
Función Multiplicativa de Euler
El objetivo de la función multiplicativa de Euler es determinar cuántos primos
relativos posee un número r.
Definición: Se define la función multiplicativa de Euler, φ(r), como el número de
números enteros mayores o iguales que 1 y menores que r que son primos relativos
con él, es decir[8]:
φ(r) = #f {s/s ≥ 1 y s < r , con : mcd(s, r) = 1}
donde # denota el cardinal conjunto.
Veamos ahora como, dado un número r, podemos calcular el valor de φ(r):
1. Si r es primo, φ(r) = r − 1
2. Si r es el producto de dos números primos entre s, o sea, r = p ∗ q con
mcd(p, q) = 1, entonces φ(r) = φ(p) ∗ φ(q)
3. Si r = p ∗ k con p primo, entonces φ(r) = pk − pk−1 = pk (p − 1)
1.4
1.4.1
Marco metodológico
Reutilización de Software
El uso de componentes de software en la construcción de sistemas permite que
software prefabricado pueda ser usado en nuevos desarrollos, contribuyendo de
manera positiva en una caracterı́stica deseable en todo software, denominada
reutilización, lo que implica que los componentes y la reutilización de software
son temas complementarios [12]; sin embargo, la reutilización de software no
necesariamente depende de si se usan o no componentes ya que es posible alcanzar
este aspecto a través de otros enfoques.
En torno al concepto de reutilización de software existen varios conceptos
generados por diferentes autores, para nuestro propósito entenderemos este concepto
de manera concreta como la capacidad de utilizar software previamente elaborado
para crear nuevos sistemas de software sin tener que partir de cero o para extender
la funcionalidad de un sistema existente.
1.4.2
Componentes
Definiciones para este concepto dentro de la literatura se encuentran muchas y
aunque existen bastantes similitudes entre cada una, es posible que la interpretación
que cada autor asigne a los aspectos descritos en su definición sea diferente.
Otro problema que surge con este término es la confusión que existe entre lo que
es un componente y lo que es un objeto y las caracterı́sticas y propiedades que los
diferencian. Posteriormente hablaremos un poco más acerca de esta cuestión. Lo
que si es posible afirmar dentro del DSBC es que el término componente es su bloque
de desarrollo fundamental. A continuación expondremos algunas definiciones.
9
1.4.2.1
Definición de componente
En esta Sección presentamos algunas definiciones de componente de diferentes
autores:
• Un componente es una unidad de composición reutilizable con interfaces de
requerimiento y de servicio y atributos de calidad, que denota una abstracción
sencilla y puede ser compuesta sin modificación [3].
• Los componentes de software reutilizables son artefactos independientes
claramente identificables que describen y desarrollan funciones especı́ficas con
interfaces claras, documentación y estado de reúso definido [12].
• Un componente es una unidad de producción de composición con interfaces
especı́ficas y dependencias explı́citas solo de contexto. Un componente puede
ser desplegado independientemente y está sujeto a composición por terceras
partes [13].
• Un componente reusable es una unidad de software independiente, desplegable,
reemplazable y reutilizable por terceras partes de acuerdo a la implementación,
especificación e interfaces bien definidas de la unidad [14].
• Un componente es una unidad de desarrollo independiente, sujeta a
composición por un tercero sin estado persistente [15].
1.4.2.2
Componentes y objetos
Szyperski define a un objeto como una unidad de ejemplificación que tiene una única
identidad y encapsula su estado y comportamiento [13], por lo que aparentemente, y
de acuerdo con las definiciones anteriores, los componentes y la tecnologı́a de objetos
cuentan con los mismos principios fundamentales, tales como los de encapsulación,
modularidad e identificadores únicos.
Sin embargo, los componentes pueden contener múltiples objetos, clases y otros
componentes, además, una caracterı́stica esencial de un componente es la capacidad
de ser usado en contextos que inicialmente pueden no haber sido anticipados por el
productor del componente, solo el usuario del componente decide si el mismo sirve
o no para un propósito particular [3]. Un componente puede contener múltiples
clases pero una clase puede ser desarrollada solamente dentro de un componente, el
desarrollo parcial de una clase dentro de un componente carece de mucho sentido
[13]; por otro lado, siendo clases pueden depender de otras clases usando el concepto
de herencia, de la misma manera que componentes dependen de otros componentes.
En este caso las superclases de una clase no necesariamente deben residir en el mismo
componente, lo que generarı́a una relación entre los componentes.
1.4.2.3
Caracterı́sticas de un componente
Como sucede con la definición, las caracterı́sticas de un componente también pueden
variar en relación al autor y la definición dada por dicho autor. A continuación
exponemos algunas de estas caracterı́sticas [12] [13] [14]:
10
• Independiente
Separado de su entorno y de otros componentes. No puede ser desarrollado de
manera parcial.
• Autocontenido
Debe ser reutilizable sin la necesidad de incluir otros componentes. Además
debe contar con especificaciones claras de lo que requiere y de los servicios que
ofrece.
• Con identificador único
Un componente debe tener una identificación clara y consistente que facilite
su catalogación y búsqueda en repositorios de componentes.
• Modularidad y encapsulación
Se refiere a la propiedad de alcance de un componente como ensamblador de
servicios que están relacionados a través de datos comunes.
• Accesible sólo a través de su interfaz
El componente debe exponer al público únicamente el conjunto de operaciones
que lo caracteriza (interfaz) y ocultar sus detalles de implementación. Esta
caracterı́stica permite que un componente sea reemplazado por otro que
implemente la misma interfaz.
• Sus servicios son invariantes
Las operaciones que ofrece un componente, a través de su interfaz, no deben
variar. La implementación de estos servicios puede ser modificada, pero no
deben afectar la interfaz.
• Documentado
Un componente debe tener una documentación adecuada que facilite su
búsqueda en repositorios de componentes, evaluación, adaptación a nuevos
entornos, integración con otros componentes y acceso a información de soporte.
Otras propiedades o caracterı́sticas deseables y que favorecen la capacidad de
reutilización de los componentes son [14]:
- La interfaz para un componente es diferente a una en un sistema de
comunicación concurrente, el cual requiere la interfaz para incluir una
descripción del protocolo de comunicación, en los componentes no es requerida
dicha descripción.
- La interfaz para un componente en una aplicación de tiempo real, debe proveer
las restricciones de tiempo real.
11
Figura 1.4: Interfaces de requerimiento y de servicio [Elaboración propia]
- Los componentes en sistemas distribuidos, móviles o basados en Internet
requieren que sus interfaces incluyan información acerca de su ubicación o
dirección.
- La interfaz de un componente no debe tener estado cuando el componente
es solicitado para ser usado dinámica e independientemente de otros
componentes.
1.4.2.4
Interfaces como contratos
Una interfaz puede ser vista como un contrato entre un cliente y un proveedor de
servicios [16], en el que se establece lo que el cliente necesita o debe hacer para usar la
interfaz de requerimiento y las implementaciones que el proveedor debe realizar para
cumplir con la funcionalidad prometida por la interfaz de servicio. Esta interacción
podemos verla en la Figura 1.4.
Un método de especificación de contratos es el de pre y poscondiciones (ver
Sección 5.1.6) para una operación, en el que el proveedor establece las pre y
poscondiciones. El cliente debe conocer y cumplir con las precondiciones antes
de solicitar un servicio, de manera que el proveedor se compromete a cumplir con
las poscondiciones estipuladas.
La funcionalidad de las operaciones depende de las pre y pos condiciones. Una
precondición limita las entradas y define un estado inicial el estado de un componente
que debe ser válido antes de que la operación sea invocada. Una poscondición
limita los parámetros de salida y define el estado final del componente que se vuelve
válido después de la invocación de la operación. La combinación de precondiciones,
invocación de la operación y poscondiciones representa la transición de un estado a
otro [3].
12
1.4.2.5
Metamodelo de componente
La Figura 1.5 muestra los conceptos asociados al metamodelo 1 de un componente.
Es un meta modelo porque no describe un componente fı́sico; muestra los principales
conceptos y relaciones de un componente. Presenta máximo dos tipos de interfaz,
una de requerimiento y otra de servicio, ambas interfaces deben ser declaradas
como públicas permitiendo de esta manera que pueda efectuarse la integración
de un componente con el entorno, de otra manera no se podrı́a conocer cómo un
componente será conectado a otro. La interfaz de servicio representa todo lo que el
componente provee a su entorno en términos de su funcionalidad (poscondiciones).
La interfaz de requerimiento constituye lo que el componente espera obtener de su
entorno para ofrecer sus servicios (precondiciones).
A partir de la definición de componente es natural que la funcionalidad o
implementación del componente deba ser efectuada de manera privada, ocultando los
algoritmos por medio de los cuales un componente logra cumplir con sus objetivos.
Las interfaces descritas se encargan de efectuar operaciones; en el caso de una
interfaz de servicio las operaciones son puntos de acceso por medio de los cuales
un cliente puede acceder a la funcionalidad de un proveedor. En una interfaz de
requerimiento las operaciones son puntos de acceso hacia proveedores asociados de
los que depende para realizar sus operaciones.
Otras actividades que influyen en la operatividad de un componente, aunque no
son partes fı́sicas del mismo, son las descripciones o documentación adicional que
conformarı́a la parte lógica del componente, como la especificación del componente
en la que se describe la capacidad funcional del componente (lo que un componente
puede hacer), las pre y pos condiciones y las excepciones, por lo que en la Figura
1.5 estas actividades se muestran diferenciadas en la parte superior de la misma.
1.4.3
Metodologı́a de diseño:
Adaptado al DSBC
Proceso de Desarrollo Unificado
En esta Sección se describen los flujos de trabajo a seguir para desarrollar software
basado en componentes. Algunos de los flujos tienen como salida modelos que a su
vez son insumos para otros. [4].
1.4.3.1
Niveles de Modelos
Los modelos son importantes si se asegura que pueden ser entendidos por varias
personas, estableciendo ciertas reglas o estándares que lo hagan comprensible. Para
este fin existe UML, una herramienta usada desde hace bastante tiempo además de
ser globalmente aceptada [4]. En este lenguaje de modelado existen tres niveles de
modelos principales:
1
El modelo es representado mediante UML [17] (Ver Sección 5.3.1).
13
Figura 1.5: Meta modelo de un componente [Tomado de [3, p.8]]
14
Figura 1.6: Flujos de trabajo en el proceso de desarrollo [Adaptado de [4, p. 27]]
1. Modelos Conceptuales:
problema.
Identifican los conceptos sobre el dominio del
2. Modelos de Especificación:
Especificación del software más no su
implementación. Descripción del exterior de los componentes.
3. Modelos de Implementación: Descripción del interior de los componentes, sus
caracterı́sticas y su implementación.
En cada uno de los flujos que se enumeran a continuación se describen los modelos
creados como insumos y salidas de cada uno.
1.4.3.2
Flujos de Trabajo
Un flujo de trabajo es una secuencia de actividades que produce un resultado
observable [18]. En la Figura 1.6 se muestra el proceso de desarrollo enmarcado
en cada uno de los flujos, además de las entradas y salidas que produce cada flujo.
En las fases que producen modelos se usará UML para la creación de los mismos.
Flujo de Requerimientos Analiza y encuentra los requerimientos funcionales
del negocio para generar el o los modelos conceptuales. En este flujo se intenta
crear una idea de las responsabilidades que el sistema tendrá y de otras que pueden
dejarse por fuera. Este flujo de trabajo genera el modelo conceptual y los modelos
de casos de uso.
UML: Casos de uso Son diagramas que representan una interacción del
usuario con el sistema y que muestran las relaciones entre el usuario y los casos
de uso que lo involucran [19].
A partir de estos diagramas pueden identificarse nuevos requerimientos
funcionales del sistema y al final de la creación de estos modelos, todos los
requerimientos deben ser cumplidos por uno o más casos de uso.
15
UML: Modelo conceptual Nos permite tener una vista más acertada del
problema que intentamos resolver y de los conceptos que están involucrados. Cuando
se desarrolle este modelo en secciones posteriores se hará una descripción más
detallada de este modelo.
Flujo de Especificación A partir del modelo de negocio y los casos de uso se
generan las primeras especificaciones y arquitecturas de componentes. También
puede tomar como entradas posibles sistemas legales, bases de datos o restricciones
técnicas existentes. A partir del análisis hecho sobre el modelo de negocio es posible
establecer la información que debe ser administrada, además de las interfaces que
son necesarias para manejar dicha información, también es posible identificar los
componentes que se necesitan para proveer determinada funcionalidad.
Modelo de Tipos del Sistema Es un modelo de especificación. Su objetivo
principal es modelar la información relevante del sistema que se prevé desarrollar.
Se efectúa con un diseño de clases pero no tiene el mismo significado del modelo
conceptual de negocio. Los principales conceptos y caracterı́sticas de este modelo
son:
• Tipo: Estereotipo usado para indicar que las clases en este modelo representan
tipos. Los tipos en este modelo no pueden contener operaciones ya que en el
solo se describe información y no software.
• Tipos de datos estructurados: En este caso es usado el estereotipo datatype
que define ciertas restricciones: el tipo de dato no puede tener asociaciones u
operaciones.
• Interfaz Tipo: Debido a que el estándar UML no permite la definición de
atributos o asociaciones dentro de su concepto de interfaz, es necesario usar una
clase estereotipada que permita que estas caracterı́sticas puedan ser descritas
dentro de la interfaz.
• Invariantes: Una invariante es lo mismo que una restricción dentro del
UML. Es como una regla que rige sobre las ejemplificaciones y a nivel de
especificación corresponde a reglas del negocio. Además, es una restricción
que aplica sobre todas las ejemplificaciones de un tipo. Es decir para cualquier
objeto componente que apoye una interfaz o cierta especificación la restricción
debe cumplirse.
Especificación de interfaces En esta especificación se describe la interfaz
junto con cualquier especificación requerida para definir lo que el componente que
ofrece dicha interfaz debe hacer.
En esta especificación debe incluirse el tipo de la interfaz, los atributos y roles de
asociación, pre y pos condiciones para las operaciones de la interfaz (especificación
de operaciones), las invariantes requeridas en la interfaz. Los principales conceptos
que se manejan dentro de la especificación de interfaces son:
16
• Paquetes de interfaz: Aquı́ se agrupa toda la especificación de una interfaz.
Es posible que este paquete requiera información de especificación de otros
paquetes por lo que puede realizar una relación de import con dichos paquetes.
Para efectuar herencia entre interfaces es necesario importar el paquete padre
dentro del paquete hijo.
• Modelo de información: Al especificar interfaces se busca definir modelos
de tipo independientes para cada interfaz, a diferencia de cuando se desea
especificar el modelo de tipo del negocio en donde se genera un modelo
integrado.
En este caso los tipos que se especifican son exclusivos para cada interfaz, por
lo que cada interfaz tiene su propia vista de la información que maneja. Por
esta razón, en la especificación los que serı́an tipos en el modelo de tipos del
negocio son Tipos de información en la especificación de interfaces.
Describe las caracterı́sticas y el comportamiento de las operaciones ası́ como las
condiciones para que las mismas se cumplan. Los principales aspectos a tener en
cuenta son:
• Firma: La firma de una operación comprende cero o más tipos de parámetros.
Este tipo puede ser una referencia a un objeto componente (generalmente a una
interfaz), un tipo de dato simple como un entero, un tipo de dato estructurado
o una colección de todos.
• Pre y pos condiciones: Expresiones booleanas que son evaluadas antes y
después de ejecutar una operación. Si la precondición no se cumple el
comportamiento es inesperado, si se cumple entonces la poscondición debe
ser cierta.
• Comportamiento transaccional: Este aspecto se refiere a conocer cuándo una
operación inicia una nueva transacción y cuando se ejecuta sobre una existente.
Si se presenta el primer caso se usará es estereotipo transaction, de lo contrario
no se inserta ningún estereotipo.
Especificación
de
operaciones
Describe las caracterı́sticas y el comportamiento de las operaciones ası́ como las
condiciones para que las mismas se cumplan. Los principales aspectos a tener en
cuenta son:
• Firma: La firma de una operación comprende cero o más tipos de parámetros.
Este tipo puede ser una referencia a un objeto componente (generalmente a una
interfaz), un tipo de dato simple como un entero, un tipo de dato estructurado
o una colección de todos.
• Pre y pos condiciones: Expresiones booleanas que son evaluadas antes y
después de ejecutar una operación. Si la precondición no se cumple el
comportamiento es inesperado, si se cumple entonces la poscondición debe
ser cierta.
17
• Comportamiento transaccional: Este aspecto se refiere a conocer cuándo una
operación inicia una nueva transacción y cuando se ejecuta sobre una existente.
Si se presenta el primer caso se usará es estereotipo transaction, de lo contrario
no se inserta ningún estereotipo.
Arquitectura Prescriptiva, Modelo de Componentes del Sistema
• Especificación de componentes:
Debido a que se desea efectuar la especificación del componente (no definir la
implementación), es necesario usar (de manera similar al caso de la interfaz)
una clase estereotipada con comp spec. En el caso de las interfaces ofrecidas
por un componente es posible usar una relación realize para describir este
aspecto. Sin embargo a nivel de especificación es más apropiado crear un
estereotipo offer que capture esta relación.
Además de describir el conjunto de interfaces que ofrece, esta especificación
debe incluir las interfaces que usa o requiere (la cuál es una restricción
arquitectural y no una elección en el diseño del componente), modelado en
este caso por una relación de uso sencilla ofrecida por UML. Esta dependencia
indica que todas las realizaciones de un componente deben usar esas interfaces.
• Modelado de Componentes mediante UML:
La extensión de UML para modelado de componentes fue propuesta Cheesman
& Daniels [4]; en ella se describen algunos aspectos a tener en cuenta cuando
se desea seguir un DSBC en un proyecto de software. Para comenzar es
importante empezar a definir una arquitectura del sistema que nos permitirá
tener una visión general del lo que será el sistema final. A continuación se
describirán brevemente algunos aspectos relacionados con este aspecto:
– Capas de arquitectura:
El uso de componentes permite mantener diferentes aspectos de un
sistema separados, de manera que sea más sencillo analizar el propósito
de cada uno de los componentes utilizados en una aplicación. Las capas
que conforman esta arquitectura son:
∗ Interfaz de usuario: Presentación de la información al usuario.
Aunque se usan componentes de interfaz no son los mismos
componentes que se desarrollarán para construir los algoritmos.
∗ Diálogo de usuario: Administración de diálogo de un usuario en su
sesión.
∗ Servicios del sistema: Capa que provee un contexto en el que
servicios generales se usan para alcanzar servicios y necesidades
particulares del sistema.
∗ Servicios de negocios: Implementación del núcleo del negocio,
información, reglas y transformaciones.
18
Figura 1.7: Capas de Arquitectura en el DSBC [Adaptado de [4, p. 11]]
La Figura 1.7 muestra una primera vista de las capas en las que podrı́an
encajarse los diferentes componentes asignando de esta manera ciertas
responsabilidades. No es necesario que la comunicación se haga siempre
entre capas adyacentes pero es importante que para acceder a la capa
de negocios se utilice un objeto componente de la capa de servicios
para mantener un bajo nivel de acoplamiento de componentes objeto
y aumentar su reusabilidad.
– Arquitectura de Componentes:
Una arquitectura de componentes es un conjunto de componentes a
nivel de aplicación, sus relaciones estructurales y sus dependencias de
comportamiento, además de ser independiente de la tecnologı́a. La
descripción de estas caracterı́sticas es la siguiente:
∗ Relaciones
estructurales:
Asociaciones
y
herencia
entre especificaciones de componentes e interfaces, y relaciones de
composición entre componentes.
∗ Dependencias de comportamiento: Relaciones entre componentes,
entre componentes e interfaces y entre interfaces. La Figura 1.8
muestra las diferentes dependencias posibles entre componentes.
• Especificación de Contratos:
Lo ideal en el uso de componentes es que las partes de un proyecto sean
exitosas al momento de ser ensambladas y empezar a trabajar juntas. Para
tal fin es necesario especificar contratos que deben cumplirse por parte del
componente y los que deben ser cumplidos por parte del cliente.
En este punto existe gran similitud con lo que sucede en empresas existentes
en el mundo real, en donde se manejan relaciones con clientes o con otras
compañı́as por medio de documentos en los que se indican las responsabilidades
y obligaciones de las partes, aunque sin especificar la manera como lo harán.
19
Figura 1.8: Dependencias entre componentes [Adaptado de [4, p. 13]]
También se incluyen las consecuencias que pueden surgir si alguna de las partes
incumple con su responsabilidad.
– Tipos de contrato (UML):
El uso de contratos en UML no es un tema nuevo, en realidad en el
diseño orientado a objetos es común el uso de estas relaciones. Los tipos
de contratos son:
1. De uso: Contrato entre el componente y sus clientes.
2. De realización: Contrato entre el componente (especificación) y su
implementación.
Al mantener estos aspectos aparte se pretende facilitar los posibles
cambios que surjan posteriormente en el sistema. De esta manera, un
cambio en un contrato de realización no afecta un contrato de uso por lo
que el cliente no sufre con cada modificación al sistema. A continuación
se describen con mayor claridad los tipos de contrato existentes:
Contratos de Uso:
Describe la relación entre un cliente y la interfaz de un componente.
Dentro de la especificación de una interfaz se debe incluir:
∗ Operaciones: Lista de operaciones que la interfaz provee.
∗ Modelo de información:
Definición abstracta de cualquier
información o estado y cualquier restricción sobre dicha información.
Cada operación se trata como si fuese un contrato. Por lo que es necesario
definir entradas, salidas, relación entre operaciones y las condiciones bajo
las cuales aplica. Las operaciones están definidas por:
∗ Precondición: Definición de condiciones sobre las cuáles la post
condición aplicará.
∗ Post condición: Descripción de los efectos de la operación sobre sus
parámetros y el modelo de información.
20
El cliente debe asegurar que cumple la precondición de una operación,
al aceptar un contrato está de acuerdo en que, si la precondición no se
cumple, los resultados esperados no se darán. Por otro lado, el proveedor
debe asegurar el cumplimiento de la postcondición si la precondición se
cumple.
Contratos de Realización:
Son contratos que se efectúan entre una especificación de un componente
y su implementación y se incluye dentro de la propia especificación del
componente.
Es posible que se defina como la implementación debe interactuar con
otros componentes. Estas interacciones pueden ser definidas por medio
de diagramas de colaboración o usando restricciones entre los modelos de
información de las interfaces usadas.
Flujo de Provisión A partir de la especificación de componentes este flujo
debe encargarse de establecer qué componentes es necesario construir o adquirir
(comprar). También es posible analizar si los componentes existentes requieren
modificaciones para satisfacer la funcionalidad que requiere el problema. En caso
que el componente no exista se deben efectuar los diseños correspondientes además
de la construcción del mismo.
Diagramas inter-componente Diagramas que describen las relaciones
existentes entre componentes, principalmente las relaciones entre las interfaces de
sistema y la respectiva interfaz de negocio.
Diagramas intra-componente Flujo de mensajes entre los objetos que
existen dentro de los componentes que se implementan.
Modelos estructurales intra-componente Son modelos que describen los
objetos que hacen parte de cada componente. Se desarrollarán como diagramas de
clases.
Diagramas de realización A partir de la arquitectura prescriptiva y de la
tecnologı́a en la que se va a desarrollar la solución, surgen estos diagramas que nos
indican cuál será la implementación tecnológica de las abstracciones de cada uno de
los componentes obtenidos en el flujo de especificación.
Arquitectura Descriptiva Finalmente se obtiene la arquitectura descriptiva,
muchas veces similar a la prescriptiva pero con las caracterı́sticas, detalles y
restricciones de la tecnologı́a que se haya seleccionado para la implementación. En
estos modelos se ensamblan los componentes detallando aspectos tecnológicos del
sistema.
21
Flujo de Ensamble En esta etapa se integran los componentes junto con sistemas
de software existente y con la interfaz del cliente que satisfaga y cumpla las
condiciones del negocio.
Finalmente el sistema es liberado.
1.4.4
UML 2.x
Debido al veloz desarrollo de la industria del software la versión de UML
debió ser actualizada como respuesta a dicha evolución [17]. En esta Sección
describiremos brevemente algunos aspectos actualizados que se centran en los
diagramas de componentes, tema principal de nuestro proyecto, razón por la cual
las modificaciones a otros modelos serán tenidas en cuenta dentro del diseño pero
no serán descritas aquı́.
1.4.4.1
Diagramas de Componentes en UML
Estos diagramas muestran las dependencias entre componentes de software
[5]. Permiten modelar la arquitectura del dominio del problema, el diseño de
conFiguración y la infraestructura técnica del sistema [Ambler 1998].
Directrices: Los principales aspectos a tener en cuenta al momento de modelar
componentes son:
• Aplicar nombres descriptivos a los componentes arquitecturales.
• Aplicar estereotipos consistentes.
• No usar estos diseños para modelar datos e interfaces de usuario.
• Usar el estereotipo component o el sı́mbolo de componente para todo el diseño
de manera consistente. También es posible usar tanto el sı́mbolo como el
estereotipo a la vez para identificar a un componente, como se ve en el
componente order de la Figura 1.9. Lo importante es mantener la misma
notación durante todo el diseño.
• Mostrar solo las interfaces relevantes (por ejemplo las relacionadas al objetivo
del modelo) para mantener el diseño lo más simple posible.
La Figura 1.9 muestra algunos elementos gráficos del UML utilizados en el
modelamiento de un diagrama de componentes.
Directrices para las relaciones de dependencia y de herencia: Los
componentes tendrán relaciones entre sı́ o con otras interfaces, además las interfaces
pueden tener relaciones con otras interfaces. Las relaciones se representan con lı́neas
discontinuas y con puntas de flechas abiertas. Las principales directrices que se
aplican a este aspecto del diseño son:
• Modelar dependencias de derecha a izquierda.
• Poner los componentes padres sobre los componentes hijos (herencia).
• Los componentes solo deben tener dependencia con interfaces.
22
Figura 1.9: Diagrama de componentes para un sistema de comercio electrónico.
[Tomado de [5, p.133]]
1.5
1.5.1
Marco tecnológico
Lenguaje Oz
Este lenguaje no es un lenguaje corriente ya que no se centra en un solo paradigma
de programación como otros, sino que soporta varios. Las principales caracterı́sticas
de este lenguaje son:
- Oz combina las principales caracterı́sticas de la programación orientada a
objetos (POO): estado, tipos de datos abstractos, clases, objetos y herencia.
- Oz provee caracterı́sticas de la programación funcional como sintaxis
compositiva y procedimientos de primera clase.
- Oz provee las principales caracterı́sticas de la programación lógica y la
programación por restricciones por medio de variables lógicas, construcciones
disyuntivas y estrategias de búsqueda.
- Oz es un lenguaje concurrente donde los usuarios pueden crear dinámicamente
cualquier número de hilos secuenciales que pueden interactuar entre sı́.
Estas caracterı́sticas permiten utilizar las bondades, facilidades y potencial que
ofrece cada paradigma dentro de un mismo desarrollo de software. Este lenguaje
posee una implementación conocida como Sistema de Programaciòn Mozart [20].
1.5.1.1
Reseña histórica (Sistema de Programación Mozart)
Mozart está basado en el lenguaje de programación Oz.
Fué desarrollado
inicialmente por Gert Smolka y su grupo de investigación en la Saarland University
a inicios de los 90’s y bautizado en sus inicios como DFKI OZ. Posteriormente surgió
un grupo denominado Mozart Consortium integrado por representantes de varias
universidades del mundo. En 2005 la responsabilidad de administración de esta
plataforma se transfirió a la Mozart Board (Junta de Mozart), un grupo pequeño de
personas que se encarga de decidir cambios y mejoras sobre la plataforma y hacerlos
conocer a los desarrolladores.
Las mejoras pueden ser propuestas por cualquier persona en el mundo, después de
23
pasar ciertos filtros las propuestas llegan a la junta para que decida cuáles serán
implementadas.
1.5.1.2
Functores
Un functor es la realización tecnológica de lo que en Ingenierı́a de Software
se denomina como componente: Es una unidad de instalación o despliegue
independiente, con autonomı́a de ejecución ası́ sea desarrollada por terceros y no
tiene estado persistente [13]. En la terminologı́a del lenguaje de programación Oz,
los functores son unidades de compilación que pueden ser manejadas en archivos,
tanto en forma de código fuente como en forma de código objeto; el código fuente
puede ser compilado para traducirlo a código objeto [21]
Las partes de un functor son:
1. Una parte import que especifica otros componentes que requiere para su
ejecución.
2. Una parte export que indica la interfaz del componente.
3. Una parte define en donde se especifica la funcionalidad ofrecida por el
componente.
A continuación presentamos la propuesta elaborada por Diosa [7], que
implementa la abstracción de un functor :
functor
import OtroComp1 at Archivo1.ozf
OtroComp2 at Archivo2.ozf
.
.
.
OtroCompN at ArchivoN.ozf
export op1:Operacion1 op2:Operacion2...opK: OperacionK
define
proc Operacion1...end
proc Operacion2...end
.
.
.
proc OperacionK...end
end
Esta abstracción será utilizada para la ejemplificación de los componentes
desarrollados a lo largo del proyecto, es decir que cada componente que deba ser
desarrollado (un algoritmo puede contar con mas de un componente) se basará
en esta abstracción; en la Figura 1.10 se puede ver un modelo que describe la
abstracción y su relación con functores que requiere (definida por su sección import).
24
Figura 1.10: Estereotipado de notación de componentes en UML 2.x como functor
[Elaboración propia].
25
Capı́tulo 2
Fase de Requerimientos:
Modelo funcional basado en
casos de Uso
A continuación se detalla el modelo funcional del sistema a través de los casos de uso
que lo describen, además de los requerimientos tanto funcionales como no funcionales
que se identifican a partir del caso de estudio planteado para este proyecto. La
especificación de los casos de uso se realizará mediante diagramas de actividades
[22]
2.1
Especificación de requerimientos
2.1.1
Requerimientos funcionales
En esta Sección se realiza la descripción de los requerimientos funcionales
identificados:
ID
REQF 1
REQF 1.1
REQF 1.2
REQF 1.3
REQF 1.4
REQF
REQF
REQF
REQF
REQF
REQF
REQF
REQF
2
3
3.1
3.2
4
4.1
4.2
5
DESCRIPCIÓN DE REQUERIMIENTOS
El sistema debe permitir al usuario cargar archivos en el sistema.
El sistema debe permitir al usuario seleccionar un archivo para codificar.
El sistema debe estar en la capacidad de cargar un archivo con extensión txt y mostrarlo al
usuario.
El usuario debe poder cargar los archivos de las claves que desea usar de acuerdo al tipo de
codificación (RSA o IDEA) a realizar.
El usuario debe poder cargar los archivos de las claves que desea usar de acuerdo al tipo de
decodificación (RSA o IDEA) a realizar.
El usuario debe poder almacenar archivos de texto planos.
El sistema debe permitir al usuario seleccionar el tipo de codificación a efectuar.
El sistema debe permitir al usuario seleccionar IDEA para realizar la codificación..
El sistema debe permitir al usuario seleccionar RSA para realizar la codificación.
El sistema debe permitir al usuario seleccionar el tipo de decodificación a efectuar.
El sistema debe permitir al usuario seleccionar IDEA para realizar la decodificación.
El sistema debe permitir al usuario seleccionar RSA para realizar la codificación. txt.
El sistema debe codificar archivos de texto. txt.
26
ID
DESCRIPCIÓN DE REQUERIMIENTOS
REQF 5.1
REQF 5.2
REQF 5.3
El sistema debe permitir realizar la codificación mediante el algoritmo IDEA.
El sistema debe permitir realizar la codificación mediante el algoritmo RSA.
El sistema debe mostrar al usuario el resultado de la codificación.
El sistema debe permitir al usuario almacenar en un archivo de texto plano el resultado de la
codificación.
El sistema debe decodificar archivos de texto. txt.
El sistema debe permitir realizar la decodificación mediante el algoritmo IDEA.
El sistema debe permitir realizar la decodificación mediante el algoritmo RSA.
El sistema debe mostrar al usuario el resultado de la decodificación.
El sistema debe permitir al usuario almacenar en un archivo de texto plano el resultado de la
decodificación.
El sistema debe permitir al usuario seleccionar el tipo de las claves que deben generarse para
posteriormente realizar la codificación - decodificación.
El sistema debe permitir seleccionar IDEA para generar las claves de codificación.
El sistema debe permitir seleccionar RSA para generar las claves de codificación.
El sistema debe generar las claves necesarias para realizar la codificación. txt.
El sistema debe generar la clave pública del algoritmo RSA.
El sistema debe crear un archivo de texto con extensión rsak cuyo contenido sea la clave pública
para el algoritmo RSA.
El sistema debe generar un número aleatorio que posteriormente será usado para obtener la
matriz de claves para la codificación de texto mediante IDEA.
El sistema debe crear un archivo de texto con extensión ideak cuyo contenido sea el número
aleatorio que servirá como insumo para crear las claves del algoritmo IDEA.
El sistema debe generar las claves necesarias para realizar la decodificación seleccionada por
el usuario. txt.
El sistema debe generar la clave privada del algoritmo RSA.
El sistema debe crear un archivo de texto con extensión rsak cuyo contenido sea la clave
privada para el algoritmo RSA.
El sistema debe permitir al usuario acceder a una ayuda asociada con el funcionamiento el
mismo.
El sistema debe ofrecer al usuario información asociada a los algoritmos que hacen parte de la
librerı́a.
REQF 5.4
REQF
REQF
REQF
REQF
6
6.1
6.2
6.3
REQF 6.4
REQF 7
REQF
REQF
REQF
REQF
7.1
7.2
8
8.1
REQF 8.2
REQF 8.3
REQF 8.4
REQF 9
REQF 9.1
REQF 9.2
REQF 10
REQF 11
Tabla 2.1: Tabla de requerimientos funcionales para el algoritmo genético.
2.1.2
Requerimientos no funcionales
ID
REQNF 1
REQNF 1.1
REQNF
REQNF
REQNF
REQNF
1.2
2
2.1
3
REQNF 3.1
REQUERIMIENTOS NO FUNCIONALES
IMPLEMENTACIÓN.
El aplicativo debe desarrollarse bajo el paradigma de la programación basada
en componentes.
Los componentes deben ser desarrollados en el lenguaje de programación OZ.
INTERFAZ DE USUARIO.
Las interfaces de usuario del aplicativo estarán en idioma español.
EXTENSIBILIDAD.
Será posible añadir fácilmente nuevos algoritmos u otras funcionalidades
mediante la creación de nuevos componentes.
27
ID
REQNF 4
REQNF 4.1
REQNF 5
REQNF 5.1
REQNF 5.2
REQNF 5.3
REQNF 5.4
REQNF 6
REQNF 6.1
REQUERIMIENTOS NO FUNCIONALES
MANTENIBILIDAD.
La optimización o mejoramiento de funcionalidades se podrá hacer sin
grandes impactos ya sea cambiando un componente por otro o cambiando
funcionalidades dentro de los componentes desarrollados.
DOCUMENTACIÓN.
Se deben documentar los requerimientos del sistema; estos estarán
modularizadas describiendo aspectos tanto funcionales como no funcionales
del sistema.
Se especificarán los artefactos de casos de uso, para lo cual se usará el
formato extendido que incluye los escenarios del mismo usando diagramas
de actividades.
Se especificarán las interfaces del sistema detallando las operaciones de las
mismas.
Se especificarán los artefactos de la arquitectura prescriptiva y su
correspondiente arquitectura descriptiva.
REUSABILIAD.
Debe ser posible reutilizar componentes, tanto para los algoritmos aquı́
desarrollados como en la inclusión de algoritmos nuevos en el ambiente MozartOZ.
Tabla 2.2: Tabla de requerimientos no funcionales
28
2.2
Diagrama general de casos de uso
A continuación se describe el modelo genera de los casos de uso identificados
Figura 2.1 a partir del análisis de requerimientos efectuados anteriormente.
Figura 2.1: Diagrama general de casos de uso del AG [Elaboración propia]
2.2.1
Descripción de los casos de uso, modelo extendido
A continuación haremos una descripción detallada de los CU CU001 - Cargar
Archivo, CU002 - Codificar y CU007 - Decodificar. Los diagramas relacionados
con los demás cases de uso pueden ser consultados en el Anexo A.
29
CU001 - Cargar Archivo La Figura 2.2 muestra el diagrama de casos de uso
para la carga de archivos en el sistema, tanto para que el usuario aplique alguna
codificación o decodificación como para cargar las llaves de cada algoritmo.
Figura 2.2: Diagramas de casos de uso para la carga de archivos [Elaboración propia
basada en UML]
30
Formato extendido
Nombre Caso de Uso: Cargar Archivo
Código Caso de Uso: CU001
Actores: Usuario
Descripción: El usuario desea cagar un archivo, el sistema le provee una ventana para
que el usuario pueda realizar la búsqueda del archivo que desea cargar.
Referencias Cruzadas a Requerimientos: REQF1, REQF1.1, REQF1.2, REQF1.3,
REQF1.4
Referencias Cruzadas a CU: CU002, CU007
Precondiciones: Ninguna
Escenario:
Poscondiciones: El archivo es cargado por el sistema y mostrado al usuario usando el
componente GUI apropiado.
Prioridad: Normal
31
CU002 - Codificar La Figura 2.3 muestra el diagrama de casos de uso para la
codificación de texto.
Figura 2.3: Diagramas de casos de uso para codificación de texto [Elaboración propia
basada en UML]
32
Formato extendido
Nombre Caso de Uso: Codificar
Código Caso de Uso: CU002
Actores: Usuario
Descripción: El usuario desea codificar el archivo que ha cargado en el sistema.
Referencias Cruzadas a Requerimientos: REQF1, REQF1.1, REQF5, REQF5.1,
REQF5.2, REQF5.3
Referencias Cruzadas a CU: CU001, CU003, CU004, CU005, CU006
Precondiciones: Debe existir un archivo cargado en el sistema. Deben cargarse las llaves
con las que se desea codificar.
Escenario:
Poscondiciones: El archivo es codificado y mostrado al usuario en un componente GUI
apropiado.
Prioridad: Normal
33
CU007 - Decodificar La Figura 2.4 muestra el diagrama de casos de uso para
la decodificación de texto.
Figura 2.4: Diagramas de casos de uso para la decodificación [Elaboración propia basada
en UML]
34
Formato extendido
Nombre Caso de Uso: Decodificar
Código Caso de Uso: CU007
Actores: Usuario
Descripción: El usuario desea decodificar el archivo que ha cargado en el sistema.
Referencias Cruzadas a Requerimientos: REQF4, REQF4.1, REQF4.2, REQF5.3,
REQF6, REQF6.1, REQF6.2, REQF6.3, REQF6.4
Referencias Cruzadas a CU: CU001, CU003, CU004, CU005, CU006
Precondiciones: Debe existir un archivo cargado en el sistema. Deben cargarse las llaves
con las que se desea decodificar.
Escenario:
Poscondiciones: El archivo es decodificado y mostrado al usuario en un componente
GUI apropiado.
Prioridad: Normal
35
2.3
Modelo conceptual de negocio
En este modelo identificamos los principales conceptos del problema que se encuentra
en desarrollo y está representado por medio de un diagrama de clases (UML) que
nos permite también establecer las relaciones entre los conceptos obtenidos; no es
un modelo de software pero es importante para realizar un acercamiento inicial al
problema y a los conceptos involucrados en el mismo. El modelo conceptual de
nuestro negocio puede verse en la Figura 2.5.
2.3.1
Descripción de Conceptos
• Librerı́a Criptográfica: Contiene diferentes algoritmos para codificación y
decodificación (IDEA y RSA inicialmente). Por medio de ella el usuario puede
acceder a los diferentes tipos de cifrado.
• Algoritmo de codificación: Generalización, concepto que agrupa los
diferentes algoritmos que pueden ser usados para codificar / decodificar.
• IDEA: Algoritmo de codificación por bloque, se encarga del cifrado de
archivos y textos cortos.
• RSA: Algoritmo asimétrico de codificación, funciona para codificar textos
cortos.
• Aleatorio: Las claves de los algoritmos seleccionados se basan en la
generación de números aleatorios.
• p, q: Valores que deben ser primos entre sı́ y son utilizados para la generación
de las llaves.
• n, d, e: Valor que debe obtenerse para la generación de claves en el algoritmo
RSA.
• Clave: Generalización, concepto que agrupa el concepto de claves, concepto
presente en todo algoritmo de codificación.
• ClaveRSA: Contiene las claves necesarias para el funcionamiento del
algoritmo RSA.
• ClavePublicaRSA, ClavePrivadaRSA: Claves que se usan para codificar
- decodificar usando el algoritmo RSA.
• ClaveIDEA: Contiene las claves necesarias para el funcionamiento del
algoritmo IDEA.
• ClaveCodificacionIDEA: Como su nombre lo indica, concepto que se refiere
a la clave que es usada al realizar una codificación con el algoritmo IDEA.
• ClaveDecodificacionIDEA: Como su nombre lo indica, concepto que se
refiere a la clave que es usada al realizar una decodificación con el algoritmo
IDEA.
36
• Subclave: Concepto en el que se basa toda el proceso de generación de claves
de codificación - decodificación del algoritmo IDEA.
• AlgoritmoMatematico: Generalización, concepto que agrupa los algoritmos
que se requieren para alcanzar la funcionalidad de los algoritmos.
• Función de Euler: Operación que permite generar un número primo
necesario para el proceso de codificación.
• Inverso: Generación del número (denominado como ”d” en el algoritmo RSA)
utilizado para el proceso de decodificación.
• Multiplicacion: Operación en la que se realiza la multiplicación entre dos
variables y se calcula el modulo 216 + 1.
• Suma: Similar a la multiplicación, se realiza una suma en lugar de una
multiplicación.
• XOR: Operación bit a bit, que retorna 1 solo cuando uno de los dos bits es 1.
• TestDeFermat: Verifica si dos números son probablemente primos.
• Archivo: Concepto relacionado con la carga y almacenamiento de archivos.
37
Figura 2.5: Modelo conceptual [Elaboración propia basada en UML]
38
Capı́tulo 3
Fase de Especificación:
Identificación de Componentes
y Arquitectura Prescriptiva
En esta Sección se describen las interfaces y componentes que harán parte del sistema
y se realizará la arquitectura prescriptiva a partir de los elementos identificados a
partir de este análisis.
3.1
Identificación de interfaces
A continuación se describen las interfaces y operaciones que el sistema debe proveer
para cumplir con el objeto del negocio, que en nuestro caso se centra en la
codificación y decodificación de archivos.
3.1.1
Interfaces del sistema
Las interfaces del sistema se obtienen a partir de los casos de uso identificados en el
análisis efectuado en la Sección 2.
De acuerdo a la metodologı́a de diseño escogida para este proyecto (DSBC [4])
son estas las interfaces con las que la interfaz gráfica del usuario debe interactuar en
la capa de lógica de negocio. Es decir, cuando la lógica de un caso de uso requiera
mostrar información o notificar al sistema de una acción de usuario, la capa de
diseño (interfaz gráfica o GUI) debe usar la interfaz del sistema que contenga la
operación que cumpla con el flujo del caso de uso. Esta a su vez usa la respectiva
interfaz y operación definida en la lógica del negocio.
En la Sección 3.3.1 se describen estas interfaces.
3.1.2
Interfaces del negocio
Las interfaces de negocio son independientes de la interfaz gráfica del usuario; son
abstracciones de la información que debe ser administrada por el sistema.
39
Para identificar estas interfaces debemos refinar el modelo de conceptos descrito
en la Sección 2.3 y que solo describe la información importante del dominio del
problema y convertirlo en un modelo en el que se especifique la información que
debe ser sostenida y monitoreada por el sistema. Este último se denomina modelo
de “tipos” del sistema.
3.1.2.1
Modelo de Tipos
El modelo de tipos se representa por un diagrama de clases en el que cada clase es
un tipo por lo que cada una se encuentra marcada con el estereotipo “type”. En
este diagrama debemos identificar los elementos “core” o núcleos del sistema que
son aquellas entidades que no tienen dependencias obligatorias. Para cada una de
estas entidades “core” se añaden la interfaces de negocio que posteriormente serán
refinadas para añadir las operaciones que soportarán.
Las entidades núcleo del sistema nos permiten además, identificar algunos
posibles componentes que harán parte de la arquitectura inicial del sistema. La
Figura 3.1 muestra el diagrama de tipos obtenido a partir del modelo conceptual.
3.1.3
Identificación de las operaciones de negocio
Con el fin de identificar las operaciones para las interfaces de negocio identificadas
en la Sección 3.1.2, se toma cada operación de las interfaces del sistema y se elaboran
uno o más diagramas de secuencia que muestren los flujos de ejecución que resultan
en llamados a las interfaces de negocio y se especifica la operación (junto con
su firma) que debe existir en dicha interface para cumplir con la funcionalidad
requerida.
Estos diagramas son conocidos como diagramas de secuencia intercomponentes
y se detallan a continuación, teniendo en cuenta que hacen parte de la arquitectura
prescriptiva por lo que serán refinadas en al Sección 4.2 para incluir las restricciones
de la tecnologı́a seleccionada además de otros detalles que puedan no ser incluidos
en la etapa que actualmente nos ocupa.
3.1.3.1
Diagramas de secuencia intercomponente
En esta Sección se muestra la interacción existente entre la vista y las interfaces de
negocio que responden a la funcionalidad requerida. Partiendo de estos diagramas
nos es posible establecer las operaciones que deben existir en cada una de las
interfaces de negocio y su firma respectiva.
A continuación se muestran los diagramas de las interacciones para las interfaces
de sistema ICargarArchivo, IAlmacenarArchivo, ICodificar e IDecodificar, si desea
información asociada a las demás interfaces dirı́jase al Anexo B.
Diagramas intercomponente ICargarArchivo e IAlmacenarArchivo
Como se puede ver las Figuras 3.2 y 3.3 muestran las operaciones que debe soportar
la interface de negocio IGestorArchivo y que se resumen en la Figura 3.4.
40
Figura 3.1: Modelo de tipos elementos core y sus interfaces de negocio [Elaboración
propia]
41
Figura 3.2: Diagrama de secuencia CU001. Cargar Archivo [Elaboración propia]
Figura 3.3: Diagrama de secuencia CU017. Almacenar Archivo [Elaboración propia]
42
Figura 3.4: Operaciones IGestorArchivo [Elaboración propia]
Diagramas intercomponente ICodificar e IDecodificar Las Figuras 3.5 y 3.6
nos permiten obtener las operaciones de las interfaces de negocio ICodificadorRSA
e ICodificadorIDEA y que podemos ver en la Figura 3.7.
43
Figura 3.5: Diagrama de secuencia CU002. Codificar [Elaboración propia]
44
Figura 3.6: Diagrama de secuencia CU006. Decodificar [Elaboración propia]
45
Figura 3.7: Operaciones ICodificadorRSA e ICodificadorIDEA [Elaboración propia]
3.1.3.2
Modelo de ”tipos” refinado
En la Figura 3.1 se identificaron las interfaces de negocio de nuestro sistema,
posteriormente, en la sección 3.1.3, se identificaron las operaciones de las interfaces
identificadas. En la Figura 3.8 podemos ver el modelo de tipos refinado que ya
cuenta con las firmas de las operaciones que deberán soportar nuestras interfaces de
negocio.
3.2
Especificación de la arquitectura (prescriptiva)
basada en componentes
Partiendo del análisis efectuados en los apartados anteriores, en donde se realizó la
identificación de conceptos, interfaces de sistema e interfaces de negocio, se procede a
realizar el diagrama conceptual de los componentes que harán parte del sistema, ası́
como la relación existente entre dichos componente para, de esta manera, obtener la
arquitectura prescriptiva de nuestro sistema. La Figura 3.9 muestra la arquitectura
obtenida.
Cabe destacar que ninguno de los diseños en esta etapa contienen restricciones
de tipo tecnológico por lo que pueden ser implementados en cualquier plataforma
y/o lenguaje de programación.
Figura 3.9: Arquitectura prescriptiva basada en componentes [Elaboración propia]
En azul podemos identificar componentes que podrán ser reutilizados cuando se
46
Figura 3.8: Modelo de tipos [Elaboración propia]
47
esté realizando la implementación de la librerı́a.
3.3
3.3.1
Especificación de componentes
Especificación de interfaces
A continuación se muestran los diagramas con las interfaces tanto de negocio como
del sistema, sus operaciones y la información que mantendrán.
3.3.1.1
Interfaces de sistema
Figura 3.10: Interface de sistema ICodificar [Elaboración propia]
Figura 3.11: Interface de sistema IDecodificar [Elaboración propia]
Figura 3.14: Interface de sistema ICargarArchivo [Elaboración propia]
Figura 3.15: Interface de sistema IGenerarLlaves [Elaboración propia]
48
Figura 3.12: Interface de sistema IConsultarAyuda [Elaboración propia]
Figura 3.13: Interface de sistema AlmacenarArchivo [Elaboración propia]
49
3.3.1.2
Interfaces de negocio
Figura 3.16: Interface de negocio IGestorOperacionesMatematicas [Elaboración propia]
Figura 3.17: Interface de negocio IGestorArchivo [Elaboración propia]
50
Figura 3.18: Interface de negocio IGeneradorClave [Elaboración propia]
51
Figura 3.19: Interface de negocio ICodificadorIDEA [Elaboración propia]
52
Figura 3.20: Interface de negocio ICodificadorRSA [Elaboración propia]
53
Figura 3.21: Interface de negocio IGestorNumero [Elaboración propia]
54
Capı́tulo 4
Fase de Provisión y Ensamble
de Componentes
Esta etapa consiste en la creación de los componentes descritos durante el desarrollo
del documento para cumplir los requerimientos del sistema. En esta etapa es posible
también que, dentro de lo posible, se adquieran componentes ya desarrollados y se
adapten al sistema diseñado, sin embargo inicialmente todos los componentes aquı́
descritos serán desarrollados en su totalidad.
4.1
Arquitectura descriptiva de componentes
Del análisis realizado en el capı́tulo anterior, más especı́ficamente en la Sección
3.2 en donde se muestra el modelo de componentes sin incluir información
sobre la tecnologı́a a utilizar (arquitectura prescriptiva) partimos para realizar un
acercamiento a la tecnologı́a sobre la cuál desarrollaremos los componentes, OZ en
este caso, especificando de esta manera la arquitectura descriptiva del sistema que
puede verse en la Figura 4.1.
Podemos notar en este modelo una diferenciación de los componentes existentes;
al iniciar el paso desde el mundo conceptual hacia el mundo de la implementación
(incluyendo aspectos tecnológicos a nuestros análisis conceptuales), encontramos que
es posible crear functores orientados a entregar estructuras de datos que pueden ser
ejemplificadas y que ofrecen un conjunto de operaciones que no son expuestas en la
interfaz pero que pueden ser accedidas al ejemplificar el functor. En el la Figura
4.1, dichos componentes se encuentran en color azul.
En sı́ntesis, los componentes en color amarillo me exponen la interfaz del
componente y me permiten realizar el alambrado con el resto del sistema por
medio de puertos. Los componentes en azul contienen la implementación de la
funcionalidad expuesta en dicha interfaz.
55
Figura 4.1: Arquitectura descriptiva del sistema [Elaboración propia]
56
A continuación se utilizarán modelos de realización para modelar algunos detalles
de la tecnologı́a de implementación de los componentes teniendo en cuenta:
• En OZ los componentes se modelan utilizando el concepto de functor mostrado
en la Sección 1.5.1.2
• Las interfaces se exponen usando el tipo de dato abstracto (ADT ): Port. Esta
estructura ofrece dos operaciones, una para crear el puerto y la otra para enviar
mensajes a dicho puerto. Estos puertos serán usados para que los componentes
reciban peticiones y se encarguen de resolverlas.
• La implementación de las funciones se realizará utilizando objetos
ejemplificados partiendo de clases, concepto que es igual al de otros lenguajes
de programación como Java.
• Aprovecharemos una de las principales caracterı́sticas del lenguaje; usaremos
unidos los paradigmas de POO junto con programación funcional. La razón
principal se basa en el hecho de que los algoritmos que hacen parte de la
definición de RSA e IDEA son algoritmos matemáticos y se hace más sencillo
implementarlos como funciones que como métodos de una clase. Por ejemplo
el siguiente método:
meth textToASCIICode ( Texto ? A s c i i C o d e )
A s c i i C o d e = { TextToAscii Texto }
end
En realidad se encuentra implementado en la siguiente función:
fun { TextToAscii Texto }
case
Texto o f H| n i l then { AddLeadingZeros { I n t T o S t r i n g H}
Constant }
[ ] H| T then {Append { AddLeadingZeros { I n t T o S t r i n g H}
Constant } { TextToAscii T}}
end
end
• Los nombres de las variables en OZ se declaran en formato UpperCamelCase.
4.2
Diagramas intercomponentes: refinamiento
A continuación se refinan los diagramas intercomponentes incluyendo las
restricciones tecnológicas del lenguaje y las tecnologı́as seleccionadas.
Los diagramas que se muestran a continuación son los de las interfaces de sistema
ICargarArchivo Figura 4.2, IAlmacenarArchivo Figura 4.3, ICodificar e IDecodificar.
Los demás diagramas pueden ser consultados en el Anexo C.
Refinamiento Diagramas intercomponente Refinamiento de los diagramas
intercomponente de ICargarArchivo Figura 4.2 e IAlmacenarArchivo Figura 4.3.
57
Figura 4.2: Refinamiento CU001. Cargar Archivo [Elaboración propia]
Refinamiento Diagramas intercomponente Refinamiento de los diagramas
intercomponente de ICodificar 4.4 e IDecodificar 4.5.
58
Figura 4.3: Refinamiento CU017. Almacenar Archivo [Elaboración propia]
59
Figura 4.4: Refinamiento CU002. Codificar [Elaboración propia]
60
Figura 4.5: Refinamiento CU006. Decodificar [Elaboración propia]
61
4.3
Modelos de Realización de Interfaces
Estos modelos muestran cómo, en la tecnologı́a de componentes que usaremos para
el desarrollo del sistema, un componente “realiza” una especificación de componente
y cómo una interfaz “realiza” un tipo de interfaz. El objetivo es modelar detalles
de la implementación de los componentes que serán desarrollados.
En esta Sección se muestran los diagramas de realización de interfaces
de los componentes CodificadorIDEA, CodificadorRSA y GeneradorClave; para
información acerca de los otros componentes dirigirse al Anexo D.
Componente CodificadorIDEA En la Figura 4.6 podemos ver el modelo de
realización del CodificadorIDEA.
Componente CodificadorRSA En la Figura 4.7 podemos ver el modelo de
realización del CodificadorRSA.
Componente GeneradorClave
realización del GeneradorClave.
En la Figura 4.8 podemos ver el modelo de
62
Figura 4.6: Diagrama de realización componente CodificadorIDEA [Elaboración propia]
63
Figura 4.7: Diagrama de realización componente CodificadorRSA [Elaboración propia]
64
Figura 4.8: Diagrama de realización componente GeneradorClave [Elaboración propia]
4.4
4.4.1
Modelado intra-componente
Modelos estructurales
Los modelos estructurales representan las clases que harán parte de cada uno de los
componentes del sistema y las relaciones existentes entre ellas. De manera análoga
a la Sección Figura 4.3 en las Figuras 4.9, Figura 4.10 y Figura 4.11 se presentan
los modelos estructurales de los componentes CodificadorIDEA, CodificadorRSA y
GeneradorClave. En el Anexo E se encuentran los modelos restantes.
4.4.1.1
Diagramas de clases
Figura 4.9: Modelo estructural CodificadorIDEA [Elaboración propia]
65
Figura 4.10: Modelo estructural componente CodificadorRSA [Elaboración propia]
66
Figura 4.11: Modelo estructural componente GeneradorClave [Elaboración propia]
67
4.5
Modelos dinámicos intra-componente
Para modelar el comportamiento interno de los componentes usaremos diagramas de
secuencia. Estos diagramas nos permitirán detallar las interacciones entre los objetos
que hacen parte del componente y el intercambio de mensajes entre que existen entre
ellos de manera secuencial para lograr alguna funcionalidad del sistema.
Los diagramas que se muestran a continuación muestran el flujo de mensajes para
las funcionalidades del sistema de codificar usando el algoritmo RSA Figura 4.12,
decodificar usando el algoritmo RSA Figura 4.13 y generar llaves Figura 4.14.
Figura 4.12: Diagrama de secuencia para la codificación utilizando RSA [Elaboración
propia basada en UML]
68
Figura 4.13: Diagrama de secuencia para la codificación usando IDEA[Elaboración
propia basada en UML]
69
Figura 4.14: Diagrama de secuencia para la generación de llaves [Elaboración propia
basada en UML]
70
Capı́tulo 5
Modelado de la Interfaz Gráfica
de Usuario y estructura de CD
5.1
Diagrama de navegación
El componente visual del sistema es sencillo, con las funcionalidades necesarias para
permitir al usuario codificar, decodificar, cargar y guardar archivos, además de
realizar la generación de llaves.
El desarrollo de este aspecto del sistema se realizó con QTk, módulo que usa
descripciones (descriptions) para definir interfaces de usuario [23].
En la Figura 5.1 podemos ver el diagrama que resume las posibles interacciones
del usuario con el sistema.
Figura 5.1: Mapa de navegación Sistema de codificación [Elaboración propia]
71
5.2
Estructura de CD
El CD anexo a este documento contiene el código fuente y las fuentes de los
diagramas generados en cada una de las fases de desarrollo.
La estructura del mismo se puede ver en la figura 5.2.
Figura 5.2: Estructura del CD anexo [Elaboración propia]
72
Capı́tulo 6
Manual de instalación y de
usuario Librerı́a Criptográfica
6.1
6.1.1
Manual
de
desarrolladores)
configuración
(dirigido
a
Requerimientos hardware para instalación
El sistema desarrollado requiere un hardware convencional ya que no usa demasiados
recursos para su ejecución:
• Procesadores Intel Pentium 4, Intel Core Duo o Xeon; SSE2 como mı́nimo.
• Velocidad de procesamiento 2,2 GHz como mı́nimo; se recomienda Hyperthreading (HHT) o multinúcleo.
• Memoria RAM de 2GB mı́nimo, recomendado 4GB dependiendo del sistema
operativo se requiere hasta 8GB.
• 150MB para instalación de las herramientas en disco duro.
También es posible la ejecución sobre una máquina virtual que reúnan las
caracterı́sticas anteriores.
6.1.2
Requerimientos de software para instalación
Los requerimientos básicos para el funcionamiento de la librerı́a son:
• Mozart 1.4.0.
• GNU Emacs.
• ant (Opcional, para compilación y creación del ejecutable).
La instalación ha sido probada en los siguientes sistemas operativos:
• Windows 7 Sp1.
• Ubuntu 14.04 (32 bits).
73
6.1.3
Procedimiento para instalación (dirigido a desarrolladores)
El procedimiento para la instalación varı́a dependiendo del sistema operativo sobre
el cual se realizará la instalación, de esta manera para sistemas basados en Linux
se hace uso de la terminal y del administrador de paquetes correspondiente (Yum o
APT).
6.1.3.1
Instalación Ant
Para la compilación del software y la generación del ejecutable se crean un conjunto
de instrucciones que son ejecutadas usando [24]. Esta instalación es opcional ya que
la compilación puede hacerse functor por functor o clase por clase, al igual que la
generación del ejecutable.
Debido a que no es una parte crucial en el funcionamiento del software no se
detalla su instalación en el presente documento, la instalación se puede encontrar
en: http://ant.apache.org/manual/install.html.
6.1.3.2
Instalación Mozart OZ 1.4.0 sobre Linux (Ubuntu)
Las instrucciones de instalación junto con todos sus fuentes están en [25]; a
continuación referenciamos dicha documentación para la versión 1.4.0. Es necesario
comentar que la documentación oficial tiene los links desactualizado.
• Abra el Ubuntu Software Center (USC de ahora en adelante) busque e instale
el paquete mozart.
• Abra el USC busque e instale el paquete mozart-stdlib.
• Opcional: Abra el USC busque e instale el paquete mozart-docs
• Desde el mismo USC, busque e instale GNU/EMACS.
Solución de problemas
Could not load functor at URL: x-oz://system/wp/QTk.ozf Es posible
que el paquete con la librerı́a estándar de Mozart OZ no haya sido instalado,
asegúrese de haberlo hecho.
6.1.3.3
Instalación Mozart OZ 1.4.0 sobre Windows
• Descargue el ejecutable http://sourceforge.net/projects/mozart-oz/
files/v1/1.4.0-2008-07-04-windows/
• Instale el archivo descargado tal como lo harı́a con cualquier otra aplicación.
• Dirı́jase a la url http://ftp.gnu.org/gnu/emacs/windows/ y descargue
Emacs (emacs-24.3-bin-i386.zip).
• Descomprima el archivo en C:\Program Files (x86)\y cambie el nombre a
”Emacs”. De la misma manera a la carpeta dentro de esta dele el nombre de
”emacs”.
74
• Vaya al ”Panel de Control” ”Sistema y Seguridad” y seleccione la opción
”Configuración Avanzada del Sistema”.
• De click en ”Variables de Entorno” y cree una nueva entrada con
esta información:
Variable:
OZEMACS Valor:
C:\Program Files
(x86\Emacs\emacs\bin\runemacs.exe
6.1.4
Código fuente y generación de ejecutable
El código fuente del aplicativo puede ser encontrado en https://github.com/
yupegom/ComponentesCriptograficos. Se puede descargar un archivo .zip o usar
git [26] para obtenerlo.
Si se cuenta con ant simplemente hay que ir a la ruta en la que se descargó
o descomprimió el programa, ingresar a la carpeta ”ComponentesCriptograficos” y
ejecutar ant.
Lo que hace ant es leer el archivo compilarFunctores.compile y ejecutar las lı́neas
descritas en ese archivo. En caso de que se encuentre en Linux debe renombrar el
archivo compilarFunctores ubuntu.compile a ”compilarFunctores.compile” para
que la compilación y la generación del ejecutable se haga desde ahı́.
6.2
Manual de instalación (orientado a usuario final)
En este caso simplemente dirı́jase al CD anexo, ingrese al folder
ComponentesCriptograficos/Interfaz/Gui.
Si está sobre Windows lance el ejecutable GHI.exe. Si está sobre Ubuntu abra
la terminal y ejecute el comando ./GUI.exe.
El uso del sistema es bastante sencillo, sin embargo, en caso de requerir ayuda
adicional, el sistema contiene una opción de Ayuda que podrá resolver inconvenientes
relacionados con la usabilidad del mismo o el funcionamiento de los algoritmos
desarrollados.
6.3
Manual de usuario
A continuación se muestra un ejercicio de codificación y decodificación usando el
algoritmo RSA para ilustrar el uso de la librerı́a.
1. Generar las claves usando RSA
75
Figura 6.1: Generación de claves RSA [Elaboración propia]
Figura 6.2: Generación de claves RSA [Elaboración propia]
2. Seleccionar el archivo a codificar
Figura 6.3: Selección archivo [Elaboración propia]
76
Figura 6.4: Selección archivo [Elaboración propia]
Figura 6.5: Contenido del archivo cargado [Elaboración propia]
3. Dar click en Codificar y selecciona la clave necesaria para codificar (para RSA
debe ser la clave pública).
Figura 6.6: Codificación [Elaboración propia]
77
Figura 6.7: Selección de la clave requerida [Elaboración propia]
Figura 6.8: Contenido codificado [Elaboración propia]
4. Dar click en Decodificar y selecciona la clave necesaria para codificar (para
RSA debe ser la clave privada).
Figura 6.9: Decodificación [Elaboración propia]
78
Figura 6.10: Selección de la clave requerida [Elaboración propia]
Figura 6.11: Archivo decodificado [Elaboración propia]
79
Capı́tulo 7
Conclusiones
A lo largo de este documento y con base en los artefactos asociados y generados
a partir del problema que se planteó resolver, se buscó principalmente desarrollar
un producto de software utilizando una metodologı́a que en la teorı́a nos ofrecı́a
una variedad de caracterı́sticas deseables en cualquier proyecto de este tipo como
la extensibilidad, la mantenibilidad, la reusabilidad, entre otras, y verificar en la
práctica los beneficios de seguir este proceso de desarrollo.
A partir del modelo de la arquitectura descriptiva descrita en la Sección 4.1
podemos notar que estas caracterı́sticas pueden ser aplicables disminuyendo los
riesgos de modificar o agregar funcionalidades al sistema; Un ejemplo puede asociarse
al aspecto relacionado con el mantenimiento del sistema, ya que es posible, a
partir del diagrama desarrollado (y su correspondiente implementación), afirmar
que cada componente puede manipularse de manera aislada sobre uno o más
componentes afectando de manera mı́nima el resto de funcionalidades que no
requieran modificaciones. Otro claro ejemplo tiene que ver con la reusabilidad; en
este caso existen varios componentes que son reutilizados, disminuyendo la creación
de funcionalidades que puedan existir ya en alguno de los componentes. De la
misma manera podemos imaginar un escenario realista en el que se desee agregar un
nuevo algoritmo de codificación, es posible que alguna de las operaciones requeridas
para codificar o generar las claves del mismo se encuentren ya implementadas en
el componente matemático. En caso de no ser ası́ es posible entonces tomar este
componente, extenderlo y reemplazarlo sin necesidad de manipular o afectar los
demás componentes del sistema.
Para ilustrar los aspectos relacionados con la extensibilidad y la mantenibilidad
del sistema podrı́amos devolvernos unos cuantos capı́tulos en el documento hasta
la Sección 3.2 donde obtuvimos nuestra arquitectura prescriptiva, Figura 3.9 y que,
para facilitar la lectura incluimos nuevamente en la Figura 7.1. Como vemos en dicha
figura, hay algunos componentes en color verde que fácilmente sustentan nuestra
afirmación de la capacidad de reutilización de los componentes del sistema. Pero,
¿Qué hay con la mantenibilidad y la extensibilidad?
80
Figura 7.1: Arquitectura prescriptiva basada en componentes [Elaboración propia]
Para responder dicha pregunta podrı́amos pensar en un escenario relacionado
con el componente GestorArchivo. Este componente ofrece una caracterı́stica más
que deseada y es que no solo puede ser usado para la Librerı́a que desarrollamos si no
que serı́a de utilidad para cualquier sistema que requiriera cargar un archivo de texto
en memoria y mostrarlo en algún componente visual o hacer algún procesamiento
con el mismo. Sin embargo tiene una limitante, solo carga archivos de texto plano
(*.txt), que para el alcance de nuestro sistema es una limitante aceptable. Si, por
ejemplo se desea realizar la codificación de otro tipo de archivos, digamos, *.pdf, el
mismo componente puede ser extendido para cumplir esta funcionalidad sin afectar
la funcionalidad actual.
Para lograrlo el componente deberı́a ser extendido con una nueva interfaz que
permita a los clientes de la misma, indicar qué tipo de archivos desea procesar. La
implementación de dicha interfaz podrı́a reusar la funcionalidad de la interfaz actual,
añadiendo el algoritmo necesario para alcanzar el procesamiento de los nuevos tipos
de archivo. El diseño por componentes nos permite que este artefacto no solo sea
extendido con una funcionalidad nueva sino que los componentes que operan con
la funcionalidad actual sigan operando hasta que se decida migrar hacia la nueva
implementación. La Figura 7.2 ilustra la idea descrita.
¿Y si encontramos un componente nuevo, con mayores funcionalidades? Si
la interfaz es igual, serı́a tan sencillo como cambiar un componente por otro (en
OZ serı́a modificar un archivo *.ozf por otro). En otro caso los componentes que
requieren a este nuevo componente deben alinear sus interfaces de requerimiento
con las interfaces de provisión de este nuevo componente. Este procedimiento
puede realizarse de manera incremental hasta reemplazar totalmente el componente
”antiguo” haciendo que el funcionamiento del sistema no se vea afectado durante el
acoplamiento del nuevo componente, de la misma manera a como fue descrito en el
apartado anterior, con la diferencia de que no es solo la interfaz la que cambia sino
el componente en su totalidad.
81
Figura 7.2: Arquitectura prescriptiva basada en componentes [Elaboración propia]
En cuanto a extender la Librerı́a con nuevos algoritmos, lo primero que se deberı́a
identificar es aquellos componentes que serı́an reutilizables, aunque probablemente
requieran ser extendidos, para las nuevas implementaciones. En este sentido es
posible que los tres componentes en verde (Figura 3.9) sean, la mayorı́a de veces,
los candidatos más evidentes; entonces incluir un nuevo algoritmo implica extender
componentes existentes (si es requerido), reutilizar funcionalidades que tal vez estén
ya desarrolladas (si es posible), y finalmente crear y alambrar los nuevos algoritmos.
De nuevo, todo esto sin afectar las funcionalidades actuales de la Librerı́a.
Todos los ejemplos descritos aplican también en la mantenibilidad del sistema.
Como se detalló en dichos ejemplos, realizar cambios en alguno de los componentes
ya sea para extender funcionalidades o para corregir errores en las existentes, no
implica afectar a todo el sistema, sino, a partes del mismo. Adicionalmente es
mucho más sencillo ubicar el pedazo del sistema que está fallando, aislarlo y corregirlo
mientras el resto de sus capacidades continúan operativas.
Para ilustrarlo vamos ahora al componente GestorClaves. En un escenario
extremo el componente deja de fallar y no me permite generar nuevas claves; sin
embargo esto no impide que con llaves que se han generado anteriormente el sistema
funcione correctamente mientras se repara el componente dañado. En la Figura 7.3
se puede ver este escenario. Adicionalmente la Figura muestra cómo el componente
puede ser aislado para ser corregido.
82
Figura 7.3: El generador de claves deja de funcionar [Elaboración propia]
Ahora bien, obtener tantos beneficios implica también mayores esfuerzos; las
etapas de diseño y creación de los componentes que harán finalmente parte del
producto en su totalidad requieren de mayor esfuerzo debido a que se debe crear
una visión del comportamiento y estructura no solo de cada uno de los componentes
si no del sistema en general y es necesario modelar y entender las interacciones que
deben existir tanto a nivel de cada componente del sistema como a nivel externo del
componente, es decir las relaciones que hay entre cada componente y que permiten
alcanzar la funcionalidad requerida.
Es ası́ que este esfuerzo puede notarse a lo largo del desarrollo del presente
documento y sus anexos, en donde se describen los diferentes artefactos generados
83
tanto a nivel externo del componente como a nivel interno (intra-componente). Cada
uno de estos modelos describe el sistema y puede ser visto y analizado tanto de
una manera general o global como de una manera un poco más individualizada.
El sistema cuenta no solo con una estructura completa si no con los modelos
estructurales de cada una de sus partes haciendo que no se requiera entender el
sistema en su totalidad para realizar cambios sobre el mismo; para tal fin basta
con conocer las interfaces que ofrece y las firmas de las mismas para mantener la
funcionalidad para la que fue construido evitando afectar las interacciones con otros
componentes del sistema.
Entonces la pregunta es, ¿Vale la pena este esfuerzo en relación a los beneficios
obtenidos? En el caso del problema que nos lanzamos a resolver podemos afirmar
que haber escogido esta metodologı́a ofrece al sistema una flexibilidad y una mayor
simplicidad en el mantenimiento del mismo, por nombrar algunas caracterı́sticas,
que no se puede obtener comparada con otras metodologı́as. Y no hablamos solo
del código generado sino de la documentación que soporta lo producido.
Sin embargo hay una limitante al desarrollar software siguiendo esta metodologı́a
y tiene que ver con la capacidad de obtener retroalimentación de las funcionalidades
que se van creando; al centrarnos en la generación de un componente durante la fase
de provisión e implementación se hace difı́cil ofrecer al usuario final una vista que
genere valor de negocio y a partir de la cual se pueda disminuir esa brecha siempre
existente entre lo que el usuario desea y lo que el sistema realmente hace.
En este sentido se podrı́a pensar en desarrollar funcionalidades en las que
intervengan varios componentes y que puedan ser socializadas en tiempos cortos
para lograr la finalidad comentada en el párrafo anterior y no dedicarse a desarrollar
un componente en particular que no pueda ser razonado y entendido por el cliente
y que al final tal vez no hace lo que realmente se esperaba, uno de los fallos más
recurrentes en la creación de software.
84
Capı́tulo 8
Trabajo Futuro
• Alambrado de componentes mediante una interface visual y que permita
hacerlo de una manera más dinámica. Una idea que surgió durante el
desarrollo era crear una herramienta que funcione de manera similar a Orange
[27] una herramienta de visualización de datos en la que existen widgets que
son arrastrados a un canvas y conectados entre si. La idea consiste en crear
los componentes de la librerı́a simulando los widgets y asociando sus interfaces
de provisión y de requerimiento mediante conectores visuales.
Orange está escrito en Phyton, un lenguaje interpretado igual que OZ por
lo que intuitivamente podrı́a ser una buena opción implementar la idea con
Orange; no se descarta que puedan haber otras herramientas visuales que
podrı́an interactuar con OZ para alcanzar este obejtivo.
• Existen bastantes y variados algoritmos de codificación, incluso versiones
mejoradas de los desarrollados en esta versión de la librerı́a. A continuación
describimos brevemente algunos algoritmos que pueden ser incluidos:
– Diffie-Hellman: Algoritmo de clave pública. Se considera seguro
cuando llaves suficientemente largas y generadores apropiados son usados.
Más información relacionada con este algoritmo en [28].
– LUc: Algoritmo de clave pública, alternativa que dice ser más segura
que el RSA. Descrito por primera vez en [29]
– SAFER: Diseñado principalmente por James Massey, quién también
hizo parte del diseño del algoritmo IDEA. Los anteriores SAFER+ y
SAFER SK usan la misma función de codificación pero difieren en el
número de rondas [30] [30].
• Caché de los archivos codificados, añadiendo un mecanismo que permita
establecer si un archivo fue codificado anteriormente y entregarlo al usuario
sin necesidad de volver a realizar el proceso completo.
• Aplicar el modelo de distribución de Mozart-OZ haciendo que los componentes
de la librerı́a se encuentren en diferentes locaciones. Aunque la librerı́a
actualmente no realiza un consumo notable de recursos, eventualmente podrı́a
crecer lo suficiente para pensar en que los componentes más exigentes pueden
estar distribuidos en máquinas con menor carga de trabajo o con mayores
capacidades. Es posible también pensar en un escenario con varias instancias
85
de un mismo componente en diferentes máquinas que son balanceadas
mediante un proxy u otro mecanismo.
Sin embargo este trabajo no solo implica lograr conectar los componentes
remotos entre si, también deben establecerse mecanismos de recuperación y
de reintentos, entre muchos otros aspectos a tener en cuenta cuando se trabaja
en un ambiente distribuido. Este serı́a el resultado más valioso ya que servirı́a
de base para otros sistemas que requieran más recursos y por lo tanto sea
inevitable que el ambiente en el que se desenvuelva sea distribuido.
• Realizar la codificación de archivos en otros formatos (pdf, xls, docx, etc).
• Implementar la librerı́a en escenarios como los de las Figuras 1.1 y 1.2 haciendo
que codifique/decodifique los paquetes de datos transferidos en un canal de
comunicación; la librerı́a actualmente está concebida solo para codificación y
decodificación de archivos localmente.
86
Anexos
87
Anexo A
Casos de uso
CU003. Codificar Mediante RSA La Figura A.1 muestra el diagrama de casos
de uso para la codificación de texto utilizando el algoritmo RSA.
Figura A.1: Diagramas de casos de uso para codificación de texto mediante RSA
[Elaboración propia basada en UML]
88
Formato extendido
Nombre Caso de Uso: Codificar Mediante RSA
Código Caso de Uso: CU003
Actores: Usuario
Descripción: El usuario codificar un texto con el algoritmo de codificación RSA.
Referencias Cruzadas a Requerimientos: REQF1, REQF1.1, REQF1.3, REQF3,
REQF3.2, REQF5, REQF5.2, REQF5.3
Referencias Cruzadas a CU: CU019, CU004
Precondiciones: Debe existir un archivo cargado en el sistema. Deben cargarse las llaves
con las que se desea codificar.
Escenario:
Poscondiciones: El archivo es codificado con el algoritmo RSA mostrado al usuario en
un componente GUI apropiado.
Prioridad: Normal
89
CU004. Codificar Bloques RSA La Figura A.2 muestra el diagrama de casos
de uso para la codificación por bloques realizada al usar el algoritmo RSA.
Figura A.2: Diagramas de casos de uso para codificación de texto por bloques mediante
RSA [Elaboración propia basada en UML]
90
Formato extendido
Nombre Caso de Uso: Codificar Bloques RSA
Código Caso de Uso: CU004
Actores: Sistema
Descripción: El sistema divide los bloques del texto insertado por el usuario y los codifica
uno a uno para al final concatenarlos de nuevo ya con el texto completo codificado.
Referencias Cruzadas a Requerimientos: REQF3, REQF3.2
Referencias Cruzadas a CU: CU003
Precondiciones: Debe existir un archivo cargado en el sistema. Deben haberse cargado
las llaves con las que se desea codificar.
Escenario:
Poscondiciones: Se concatenan los bloques codificados y genera el texto
Prioridad: Normal
91
CU005. Codificar Mediante IDEA La Figura A.3 muestra el diagrama de
casos de uso para la codificación por bloques realizada al usar el algoritmo IDEA.
Figura A.3: Diagramas de casos de uso para codificación de texto mediante IDEA
[Elaboración propia basada en UML]
92
Formato extendido
Nombre Caso de Uso: Codificar Mediante IDEA
Código Caso de Uso: CU005
Actores: Usuario, Sistema
Descripción: El usuario selecciona y carga un archivo para codificar, selecciona el tipo
de codificación con la que desea procesar el texto y da click en codificar.
Referencias Cruzadas a Requerimientos: REQF1, REQF1.1, REQF1.2, REQF1.3,
REQF3, REQF3.1, REQF5, REQF5.1, REQF5.3
Referencias Cruzadas a CU: CU006
Precondiciones: Debe existir un archivo cargado en el sistema. Deben haberse cargado
las llaves con las que se desea codificar.
Escenario:
Poscondiciones: Se muestra al usuario el resultado de la codificación
Prioridad: Normal
93
CU006. Codificar Bloque IDEA La Figura A.4 muestra el diagrama de casos
de uso para la codificación por bloques realizada al usar el algoritmo RSA.
Figura A.4: Diagramas de casos de uso para codificación de texto por bloques mediante
el algoritmo IDEA [Elaboración propia basada en UML]
94
Formato extendido
Nombre Caso de Uso: Codificar Bloque IDEA
Código Caso de Uso: CU006
Actores: Sistema
Descripción: El sistema recibe los bloques del texto seleccionado por el usuario y los
codifica uno a uno para concatenarlos al final.
Referencias Cruzadas a Requerimientos: REQF3, REQF3.1, REQF5, REQF5.1
Referencias Cruzadas a CU: CU005, CU010
Precondiciones: Debe existir un texto para codificar, deben existir las llaves adecuadas
para realizar la codificación.
Escenario:
Poscondiciones: Se muestra al usuario el resultado de la codificación
Prioridad: Normal
95
CU008.Decodificar Mediante RSA La Figura A.5 muestra el diagrama de
casos de uso para la decodificación de texto utilizando el algoritmo de decodificación
RSA.
Figura A.5: Diagramas de casos de uso para la decodificación [Elaboración propia
basada en UML]
96
Formato extendido
Nombre Caso de Uso: Decodificar Mediante RSA
Código Caso de Uso: CU008
Actores: Usuario, Sistema
Descripción: El usuario carga un archivo en el sistema y da click en decodificar mediante
RSA.
Referencias Cruzadas a Requerimientos: REQF4, REQF4.2, REQF6, REQF6.2,
REQF6.3
Referencias Cruzadas a CU: CU009, CU019
Precondiciones: Debe existir un texto para decodificar, deben existir las llaves adecuadas
para realizar la decodificación.
Escenario:
Poscondiciones: Se muestra al usuario el resultado de la decodificación
Prioridad: Normal
97
CU009. Decodificar Bloques RSA La Figura A.6 muestra el diagrama de
casos de uso para la decodificación de texto por bloques cuando se utiliza RSA para
decodificar.
Figura A.6: Diagramas de casos de uso para la decodificación usando el algoritmo RSA
[Elaboración propia basada en UML]
98
Formato extendido
Nombre Caso de Uso: Decodificar Bloques RSA
Código Caso de Uso: CU009
Actores: Sistema
Descripción: El sistema toma los bloques del texto y los decodifica uno a uno para al
final concatenarlos.
Referencias Cruzadas a Requerimientos: REQF4, REQF4.2, REQF6, REQF6.2,
REQF6.3
Referencias Cruzadas a CU: CU008
Precondiciones: Debe existir un texto para decodificar, deben existir las llaves adecuadas
para realizar la decodificación.
Escenario:
Poscondiciones: Se obtienen los bloques decodificados y concatenados
Prioridad: Normal
99
CU010. Decodificar Mediante IDEA La Figura A.7 muestra el diagrama de
casos de uso para la decodificación de texto mediante IDEA.
Figura A.7: Diagramas de casos de uso para la decodificación usando el algoritmo IDEA
[Elaboración propia basada en UML]
100
Formato extendido
Nombre Caso de Uso: Decodificar Mediante IDEA
Código Caso de Uso: CU010
Actores: Usuario, Sistema
Descripción: El usuario selecciona un texto y da click en decodificar mediante IDEA.
Referencias Cruzadas a Requerimientos: REQF4, REQF4.1, REQF6, REQF6.1,
REQF6.3, REQF6.4
Referencias Cruzadas a CU: CU006
Precondiciones: Debe existir un texto para decodificar, deben existir las llaves adecuadas
para realizar la decodificación.
Escenario:
Poscondiciones: Se muestra al usuario el resultado de la decodificación realizada.
Prioridad: Normal
CU011. Consultar Ayuda La Figura A.8 muestra el diagrama de casos de uso
para mostrar información relacionada con los algoritmos.
Figura A.8: Diagramas de casos de uso para la consulta de ayuda [Elaboración propia
basada en UML]
101
Formato Extendido
Nombre Caso de Uso: Consultar Ayuda
Código Caso de Uso: CU011
Actores: Usuario, Sistema
Descripción: El usuario consulta la descripción de alguno de los algoritmos de la librerı́a
o con el funcionamiento del sistema.
Referencias Cruzadas a Requerimientos: REQF10, REQF11
Referencias Cruzadas a CU: CU001
Precondiciones: Ninguna
Escenario:
Poscondiciones: Se muestra al usuario la información solicitada.
Prioridad: Normal
102
CU012. Generar Llaves RSA La Figura A.9 muestra el diagrama de casos de
uso para generar las llaves del algoritmo RSA.
Figura A.9: Diagramas de casos de uso para la generación de llaves RSA [Elaboración
propia basada en UML]
103
Formato extendido
Nombre Caso de Uso: Generar Llaves RSA
Código Caso de Uso: CU012
Actores: Usuario, Sistema
Descripción: El usuario desea genera las claves para el algoritmo RSA.
Referencias Cruzadas a Requerimientos: REQF7, REQF7.2, REQF8, REQF8.1,
REFQ8.2, REFQ9, , REFQ9.1, REFQ9.2
Referencias Cruzadas a CU: CU013, CU018
Precondiciones: Seleccionar RSA para generar las llaves
Escenario:
Poscondiciones: Se crea un archivo con las claves privada y pública del algoritmo RSA.
Prioridad: Normal
104
CU013. Generar Numero Aleatorio La Figura A.10 muestra el diagrama de
casos de uso para generar números aleatorios que posteriormente serán usados en la
generación de claves.
Figura A.10: Diagramas de casos de uso para generación de números aleatorios
[Elaboración propia basada en UML]
105
Formato extendido
Nombre Caso de Uso: Generar Numero Aleatorio
Código Caso de Uso: CU013
Actores: Sistema
Descripción: El sistema genera números aleatorios para la generación de las llaves.
Referencias Cruzadas a Requerimientos: REQF7, REQF7.1, REQF7.2, REQF8,
REQF8.1, REFQ8.2, REFQ9, REFQ9.1, REFQ9.2
Referencias Cruzadas a CU: CU012, CU014
Precondiciones: Ninguna
Escenario:
Poscondiciones: Se generan aleatorios en memoria.
Prioridad: Normal
106
CU014. Generar clave IDEA La Figura A.11 muestra el diagrama de casos de
uso para generar las claves del algoritmo IDEA.
Figura A.11: Diagramas de casos de uso para la generación de claves del algoritmo
IDEA [Elaboración propia basada en UML]
107
Formato extendido
Nombre Caso de Uso: Generar clave IDEA
Código Caso de Uso: CU014
Actores: Usuario, Sistema
Descripción: El usuario desea generar las claves para la codificación con IDEA.
Referencias Cruzadas a Requerimientos: REQF7, REQF7.1, REQF8, REQF8.3,
REFQ9
Referencias Cruzadas a CU: CU013, CU015, CU016
Precondiciones: Ninguna
Escenario:
Poscondiciones: Se genera el archivo con un aleatorio que posteriormente será usado
para crear las subclaves de codificación y decodificación
Prioridad: Normal
108
CU015. Generar Subclaves IDEA La Figura A.12 muestra el diagrama de
casos de uso para generar las subclaves para realizar la codificación con el algoritmo
IDEA.
Figura A.12: Diagramas de casos de uso para la generación de subclaves de codificación
del algoritmo IDEA [Elaboración propia basada en UML]
109
Formato extendido
Nombre Caso de Uso: Generar Subclaves IDEA
Código Caso de Uso: CU015
Actores: Sistema
Descripción: El sistema toma como entrada un número aleatorio generado previamente,
a partir de el genera las claves descritas en el algoritmo.
Referencias Cruzadas a Requerimientos: REQF7, REQF7.1, REQF8, REQF8.3,
REFQ9
Referencias Cruzadas a CU: CU014
Precondiciones: Tener cargado en memoria el número del que se parte para generar las
claves
Escenario:
Poscondiciones: Se generan el arreglo de claves necesarias para la codificación
Prioridad: Normal
110
CU016. Generar Subclaves Descifrado IDEA La Figura A.13 muestra el
diagrama de casos de uso para generar las subclaves para realizar la decodificación
con el algoritmo IDEA.
Figura A.13: Diagramas de casos de uso para la generación de subclaves de
decodificación algoritmo IDEA [Elaboración propia basada en UML]
111
Formato extendido
Nombre Caso de Uso: Generar Subclaves Descifrado IDEA
Código Caso de Uso: CU016
Actores: Sistema
Descripción: El sistema toma como entrada un número aleatorio generado previamente,
a partir de el genera las claves descritas en el algoritmo y luego aplica el procedimiento
requerido para, a partir de las claves de cifrado, obtener las de descifrado.
Referencias Cruzadas a Requerimientos: REQF7, , REQF7.1, REQF8, REQF8.3,
REFQ9
Referencias Cruzadas a CU: CU014
Precondiciones: Tener cargado en memoria el número del que se parte para generar las
claves
Escenario:
Poscondiciones: Se generan el arreglo de claves necesarias para la decodificación
Prioridad: Normal
112
CU017. Almacenar Archivo La Figura A.14 muestra el diagrama de casos de
uso para almacenar archivos.
Figura A.14: Diagramas de casos de uso para el almacenamiento de archivos
[Elaboración propia basada en UML]
113
Formato extendido
Nombre Caso de Uso: Almacenar Archivo
Código Caso de Uso: CU017
Actores: Usuario, Sistema
Descripción: El usuario decide almacenar un archivo.
Referencias Cruzadas a Requerimientos: REQF2
Referencias Cruzadas a CU: CU002, CU007, CU018
Precondiciones: Seleccionar el path de almacenamiento
Escenario:
Poscondiciones: Se crea un archivo en el path seleccionado por el usuario
Prioridad: Normal
114
CU018. Generar Llaves La Figura A.15 muestra el diagrama de casos de uso
para generación de archivos.
Figura A.15: Diagramas de casos de uso para la generación de llaves [Elaboración propia
basada en UML]
115
Formato extendido
Nombre Caso de Uso: Generar Llaves
Código Caso de Uso: CU018
Actores: Usuario, Sistema
Descripción: El usuario desea genera las llaves de codificación y decodificación
Referencias Cruzadas a Requerimientos: REQF7, REQF7.1, REQF7.2, REQF8,
REQF8.1, REQF8.2, REQF8.3, REQF8.4, REQF9, REQF9.1, REQF9.2
Referencias Cruzadas a CU: CU011, CU012, CU017
Precondiciones: Ninguna
Escenario:
Poscondiciones: Se crea un archivo en el path seleccionado por el usuario con el contenido
de las laves que seleccionó generar.
Prioridad: Normal
116
CU019. Procesar Texto La Figura A.16 muestra el diagrama de casos de uso
para procesar el texto de codificación o decodificación.
Figura A.16: Diagramas de casos de uso para procesamiento del texto de entrada
[Elaboración propia basada en UML]
117
Formato extendido
Nombre Caso de Uso: Procesar Texto
Código Caso de Uso: CU019
Actores: Sistema
Descripción: El sistema procesa el texto para convertirlo a sı́mbolos numéricos o
viceversa
Referencias Cruzadas a Requerimientos: REQF5, REQF6
Referencias Cruzadas a CU: CU003, CU008
Precondiciones: Ninguna
Escenario:
Poscondiciones: Ninguna
Prioridad: Normal
118
Anexo B
Diagramas intercomponentes:
Fase de especificación,
Arquitectura Prescriptiva
Diagramas intercomponente IConsultarAyuda La Figura B.1 describe la
interacción que realiza el sistema con la interface de negocio IConsultarAyuda.
Figura B.1: Diagrama intercomponente CU010. Consultar Ayuda [Elaboración propia]
La Figura B.2 describe las operaciones identificadas para la interface
IConsultarAyuda a partir del diagrama anterior.
Figura B.2: Operaciones IConsultarAyuda [Elaboración propia]
Diagramas intercomponente IGeneradorClave Finalmente y de manera
similar, elaboramos el diagrama de secuencia para la interface de negocio
IGeneradorClave que se puede ver en la Figura B.3.
119
Figura B.3: Diagrama de secuencia CU018. Generar Llaves [Elaboración propia]
En la Figura B.4 se encuentran las operaciones de negocio de la interface
IGeneradorClave.
Figura B.4: Operaciones IGeneradorClave [Elaboración propia]
120
Anexo C
Refinamiento Diagramas
intercomponentes
Refinamiento Diagramas intercomponente IConsultarAyuda
diagrama intercomponente de la interface IConsultarInformacion
Figural C.1,
Figura C.1: Refinamiento CU010. Consultar Ayuda [Elaboración propia]
Refinamiento Diagramas intercomponente IGeneradorClave Figural C.2,
diagrama intercomponente de la interface IGenerarLlaves
121
Figura C.2: Diagrama de secuencia CU018. Generar Llaves [Elaboración propia]
122
Anexo D
Modelos de realización de
interfaces
Gestor Archivo: Figura D.1,
GestorArchivo
diagrama de realización del componente
Figura D.1: Diagrama de realización componente GestorArchivo [Elaboración propia]
Gestor Información:
GestorInformacion
Figura D.2:
propia]
Figura D.2, diagrama de realización del componente
Diagrama de realización componente GestorInformacion [Elaboración
Componente Matemático:
ComponenteMatematico
Figura D.3, diagrama de realización del componente
123
Figura D.3: Diagrama de realización componente ComponenteMatematico [Elaboración
propia]
124
Anexo E
Modelos estructurales
intra-componente
Gestor Archivo: Figura E.1, diagrama intra-componente del GestorArchivo
Figura E.1: Diagrama intra-componente del GestorArchivo [Elaboración propia]
Gestor
Información:
GestorInformacion
Figura
E.2,
Diagrama
intra-componente
del
Figura E.2: Diagrama intra-componente del GestorInformacion [Elaboración propia]
Componente Matemático:
ComponenteMatematico
Figura E.3,
125
Diagrama intra-componente del
Figura E.3:
propia]
Diagrama intra-componente del ComponenteMatematico [Elaboración
126
Bibliografı́a
[1] M. P. Martorell, Criptologı́a.
2000.
Escuela Universitária Politécnica de Mataró,
[2] “Instituto de Ingenierı́a Eléctrica (IIE),” http://iie.fing.edu.uy/ense/asign/
dsp/proyectos/1999/cripto/descripcion.html, Octubre 2011.
[3] H.-G. Gross, Component-Based Software Testing with UML Component-Based
Software Testing with UML. Springer, 2005.
[4] J. Cheesman and J. Daniels, UML Components: A Simple Process for
Specifying Component-Based Software, ser. Component Software Series.
Londres: Addison-Wesley, 2000.
[5] W. A. Scott, The elements of UML 2.0 Style. Press Syndicate of the Cambridge
University, 2005.
[6] A. Hedley, “The component industry metaphor,” in Component-based software
engineering, G. T. Heineman and W. T. Councill, Eds. Oxford: AddisonWesley Longman Publishing Co., Inc, 2001.
[7] H. A. Diosa, “Tesis de doctorado: Especificación de un modelo de
referencia arquitectural de software a nivel de configuración, estructura y
comportamiento,” Tesis de Doctorado, vol. Universidad del Valle, 2009.
[8] M. J. L. López, “E-book - criptografı́a y seguridad en computadores,” 2009.
[9] W. Diffie and M. E. Hellman, “New directions in cryptography,” IEEE
Computer Society, 1976.
[10] A. S. R.L. Rivest and L. Adleman, A method for obtaining digital signatures and
public-key cryptosystems. Communications of the ACM, 1978, pp. 120–126.
[11] W. Stallings, Cripthography and Network Security: Principles and Practice.
Prentice Hall, 1998.
[12] J. Samentinger, Software Engineering with Reusable Components.
Verlag, 1997.
Springer-
[13] C. Szyperski, Component Software, Beyond Object-Oriented Programming,
2nd ed. Addison-Wesley, 2002.
[14] J. T. Jerry Zesy Gao and Y. Wu, Testing and Quality Assurance for ComponentBased Software. Artech House, 2003.
127
[15] G. T. Leaven and M. Sitaraman, Foundations of component-based systems.
Press Syndicate of the Cambridge University, 2000.
[16] H. Jifeng, X. Li, and Z. Liu, Component-based software engineering, the need
to link methods and their theories. Springer, 2005.
[17] UML 2.0 Superstructure, 3rd Revision, OMG Object Management Group, 2004.
[18] P. Kruchten, The Rational Unified Process An Introduction, 3rd ed. Pearson,
2004.
[19] “Use case diagram,” https://en.wikipedia.org/wiki/Use Case Diagram, 2015.
[20] “The Mozart Programming System,” http://www.mozart-oz.org/, Octubre
2011.
[21] P. V. Roy and S. Haridi, Concepts, Techniques, and Model of Computer
Programming, ser. McGraw-Hill series on computer communications. MIT
Pressl, 2004. [Online]. Available: https://www.info.ucl.ac.be/∼pvr/book.html
[22] Unified Modeling Language Specification,
Management Group, 1997.
Version 1.5,
OMG Object
[23] “Qtk graphical user interface design for oz,” https://mozart.github.io/
mozart-v1/doc-1.4.0/mozart-stdlib/wp/qtk/html/index.html, 2004.
[24] “Apache ant,” http://ant.apache.org/, 2015.
[25] “Instalación mozar oz,” https://help.ubuntu.com/community/Mozart, 2015.
[26] “Git,” https://github.com/, 2015.
[27] “Data mining - fruitful and fun,” https://http://orange.biolab.si, 2015.
[28] M. Rhee, Cryptography and Secure Communications, ser. McGraw-Hill
series on computer communications. McGraw-Hill, 1994. [Online]. Available:
https://books.google.com.co/books?id=7gFrQgAACAAJ
[29] P. Smith, “Luc public key encryption: a secure alternative to rsa,” Dr. Dobb’s
Journal, vol. 18, no. 1, pp. 44–49, October 1993.
[30] “Safer,” http://en.wikipedia.org/wiki/SAFER, 2015.
128
Descargar