Inicio
Curriculum vitae
Intereses
Contacto
Mapa web
_______________
Album

_______________
Google





[ Java | SVG | Indice ]


El cifrador más simple del mundo.

El propósito de este tutorial, es explicar de forma sencilla como construir una aplicación de escritorio, autónoma, java, capaz de cifrar archivos, para ello se utilizara SWT con Jface para la interfaz de usuario y JCE para la parte de criptografía.

La principal razón para utilizar SWT y no Swing/AWT es la sencillez, por supuesto que SWT tiene ventajas e inconvenientes con respecto a Swing, pero no es el propósito de este articulo entrar en este tipo de debates.

Estas herramientas ya han demostrado su utilidad, un ejemplo es Azureus, un cliente de las redes BitTorrent enormemente popular.

Configuración.

El primer paso es obtener las librerías de SWT, si usas eclipse como IDE, ya las tendrás en tu sistema, de lo contrario, tendrás que descargarlas de la web de eclipse:

http://www.eclipse.org/downloads/index.php

Después deberás añadir estas librerías a tu class-path.

A excepción de swt-win32-3063.dll, que tiene que situarse en la carpeta bin del JRE que estés utilizando, o en alguna parte de tu árbol de directorios donde el SO pueda encontrarla..

Para la realización de este tutotial se ha utilizado eclipse como IDE, te puedes descargar el código de aquí y descomprimirlo obteniendo el esquema típico de un desarrollo con eclipse.

Mi primera aplicación.

Ahora ya estamos preparados para comenzar a desarrollar nuestra aplicación, los casos de uso son de lo más sencillo, la verdad es que no se para que me molesto en hacerlos:

La descripción del primer caso de uso puede ser la siguiente:

La descripción del caso de uso desencriptar sería análoga.

Si nos fijamos en como se relaciona el usuario con la GUI, vemos que introduce datos de forma secuencial, este comportamiento se puede implementar mediante un wizard, y estamos de suerte, porque en jface ya se dispone de este tipo de diálogo.

Esta es la clase central de nuestra aplicación, como se puede ver en el listado anterior extiende a ApplicationWindow.

Y en el constructor añadimos una barra de menú, una línea de estado y una barra de herramientas, en este orden.

 

La apariencia de nuestra aplicación será:

Al extender de ApplicationWindow tenemos que utilizar el método createContents para establecer las características de nuestra pantalla principal, como pueden ser las dimensiones, el título y para añadir y distribuir los elementos que aparecerán en ella, en este caso una tabla con tres columnas (una para el fichero de entrada, que dependiendo del caso será de encriptado o desencriptado, otra columna para el fichero de salida y una tercera que indicara si ha sido encriptado o desencriptado con una "E" y una "D" respectivamente).

Previamente es necesario crear un formulario y añadir la tabla al formulario.

Para configurar el Menú tendremos que utilizar el método createMenuManager:

Creamos un MenuManeger padre llamado bar, al cual le añadimos dos hijos con el rótulos File y Help respectivamete, a estos les añadimos Acciones, las cuales explicaremos posteriormente en el apartado Actions.

Para configurar la barra de herramientas deberemos utilizar createToolBarManager, en donde añadimos las mismas acciones que utilizamos con el Menú.

Para poder ejecutar nuestra aplicación necesitaremos un método main.

 

Actions

Aquí podemos ver un ejemplo de Acción, si nos fijamos en el listado, es necesario que extienda la clase Action, esto nos obliga a sobrescribir, el método run, en donde colocaremos el código a ejecutar cada vez que utilicemos esta acción, en este caso es muy sencillo lo único que realizamos es abrir un dialogo que cuenta quien es el autor de la aplicación.

En la segunda línea declaramos el logotipo de esta acción, el cual se verá en el menú y en la barra de herramientas, para ello utilizamos el objeto ImageDescriptor.

En el constructor le pasamos la ventana desde la que se invoca, añadimos un título, un mensaje que aparecerá al pasar el ratón por encima de la imagen que representa a esta acción y añadimos el logotipo.

El resultado será el siguiente:

 

Wizard

Para crear un wizard con SWT y Jface son necesarias dos cosas, la clase que represente el wizard y las distintas pantallas que forman el wizard, el wizard, como vemos en el siguiente listado debe extender a la clase Wizard, un poco redundante, no? y las pantallas deben extender a WizardPage, en el listado que tenemos a continuación vemos que al principio se declaran dos objetos de la clase FileDataPage y keypage, ambos son pantallas del wizard y por lo tanto extienden a WizardPage como hemos dicho anteriormente y ya los explicaremos con posterioridad, a continuación pasemos a describir brevemente el Wizard.

La variable selection es necesaria para el correcto funcionamiento del wizard.

El método donde añadimos las distintas pantallas es addPages:

