Bruteforce final! Rompe MD5 de 3 caracteres (ampliable)

Iniciado por Debci, 14 Julio 2010, 16:43 PM

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

Debci

Código (java) [Seleccionar]
import java.lang.String;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
*
* @author root
*/
public class Encriptor {


    public static void main(String[] args)
    {
        String resultado = null;
        String match = "d9058beaae2e147183870304dd526761";
       

        String[] mapaChars = {"A","B","C"};

        int posibles = (int) Math.pow(3,mapaChars.length);
       
        String[] combinacion = new String[3];
        int indice1 = 0;
        int indice2 = 0;
        int indice3 = 0;
        for(int i = 0; i < posibles;i++)
        {
            if(indice1 == 3)
            {
               
               indice1 = 0;
               indice2++;
            }
            if(indice2 == 3)
                {
                    indice2 = 0;
                    indice3++;
                }
            if(indice3 == 3)
            {
                indice3 = 0;
            }
          combinacion[0] = mapaChars[indice1];
          combinacion[1] = mapaChars[indice2];
          combinacion[2] = mapaChars[indice3];
          String resultadoTransitorio = new String(combinacion[0] + combinacion[1] + combinacion[2]);
          String resultadoEncriptado = new String(Encriptor.encriptaMD5(resultadoTransitorio));
          if(resultadoEncriptado.equals(match))
          {
              resultado = resultadoTransitorio;
              break;
          }
         
          indice1++;
         
        }
        System.out.println("Hash crackeada con exito!\n" + resultado);
       
        /*String cadena = new String("acb");
        System.out.println(Encriptor.encriptaMD5(cadena) + "\n" + Encriptor.encriptaSHA1(cadena));*/
    }
    public static String encriptaMD5(String toEnc)
    {


        MessageDigest mdEnc = null;
        try {
            mdEnc = MessageDigest.getInstance("MD5"); // Encryption algorithm
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(Encriptor.class.getName()).log(Level.SEVERE, null, ex);
        }

            mdEnc.update(toEnc.getBytes(), 0, toEnc.length());

            String md5 = new BigInteger(1, mdEnc.digest()).toString(16);
            return md5;
    }
    public static String encriptaSHA1(String cadena)
    {
        byte[] defaultBytes = cadena.getBytes();

MessageDigest algorithm = null;
        try {
            algorithm = MessageDigest.getInstance("SHA1");
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(Encriptor.class.getName()).log(Level.SEVERE, null, ex);
        }
algorithm.reset();
algorithm.update(defaultBytes);
byte messageDigest[] = algorithm.digest();

StringBuffer hexString = new StringBuffer();
for (int i=0;i<messageDigest.length;i++) {
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}
String foo = messageDigest.toString();

cadena = hexString+"";
        return cadena;
    }

}


Por fin!
He conseguido crear mi propio programa para romper hashes MD5, y SHA1 (aun por implementar), pero me hace ilusión compartirlo con todos vosotros.

Para simplificar el trabajo tan solo he usado 3 posibles caracteres A B y C, encriptad cualquier combinación de estas 3 en MD5 y dadle el valor de la cadena a la variable match y os la crackeará en menos de un segundo!

Cuando este listo al 100% lo haré publico.

Saludos

Leyer

"Te he enseñado bien, haora la fuerza esta con tigo" XD :xD jaja

Se puede mejorar mucho, ademas con tu metodo es facil mejorarlo para que soporte mas de 3 caracteres, lo modifique para 4 y funcionaba  :P

Mas tarde lo miro con mas profundidad.

Sigue asi.

Un saludo.

Debci

#2
Cita de: LEYER en 14 Julio 2010, 17:33 PM
"Te he enseñado bien, haora la fuerza esta con tigo" XD :xD jaja

Se puede mejorar mucho, ademas con tu metodo es facil mejorarlo para que soporte mas de 3 caracteres, lo modifique para 4 y funcionaba  :P

Mas tarde lo miro con mas profundidad.

Sigue asi.

Un saludo.

Yo he probado con 24 caracteres y como no cabe un numero tan grande de posibilidades en un tipo int standard... lo tengo chungo :S
Me queda este algoitmo mas dinamico pero que me arroja un index out of bounds exepction en un array:

He comentado donde falla:
Código (java) [Seleccionar]

package main;

import java.lang.String;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
*
* @author root
*/
public class Encriptor {


   public static void main(String[] args)
   {
       String resultado = null;
       String match = "65070638cd89011c9ab230ba2fac46dd";
       int limCaracteres = 4;

       String[] mapaChars = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};

       int posibles = (int) Math.pow(limCaracteres,mapaChars.length);
       System.out.println("Posibles: " + posibles + "\n" + "Lenght mapa: " + mapaChars.length);
       String[] combinacion = new String[limCaracteres];
       int[] indices = new int[limCaracteres];
       for(int y = 0; y < indices.length; y++)
       {
           indices[y] = 0;
       }
       
