El problema puede estar en la generación de la clave:
DESKeySpec kspec = new DESKeySpec(clave.getBytes());
La clave se genera con 8 bytes, "clave.getBytes()" puede generar más de esos 8 bytes (según la codificación utilizada). Como el comienzo de las claves de encriptado y desencriptado es el mismo (12345678 y 12345679) podría estar generando la clave con los bytes obtenidos de "1234", obteniendo por tanto la misma.
Hola
Con el siguiente código cifro una cadena con una clave de 64 bits (alg. DES, con 7 caracteres ya dice que no), y la descifro con una clave distinta, pero se descifra correctamente, cuando no debería ser así. ¿Un bug de java?
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class DES
{
public static byte[] cifrar(String txt, String clave) throws Exception
{
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
DESKeySpec kspec = new DESKeySpec(clave.getBytes());
SecretKey ks = skf.generateSecret(kspec);
Cipher cifrado = Cipher.getInstance("DES");
cifrado.init(Cipher.ENCRYPT_MODE, ks);
String s1 = null;
String s2 = "";
try {
s1 = new String(cifrado.update(txt.getBytes()), "ISO-8859-1");
s2 = new String(cifrado.doFinal(), "ISO-8859-1");
}
catch (Exception e) {
System.err.println("Excepcion controlada cifrando: " + e.toString());
}
return (s1+s2).getBytes("ISO-8859-1");
}
public static String descifrar(byte[] bufferCifrado, String clave) throws Exception
{
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
DESKeySpec kspec = new DESKeySpec(clave.getBytes());
SecretKey ks = skf.generateSecret(kspec);
Cipher cifrado = Cipher.getInstance("DES");
cifrado.init(Cipher.DECRYPT_MODE, ks);
String s1 = null;
String s2 = "";
try {
s1 = new String(cifrado.update(bufferCifrado), "ISO-8859-1");
s2 = new String(cifrado.doFinal(), "ISO-8859-1");
}
catch (Exception e) {
System.err.println("Excepcion controlada descifrando: " + e.toString());
}
return s1 + s2;
}
public static void main(String [] args)
{
try {
String texto = "En un lugar de la mancha de cuyo nombre no quiero acordarme...";
String clave1 = "12345679";
String clave2 = "12345678";
byte[] bb = cifrar(texto+texto+texto, clave1);
// for (byte b: bb) {
// System.out.print(b+" ");
// }
// System.out.println();
String txt = descifrar(bb, clave2);
System.out.println(txt);
}
catch (Exception e) {
e.printStackTrace();
}
}
}