Cuando el usuario pulse el botón rotulado con Finish que aparece en todas las pantallas del wizard se ejecutará el código contenido en performFinish:

Aquí es donde encriptamos el contenido del fichero, como se puede ver se accede a los valores de las pantallas del wizard directamente para recuperar el valor de la clave o la ruta del fichero.

En cuanto a la forma de encriptar sólo es necesario señalar que se utiliza SecretKeySpec para conseguir la clave, al constructor le pasamos la clave que ha introducido el usuario y un string que identifique el algoritmo a usar, en este caso es DES.

Para encriptar utilizamos una clase de Java Developers Almanac 1.4 que se puede encontrar en: http://javaalmanac.com/egs/javax.crypto/DesFile.html

Después de encriptar añadimos la información a la tabla y mostramos el mensaje de que todo ha ido bien en la barra de estado de la ventana principal (estos dos métodos se encontraran en CryptMain.java.

En caso de que falle algo y se produzca una excepción se le muestra un mensaje al usuario contándole lo que ha pasado mediante el objeto MessageDialog.

Nota: El trozo de código:

p = p.replace('\\', '/');

Hace que esta aplicación de fallos al ejecutarse en otros SO como por ejemplo linux, java dispone de las herramientas necesarias para poder utilizar rutas a archivos de forma independiente del SO y debería utilizarse aunque este no es el propósito de este artículo.

PageWizard

Utilizaremos la pantalla para seleccionar un fichero como ejemplo para explicar las pantallas de un wizard, el aspecto que queremos que presente es el siguiente:

 

Como queremos tener acceso al campo de texto lo definimos como una variable de clase, el botón no será necesario porque sólo lo queremos para abrir un dialogo en el que podamos seleccionar un fichero, y lo podemos declarar dentro del método createControl, que es donde configuramos y distribuimos los elementos de la pantalla.

Para distribuirlos utilizamos GridLayout , que es parecido a GridBackLayout de Swing, al añadir elementos como rótulos (o labels), botones o campos de texto a GridLayaut con:

GridData gd = new GridData(GridData.FILL_HORIZONTAL);

urlText.setLayoutData(gd);

Se colocarán los elementos uno a continuación de otro y cuando se acaben las columnas se pasará a la siguiente línea.

Para controlar los eventos, como por ejemplo modificar el contenido de un campo de texto es necesario añadir Listeners.

urlText.addModifyListener(new ModifyListener() {

public void modifyText(ModifyEvent e) {

dialogChanged();

}

});

En la función dialogChanged, realizamos las comprobaciones, y en updateStatus mostramos los posibles mensajes de error en la parte superior de la ventana:

Por hacer

Sería buena idea mezclar los dos wizards, el de cifrar y descifrar, en sólo uno ya que son prácticamente idénticos, y por otra parte en este ejemplo se utiliza DES, el cual es un algoritmo simétrico y no tendría porque diferenciarse los dos procesos, pero por otra parte, además de DES existen otros muchos algoritmos en JCE y no todos son simétricos, esto puede ser otro punto de mejora, introducir otra pantalla en el wizard que permita seleccionar el algoritmo de encriptación, e incluso otra pantalla o en la que podamos especificar el nombre del fichero de salida.

Un paso aconsejable sería construir un programa instalador con izpack por ejemplo, http://www.izforge.com/izpack/ o con cualquier otro generador de instaladores de código abierto http://java-source.net/open-source/installer-generators.

Se podría hacer un plugin para eclipse con la misma funcionalidad.

Como esta ahora en la tabla sólo se muestran las operaciones de una sesión, se podría dar persistencia a estos datos, de tal forma que pudiésemos contar con un historial de todos los archivos cifrados a través de distintas sesiones, usando una base de datos, como por ejemplo HSQLDB, estaría bien usar hibernate también.

En lo que al código se refiere se puede refactorizar para mejorar sus características.

Se pueden añadir test unitarios con JUnit y un sistema de logging con algo del estilo de log4j, pero no es el propósito de este artículo.

Conclusiones

Es evidente que existen muchas cosas a mejorar en esta aplicación, desde la gestión de errores hasta la internacionalización pasando por muchos otros factores, pero espero que haya quedado patente la facilidad con la que se puede desarrollar una aplicación con SWT y Jface.

Enlaces

SWT y JFace

Using the Eclipse GUI outside the Eclipse Workbench, Part 1: Using JFace and SWT in stand-alone mode

http://www-106.ibm.com/developerworks/java/library/os-ecgui1/

Developing JFAce wizards

http://www-106.ibm.com/developerworks/java/library/os-ecjfw/

 

File Dialog Example

http://www.java2s.com/ExampleCode/SWT-JFace-Eclipse/FileDialogExample.htm

JCE

Encrypting a File or Stream with DES

http://javaalmanac.com/egs/javax.crypto/DesFile.html




[ Java | SVG | Indice ]








www.javierlop.tk
2002-2006