Java, JCE, y muchos problemas con cifrados 256bits

Saludos a todos!!

Esta es la primera vez que posteo en JavaMexico y lo hago con un serio problema existencial... Resulta que estoy realizando una aplicación que debe cifrar datos utilizando Rijndael a 256 bits, (para eso, leí en algún lado que era mejor utilizar el algoritmo AES que viene incluido en cypher de Java). Bueno, pues cuando quize realizar los primeros intentos, me topé con las políticas de seguridad que impiden esa clase de cifrados a menos que descague de la página la extensión correspondiente (JCE). La descargué y realicé mis pruebas exitosamente. El problema inició cuando intenté distribuir la aplicación, ya que si la máquina en la que estoy instalando no tiene los archivos, me genera la temida excepción "Illegal Key Size"... Mi problema es que siendo una aplicación para usuario final, no me parece muy conveniente estarle diciendo: "Tienes que entrar a la página tal, descargar los archivos tales y reemplazar los que tienes en tu máquina por estos otros para que la aplicación funcione"... Descargué entonces de BouncyCastle su proveedor (que según incluye JCE) pero indica que luego del jdk1.4 necesito igualmente descargar las políticas de seguridad.... lo que me regresa al principio... alguien puede darme alguna idea o ayuda en este sentido? Les estaré sobradamente agradecido!

De antemano, muchas gracias!.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Rijndael == AES

Rijndael es el algoritmo que se sometió a concurso para el sustituto de DES, y cuando ganó, se quedó oficialmente como AES.

Me parece muy raro tu problema porque al menos en Linux y Mac no he tenido nunca esas broncas. Eso pasaba en Java 1.3, pero según yo a partir de 1.4 quitaron esas restricciones, ya no tienes que bajar JCE ni JSSE porque ya viene incluido en el JRE/JDK y puedes usar "strong crypto" sin problemas.

Hola! Muchas gracias por

Hola!

Muchas gracias por responder tan pronto!. Tienes razón, creo que ya había leído algo sobre el tema (en relación a Rijndael y AES). Sin embargo y como bien mencionas, mi problema está raro... Inicialmente no podía codificar con 256 debido a que en tiempo de ejecución me indicaba la excepción "Ilegal Key Size", por mucho, pensé que era mi error, hasta que dí con un documento publicado recientemente que indicaba que requería la JCE... entré al portal de Oracle y lo descargué para la versión 1.6.0_20 (que es la que utilizo), lo instalé y hasta ahí todo muy bien, como comentaba, hice varias pruebas y funcionó perfecto. El problema resurgió cuando instalé la aplicación ("ya terminada") en otra máquina y comenzó a lanzarme la misma excepción... Como dije antes, intenté reemplazar el proveedor original de sun por el de boutycastle pero no me dió resultado, debido a que en una nota, ellos mismos declaran que para las versiones 1.4 y superiores necesito descargar las licencias... si supieras de algún modo para saltarme esas restriciones, o algún documento de referencia, te lo agradecería mucho. Creeme que ya googlé varias horas al respecto, pero no hay mucha información, más bien, todos me dicen lo mismo... "hay que descargar las licencias", pero no cómo incluirlas en mi distribución...
(Exceptuando por el documento http://download.oracle.com/javase/6/docs/technotes/guides/security/ que indica que debo pedirle permiso al gobierno y no sé que tantas cosas.... y mi jefe lo quiere para hoy U_U)

Estaré al pendiente.
Muchas gracias!!

Imagen de ezamudio

policy

Según recuerdo lo que descargas son archivos policy, y deben ir en un directorio dentro de tu instalación del JRE.

Acabo de probar este código en mi máquina y funciona sin problemas. Estás seguro que estás definiendo una llave de 256 bits, o 256 bytes? porque eso sí te daría un error, porque AES solamente maneja llaves de 128, 192 y 256 BITS, o sea 16, 24 y 32 BYTES.

import javax.crypto.*
import javax.crypto.spec.*

byte[] llave = new byte[32]
Arrays.fill(llave, (byte)0)
Cipher aes = Cipher.getInstance("AES/CBC/NoPadding")
SecretKeySpec key = new SecretKeySpec(llave, "AES")
IvParameterSpec iv = new IvParameterSpec(llave, 0, 16)
aes.init(Cipher.ENCRYPT_MODE, key ,iv)
byte[] ctext = aes.doFinal(llave)
aes.init(Cipher.DECRYPT_MODE, key, iv)
byte[] clear = aes.doFinal(ctext)
assert clear == llave

El código lo hice en Groovy para más rápido, pero por las llamadas que hice creo que sólo necesitas agregar punto y coma a cada linea y debe jalar (bueno y debes cachar no sé cuántas excepciones también).

Me hiciste dudar por un

Me hiciste dudar por un segundo!

Jajajaja, pensé que de plano la estaba regando... pero no estoy tan mal... creo... aunque tienes razón, quizás no lo especifiqué correctamente o confundí los términos, en realidad, me refería a los archivos policy cuando decía que había bajado el jce... (io creía que era lo mismo... gracias por sacarme del error).

Probé el código que me mandaste y me sigue marcando la misma excepción en la máquina de "pruebas finales" (que no tiene los archivos policy instalados), mientras que en la de desarrollo funciona perfectamente (porque ya las instalé).... y he ahí mi problema... cómo le digo a mis usuarios que para utilizar mi aplicación deben descargar los archivos forsozamente... o cómo los incluyo en mi distribución (estoy utilizando netbeans platform)...

Desde ya, muchas gracias por tus respuestas.

Imagen de ezamudio

256 bits

Y necesitas forzosamente usar llaves de 256 bits? De plano la información que estás cifrando se va a quedar guardada por mucho tiempo y es tan importante que seguramente la NSA y la CIA la van a estar tratando de descifrar constantemente con recursos de cómputo que no podemos ni siquiera imaginarnos? Esas llaves que generas son tan aleatorias e irrepetibles que necesitan ser de 256 bits?

Por que si son generadas a partir del password del usuario, 128 bits es más que suficiente. Llaves más grandes solamente retrasan un ataque de fuerza bruta pero ese es el último recurso; es mucho más efectivo un ataque de diccionario, ingeniería social, buscar debilidades en la implementación de tu criptosistema, o algún otro método de criptanálisis. Tu sistema no es el doble de seguro por usar llaves de 129 bits en vez de 128 bits, aunque hayas incrementado el espacio de posibles llaves al doble; por lo tanto, tu sistema no es infinitamente más seguro por usar llaves de 256 bits en vez de 128 bits.

Jé.... si vieras el

Jé.... si vieras el sistema, se trata de un publicador de contenidos en web, por lo que luego de cifrar, recifrar y descifrar con aes y rsa la información, ésta se muestra como si nada en una página web... el paranoico no soy yo, sino quien me ha solicitado la aplicación... de cualquier manera, he logrado convencerlo de cifrar a 128 bits... Aun así, muchas gracias por tus respuestas y por tu tiempo.

AES 256

CryptoPerms