       for(int i = 0; i < posibles;i++)
       {
           for(int x = 0; i < limCaracteres; i++)
           {
                if(indices[x] == mapaChars.length)
                {
                    indices[x] = 0;
                    indices[x+1]++;
                }
           }

           for(int j = 0; j < limCaracteres; j++)
           {
               combinacion[j] = mapaChars[indices[j]]; /* Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
       at main.Encriptor.main(Encriptor.java:52)
Java Result: 1 */
           }
         
         String resultadoTransitorio = new String(combinacion[0] + combinacion[1] + combinacion[2]);
         String resultadoEncriptado = new String(Encriptor.encriptaMD5(resultadoTransitorio));
         if(resultadoEncriptado.equals(match))
         {
             resultado = resultadoTransitorio;
             break;
         }
         
         indices[0]++;
         
       }
       System.out.println("Hash crackeada con exito!\n" + resultado);
       
       /*String cadena = new String("acb");
       System.out.println(Encriptor.encriptaMD5(cadena) + "\n" + Encriptor.encriptaSHA1(cadena));*/
   }
   public static String encriptaMD5(String toEnc)
   {


       MessageDigest mdEnc = null;
       try {
           mdEnc = MessageDigest.getInstance("MD5"); // Encryption algorithm
       } catch (NoSuchAlgorithmException ex) {
           Logger.getLogger(Encriptor.class.getName()).log(Level.SEVERE, null, ex);
       }

           mdEnc.update(toEnc.getBytes(), 0, toEnc.length());

           String md5 = new BigInteger(1, mdEnc.digest()).toString(16);
           return md5;
   }
   public static String encriptaSHA1(String toEnc)
   {
      MessageDigest shEnc = null;
       try {
           shEnc = MessageDigest.getInstance("SHA1"); // Encryption algorithm
       } catch (NoSuchAlgorithmException ex) {
           Logger.getLogger(Encriptor.class.getName()).log(Level.SEVERE, null, ex);
       }

           shEnc.update(toEnc.getBytes(), 0, toEnc.length());

           String sha1 = new BigInteger(1, shEnc.digest()).toString(16);
           return sha1;
   }

}



Saludos

Novlucker

#3
Luego me lo reviso bien, no se olviden que programo en C# :xD, pero desde ya le veo un problema al algoritmo

Código (java) [Seleccionar]
int limCaracteres = 4;

String[] mapaChars = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};

int posibles = (int) Math.pow(limCaracteres,mapaChars.length);


El problema es el algoritmo desde un principio, con eso para una lista de 10 números, y largo de cadena de 4, te da 1048576, y en realidad debería de ser solamente 10000 :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Leyer

Cita de: Novlucker en 14 Julio 2010, 18:03 PM
Luego me lo reviso bien, no se olviden que programo en C# :xD, pero desde ya le veo un problema al algoritmo

Código (java) [Seleccionar]
int limCaracteres = 4;

String[] mapaChars = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};

int posibles = (int) Math.pow(limCaracteres,mapaChars.length);


El problema es el algoritmo desde un principio, con eso para una lista de 10 números, y largo de cadena de 4, te da 1048576, y en realidad debería de ser solamente 10000 :P

Saludos


Pues no se como sera eso de las posibilidades :xD ha modificado y colocando tanto el code que estoy perdido. creo que anteriormente lo tenia: si la cadena era de 3 seria 3^3 igualmente deberia ser es 10^10, segun lo ha venido colocando, tu dices 1000 pero eso es si lo colocas al contrario.

pienso que esta haciendo algo mal en los bucles
Código (java) [Seleccionar]

//               Index:0====Valor:1649
//            Index:1====Valor:0
//            Index:2====Valor:0
//            Index:3====Valor:0
//            Index:4====Valor:0
//            Index:5====Valor:0
//            Index:6====Valor:0
//            Index:7====Valor:0
//            Index:8====Valor:0
//            Index:9====Valor:0
//            Index:0====Valor:1650



y esta haciendo
Código (java) [Seleccionar]
combinacion[j] = mapaChars[indices[j]];

Obviamente dara error

Novlucker

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Debci

LO que yo he pretendido ha sido que fuese dinamico osea decir cuantos caracteres quieres comprobar si es una cadena de 24 caracteres, si es de 15 o de 6 caracteres (lo que quieras).
No entiendo porque debe dar error xD Ahora me lo miro mas a fondo jeje

Saludos

Novlucker

#7
Pero es lo que estoy diciendo, mira el archivo ese que he subido, en ese archivo se muestran las posibles combinaciones de las 10 letras tomadas de a 4, el mío también es dinámico, le metes la lista de caracteres y el largo máximo para la palabra, y te tira el diccionario :P, lo único que no le puse es para que pruebe con todas las palabras hasta llegar al límite, pero eso es solo poner un FOR

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Debci

Cita de: Novlucker en 14 Julio 2010, 19:09 PM
Pero es lo que estoy diciendo, mira el archivo ese que he subido, en ese archivo se muestran las posibles combinaciones de las 10 letras tomadas de a 4, el mío también es dinámico, le metes la lista de caracteres y el largo máximo para la palabra, y te tira el diccionario :P

Saludos

xD ya lo he pre-supuesto, no he tenido que montarme ningun algoritmo para ello xD

Ya estoy re-componiendo el codigo.

Saludos

Novlucker

Bueno, pero eso que tienes arriba es un algoritmo :xD
Mañana paso el que tengo a C# y lo publico aclarando que te he compiado la idea xD

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein