/** * Construye recursivamente cadenas de un tamaño determinado para generarles * su MD5 y compararlo con el MD5 objetivo. * * @param alfabeto - Arreglo con los posibles caracteres que pueden formar claves * @param objetivo - Cadena de caracteres con el MD5 conocido * @param actual - Subcadena de la posible clave previamente formada * @param size - Cantidad faltante de caracteres a completar en la posible clave * @return Clave encontrada */ public static String buscarClave(char[] alfabeto, String objetivo, String actual, int size) { // Cuando el tamaño es 0, la subcadena recibida es la clave candidata a evaluar if(size == 0 ) { String tmpOut = generarMD5(actual); if(tmpOut.equals(objetivo)) return actual; else return null; } // Si el tamaño no es 0, se le agrega a la subcadena candidata cada uno // de los caracteres del alfabeto y se llama recursivamente al mismo método. // Si se encontró la clave, se retorna, y si no, se evalúa el siguiente caracter. for(char caracter: alfabeto) { String clave = buscarClave(alfabeto, objetivo, actual+caracter, size-1); if(clave!=null) return clave; } // Si la clave no se pudo encontrar se retorna el valor nulo return null; }
Para simplificar el proceso de búsqueda de claves de cualquier tamaño se crea un método similar al anterior que hace un ciclo para generar y evaluar cadenas de diferentes tamaños. En este método he involucrado código adicional para calcular el tiempo tardado en realizar la evaluación para cada uno de los tamaños:
public static String buscarClave(String alfabeto, String cadena) { char[] alfa = alfabeto.toCharArray(); for(int i=1; i<20; i++) { System.out.printf("Evaluando claves de tamaño %2d -> ",i); long t1 = System.currentTimeMillis(); String clave = buscarClave(alfa, cadena, "", i); long t2 = System.currentTimeMillis(); double t = (t2-t1)/1000.0; System.out.printf("tiempo: %,10.3f segs %n", t); if(clave != null) return clave; } return null; }
No hay comentarios.:
Publicar un comentario