[PROBLEMA] Descifrado con algoritmo TripleDES en java

Iniciado por kondrag_X1, 25 Abril 2013, 13:45 PM

0 Miembros y 1 Visitante están viendo este tema.

kondrag_X1

Hola buenas, mirad tengo un pequeño problema tratando de hacer una clase del algoritmo de cifrado tripleDES

Adjunto código:

package algoritmos;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

public class TripleDES extends Algoritmo {
private String msg;
private byte [] msgCifrado;
private byte [] msgDescifrado;
private Cipher cifrador;
private Cipher descifrador;
private KeyGenerator keyGen;
private SecretKey claveTripleDES;

public TripleDES (String nombreAlgortimo, String mensaje){
this.nombreAlgortimo = nombreAlgortimo;
this.msg = mensaje;
this.isCreate = true;
try {

System.out.println(">> Creando TripleDES......");
generarKey();
cifrador = Cipher.getInstance(nombreAlgortimo+"/CBC/PKCS5Padding");
descifrador = Cipher.getInstance(nombreAlgortimo+"/CBC/PKCS5Padding");

} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("--------------- Generamos Clave ---------------");
System.out.println("Clave pública: "+ new String(claveTripleDES.getEncoded()));
System.out.println("------------------------------------------------");
}
@Override
public void cifrar() {
byte [] bytesMensaje = msg.getBytes();
try {
cifrador.init(Cipher.ENCRYPT_MODE, claveTripleDES);
msgCifrado = cifrador.doFinal(bytesMensaje);
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NullPointerException e){
e.printStackTrace();
}
System.out.println("--------------- TEXTO CIFRADO ---------------");
System.out.println("CLAVE Pública: " + new String(claveTripleDES.getEncoded()) + "\n");
System.out.println("Texto sin cifrar: "+msg);
        System.out.println("Texto cifrado : "+new String(msgCifrado));
        System.out.println("---------------------------------------------"); 
}

@Override
public void descifrar() {
try {
descifrador.init(Cipher.DECRYPT_MODE, claveTripleDES);
msgDescifrado = descifrador.doFinal(msgCifrado);
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
msgDescifrado = "error mensaje no descifrado".getBytes();
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("--------------- TEXTO DESCIFRADO ---------------");
System.out.println("CLAVE Pública: " + new String(claveTripleDES.getEncoded()) + "\n");
System.out.println("Texto sin cifrar: "+msg);
System.out.println("Texto cifrado: "+new String(msgCifrado));
        System.out.println("Texto descifrado: "+new String(msgDescifrado));
        System.out.println("---------------------------------------------");
}

private void generarKey() throws NoSuchAlgorithmException{
        keyGen = KeyGenerator.getInstance(nombreAlgortimo);
        claveTripleDES = keyGen.generateKey();
}
}


y el problema es que cuando genero la clave y cifro todo va bien es cuando intento descifrar me sale el siguiente error. Ya se me han acabado las ideas. ¿ Alguien ha pasado por este problema o se le ocurre como solucionarlo?

adjunto código de la incidencia.
Citar
04-25 11:33:21.700: W/System.err(742): java.security.InvalidKeyException: no IV set when one expected
04-25 11:33:21.710: W/System.err(742):    at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineInit(BaseBlockCipher.java:629)
04-25 11:33:21.720: W/System.err(742):    at javax.crypto.Cipher.init(Cipher.java:519)
04-25 11:33:21.720: W/System.err(742):    at javax.crypto.Cipher.init(Cipher.java:479)
04-25 11:33:21.720: W/System.err(742):    at algoritmos.TripleDES.descifrar(TripleDES.java:72)
04-25 11:33:21.730: W/System.err(742):    at com.AlarconMendez.cripto.MainActivity$1.onClick(MainActivity.java:43)
04-25 11:33:21.730: W/System.err(742):    at android.view.View.performClick(View.java:4204)
04-25 11:33:21.740: W/System.err(742):    at android.view.View$PerformClick.run(View.java:17355)
04-25 11:33:21.740: W/System.err(742):    at android.os.Handler.handleCallback(Handler.java:725)
04-25 11:33:21.740: W/System.err(742):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-25 11:33:21.740: W/System.err(742):    at android.os.Looper.loop(Looper.java:137)
04-25 11:33:21.750: W/System.err(742):    at android.app.ActivityThread.main(ActivityThread.java:5041)
04-25 11:33:21.750: W/System.err(742):    at java.lang.reflect.Method.invokeNative(Native Method)
04-25 11:33:21.750: W/System.err(742):    at java.lang.reflect.Method.invoke(Method.java:511)
04-25 11:33:21.760: W/System.err(742):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-25 11:33:21.760: W/System.err(742):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-25 11:33:21.760: W/System.err(742):    at dalvik.system.NativeStart.main(Native Method)