Desencriptar Rijndael en Java

Dorenz

Buenas,

Resulta que necesito desencriptar una contraseña que recupero de un servidor en una aplicación Java, buscando por ahí he descubierto que el lenguaje incorpora algunas librerías propias para ello, y que su implementación debería ser tal que así:

byte[] sessionKey = null; //Where you get this from is beyond the scope of this post
byte[] iv = null ; //Ditto
byte[] plaintext = null; //Whatever you want to encrypt/decrypt
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//You can use ENCRYPT_MODE or DECRYPT_MODE
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
byte[] ciphertext = cipher.doFinal(plaintext);

Muy bonito pero no entiendo la mitad del código, sabría alguien decirme que son el parámetro 'sessionKey' y 'iv'? Y por otro lado, lo que recupero del servidor es una cadena de carácteres no un tipo byte con lo cual no puedo ponerlo dentro del 'plaintext', y no, no puedo cambiar el tipo a String porque el método doFinal() no acepta String como parámetros de entrada, sólo byte.

Gracias de antebrazo :S

Gollumiko

#1 Tal vez no sea el más indicado para responder, pero te intentaré echar una mano con lo poco que se. AES es un algoritmo de cifrado simétrico, por lo que se utiliza la misma clave para cifrar como para descifrar, así, supongo que sessionKey será la clave que se utiliza en el algoritmo.

Este es un diagrama de ejemplo de AES:

IV es el vector inicial, que generalmente se suele inicializar a 0 y en el caso de utilizar CBC (tal y como indicas en el código) se va actualizando según se va cifrando el mensaje en claro y es utilizado en el propio algoritmo.

Aunque lo que te devuelva la base de datos sea un string, puede que sea un array de bytes convertidos directamente a string, mira a ver si es así. Si así fuese, busca una manera de convertir un string a array de bytes en java. Te pasaría el código en C#, pero no lo tengo aquí a mano.

Resumiendo, lo que yo haría:

  • En sessionKey pon la clave con la que quieres descifrar el texto de la base de datos (la tienes que saber).
  • El vector inicial (IV) dejalo tal cual o inicializalo a un array de bytes de tamaño 16 con contenido todo a 0.
  • Mira si el string solo contiene números y letras de la A la F para saber si es un chorro hexadecimal, si es así, busca una forma de convertir el string a un array de bytes.

Espero que te ayude.

1 respuesta
MTX_Anubis

No es tan difícil echar un vistazo por el api.

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#getBytes()

1 respuesta
Dorenz

#2 Muchísimas gracias, me pongo a ello ahora mismo y cuando lo tenga ya comentaré el que.
#3 Eso fue lo primero que probé, pero como no sabía como inicializar el sessionKey ni el iv porque no sabía que eran pues como que no sirvió para nada.

Usuarios habituales

  • Dorenz
  • MTX_Anubis
  • Gollumiko