miércoles, 28 de noviembre de 2007

Ejempo de Criptografía simétrica en Java

La criptografía simétrica es un metodo de criptografía que utiliza una misma clave para cifrar y descrifar un mensaje. Las dos partes encargadas de comunicarse deben de ponerse de acuerdo en la clave a utilizar para el envio de mensajes.


Un buen metodo de cifrado simétrico será aquel en el cual toda la seguridad se encuentre en la clave, así que no importa si el atacante sabe cual es el algoritmo de encriptación; pues de nada le sirve si no tiene la clave.


Este es un ejemplo muy sencillo de cifrado simétrico.


Platarforma Java JDK 1.6


Lo primero que se debe hacer es generar la clave que se utilizara tanto para encriptar y descriptar el mensaje, esta clave es generada bajo el Algoritmo DES.


KeyGenerator keyGen = KeyGenerator.getInstance("DES");
keyGen.init(56);
SecretKey secretKey = keyGen.generateKey();



El codigo anterior al colocarlo en nuestro programa se refiere a que dicha clave se va a generar cada vez que se encripte o desencripte un mensaje, otra manera de generar la clave y mantenerla activa esto guardando la clave en un archivo y solo llamandola al momento de utilizar.



Como ya tenemos la llave el paso seguido es encriptar el mensaje

Algoritmo DES
Modo : ECB (Electronic Code Book)
Relleno : PKCS5Padding



Cipher cifrador= Cipher.getInstance("DES/ECB/PKCS5Padding");



Iniciamos el objeto cifrador en modo Encriptación



cifrador.init(Cipher.ENCRYPT_MODE, clave);



Ahora vamos a introducir el texto a cifrar



String mensaje = "Este el texto que se va a cifrar";


Finalmente colocamos la ultima parte del codigo que son los metodos encargados de cifrar el mensaje y obtener el resultado en una cadena de byte[].


byte[] mensajeCifrado = cifrador.doFinal(mensaje.getBytes(), 0, mensaje.getBytes().lenght);



El mensaje cifrado se encuntra dentro de la variable mensajeCifrado, el cual no esta en un formato listo para impresión por lo cual solo si el usuario lo requiere este mensaje se puede codificar en base64 para mostralo en un formato más amigable.



byte[] mensajeCifradoBase64 = Base64.encode(mensajeCifrado);

Más información
Ejemplo

miércoles, 21 de noviembre de 2007

Facturación Electrónica

Hace unas semanas me puse a investigar sobre la Facturación Electrónica, la cual en nuestro país México tiene algunos años que se inicio este proceso de Facturación y todo lo referente a ella se podrá encontrar aquí. Pero en esta ocación no voy hablar mucho acerca del proceso y como hay que seguirlo desde el inicio, no, esta ocación solo hablaremos de como realizar un buen sellado de nuestra cadadena original. Para más información visitar esta dirección.

Bueno iniciamos, una de las maneras de poder llevar acabo la firma de la cadena original es utilizando las herramientas proporcionadas por OpenSSL, aunque tiene sus problemitas pero en fin acontinuación resumó los pasos que se tienen que llaver acabo para ejecutar la firma de la cadena original.

1.- Obtener la cadena original, en este caso utilizaremos la cadena original utilizada en un ejemplo propuesto por el SAT.

Cadena Original:

||A|1|2005-09-02T16:30:00|1|ISP900909Q88|Industrias del Sur Poniente, S.A. de C.V.|Alvaro Obregón|37|3|Col. Roma Norte|México|Cuauhtémoc|Distrito Federal|México|06700|Pino Suarez|23|Centro|Monterrey|Monterrey|Nuevo Léon|México|95460|CAUR390312S87|Rosa María Calderón Uriegas|Topochico|52|Jardines del Valle|Monterrey|Monterrey|Nuevo León|México|95465|10|Caja|Vasos decorados|20|200|1|pieza|Charola metálica|150|150|IVA|52.5||


2.- Digestión de la cadena original en formato MD5.

