Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > cifrar y descifrar con DES

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();
}
}

}

octubre 27, 2011 | Unregistered Commenterpsi

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.

octubre 27, 2011 | Unregistered CommenterGarca