Cabe mencionar que la cadena original se debe encontrar codificado en UTF-8 de lo contrario jamas obtendremos el valor esperado, el cual es:

8aa2b617944427353697e694a2e35a07

3.- Sellar (Firmar) la digestión de la cadena original.

4.- El valor obtenido codificarlo a Base64.

Estos son los pasos para poder obtener la Firma de los datos que se plasmaran en la Factura Electrónica para su validez.

Investigando me encontre con paginas donde te decian como utilizar el sw openssl para firmar tu cadena original y aparecia lo siguiente:

Digestión de la cadena original:

windows

OpenSSL> dgst -md5 cadena.txt

linux

$>openssl dgst -md5 cadena.txt

Este proceso es correcto solo si el archivo de texto se encuentra codificado en UTF-8, lo cual debemos revisar ya que al guardar un archivo de texto la codificación default que toma el archivo es ANSI.

Nota: Dentro del archivo cadena.txt debemos colocar la cadena original de ejemplo en una sola línea de texto.

Obtenida la digestión y verificando que el resultado es:

8aa2b617944427353697e694a2e35a07

procedemos a colocar este resultado en un archivo de texto.

El siguiente paso es firmar la digestión de la cadena original y en un solo paso codificarla en base64 con salida a un archivo en la ruta especificada.

windows

OpenSSL>dgst -sign AAA01010AAA.pem digestioncadena.txt | enc -base64 -A > sello.txt

linux

$>openssl dgst -sign AAA010101AAA.pem digestioncadena.txt | openssl enc -base64 -A > sello.txt

Pues bien así obtenemos nuestra firma de la cadena original.

Nota: En algunos lugares encontraras las siguientes líneas
OpenSSL>dgst -md5 -sign AAA01010AAA.pem cadenaoriginal.txt | enc -base64 -A > sello.txt

No pueder realizar el paso de digestión y selledo de la cadena original en una solo línea por lo cual esta línea solo nos dice que se ocupara el metodo hash de encriptación MD5 para Sellar la cadena original utilizando la Clave privada AAA010101AAA.pem. Entonces sella la cadena original y no la digestión de la cadena original como se pensaria.

Debemos revisar bien todos estos pasos antes de realizar la firma de la cadena original.

Para finalizar el certificado y la clave privada utilizado para este ejemplo lo encuentran en la siguiente ruta Certificado y Key

Tanto la clave como el certificado se encuentran en formato DER y openssl lo utiliza en formato PEM, la conversión de la clave privada es la siguiente:

windows:

OpenSSL>pkcs8 -inform DER -in AAA010101AAA.key -out AAA010101AAA.pem

linux:

$>openssl pkcs8 -inform DER -in AAA010101AAA.key -out AAA010101AAA.pem

Listo tenemos nuestro clave privada en formato PEM.

Windows no cuenta con una intalación de OpenSSL predeterminada por lo cual les dejo este enlace para su descarga.

Si alguien quiere realizar este proceso sin utilizar el sw OpenSSL les recomiendo que visiten. BouncyCastle ahi encontraran una libreria muy completa para manipulación de certificados, digestión y sellado de información y manipulación de claves, se encuentra en versión tanto para Java como C#.

sábado, 3 de noviembre de 2007

Xantolo, y sigue la fiesta

Pues bien hace unas horas llegue a mi casa y me encuentro muy feliz de haber vivido una muy grata fiesta de Xantolo con mi familia y toda la gente que estuvo a mi alrededor, el olor de los tameles y el mole aun lo tengo tanto en la nariz como en mi estomago se encuentran los sabores que prove.

Y solo me resta agaradecer a todas las personas que participaron en esta una tradición de la huasteca y muy en especial a las personas que nos visitaron, que espero hayan disfrutado de esta fiesta y que como siempre esta es su casa y espero que nos visiten de nuevo.

Gracias y los esperamos de nuevo en la huasteca hidalguense con mucho orgulllo desde el corazon de las huastecas Huejutla de Reyes Hidalgo México.