Dev - C++ - Como hago un generado de Diccionarios con letras

 
Vista:
sin imagen de perfil

Como hago un generado de Diccionarios con letras

Publicado por thelocko (2 intervenciones) el 25/02/2016 01:14:05
Hola Como hago para hacer un generador de diccionarios para BruteForce con Letras es decir
ya e hecho uno pero de números y no se me ocurre nada para hacerlo con letras
esto es lo que llevo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    int numCom = 0;
    double numMax, numSize;
 
   cin >> numSize ;
 
   numMax = pow(10, numSize);
 
   while(numCom < numMax)
    {
        numCom = numCom + 1;
    }
 
}

que tendría que hacer para generar letras en lugar de números?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Como hago un generado de Diccionarios con letras

Publicado por agustin (522 intervenciones) el 25/02/2016 08:33:36
El truco está en usar un array con las letras que desees y luego usas el índice para ir incrementando. Por ahí tengo uno muy optimizado, cuando llegue a casa te pongo el código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Como hago un generado de Diccionarios con letras

Publicado por agustin (522 intervenciones) el 25/02/2016 21:14:57
Este codigo esta muy bien ya que lo que hace es una fuerza bruta real ya que a cada posible combinacion le aplica unos calculos y lo compara con un serial encriptado y si coinciden te da el serial desencriptado. Los calculos pueden ser los que quieras pero yo simplemente hice una prueba. Pruebalo, esta en C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//---------------------------------------------------------------------------
 
typedef int bool;
enum booleanos {false,true}ValoresBool;
//---------------------------------------------------------------------------
 
//Aqui realizariamos los calculos necesarios con el serial
void CalculosDesencriptado(char *Serial, char *Salida)
{
   int largo = strlen(Serial);
   int x;
 
   //Yo simplemente le sumo 1 a cada caracter por ejemplo pero aqui iria
   //la parte donde se calcula la encriptacion del serial buscado
   for(x=0; x<largo; x++)
      Salida[x] = Serial[x] + 1;
}
//---------------------------------------------------------------------------
 
int FuerzaBruta(char* Serial, char* Salida, char* Rango)
{
   int largoSerial = strlen(Serial); //Obtengo el largo de la cadena del serial
   int largoRango = strlen(Rango); //Obtengo el largo de la cadena del rango
   int n; //Es usado como un contador auxiliar para rellenar inicialmente la cadena de salida y la de tope
   int posEnRango; //Es usada para obtener la posicion en el rango
   bool retval = false; //El valor que contenga esta variable será lo que retornemos al salir
   bool salir = false; //La uso para indicar cuando debo salir del bucle de fuerza bruta
   int contador;
   bool primeraPasada;
   int columna;
   char *CadenaFinal; //Es la cadena obtenida de aplicarle calculos a la cadena de salida
   char *CadenaTope; //Esta cadena contendrá el tope de busqueda y si llegamos a ella y no encontramos el valor bueno saldremos con false
 
   //Reservamos memoria para la cadena final y ponemos el valor de fin de cadena al final de esta
   CadenaFinal = malloc(largoSerial+1);
   CadenaFinal[largoSerial]='\0';
 
   //Reservamos memoria para la cadena tope
   CadenaTope = malloc(largoSerial+1);
 
   //Para inicializar la cadena de salida la rellenamos con el primer valor del rango y la cerramos con el caracter de fin de cadena
   for(n=0; n<largoSerial; n++)
      Salida[n] = *Rango;
   Salida[n] = '\0';
 
   //Para inicializar la cadena de tope la rellenamos con el ultimo valor del rango y la cerramos con el caracter de fin de cadena
   for(n=0; n<largoSerial; n++)
      CadenaTope[n] = Rango[largoRango-1];
   CadenaTope[n] = 0;
 
   contador=0;
   primeraPasada=true;
 
   //Bucle de fuerza bruta
   do{
      *Salida = Rango[contador];
 
      //Aqui realizamos el acarreo cuando se ha llegado al ultimo valor del rango en la columna
      for(columna=0; Salida[columna]==*Rango && primeraPasada != true; columna++){
 
         //Recorremos el bucle hasta que encontramos el caracter de la siguiente columna de la cadena de salida en la cadena del rango
         //En posEnRango tendremos su posicion del caracter al salir
         for(posEnRango=0; Rango[posEnRango] && Rango[posEnRango]!=Salida[columna+1]; posEnRango++);
 
         //Aqui obtenemos el resto de dividir la posicion en el rango obtenida en el for + 1 entre el largo del rango
         //El resultado es el indice que usaremos para asignar el caracter de la siguiente columna
         //Si el caracter de la siguiente columna es el ultimo posible, i+1 será igual al largo del rango
         //con lo que el resto será 0 y asignariamos el valor del primer caracter del rango a la siguiente columna
          Salida[columna+1] = Rango[(posEnRango+1) % largoRango];
      }
 
      //Hacemos los calculos deseados con la cadena y obtenemos el resultado en CadenaFinal
      CalculosDesencriptado(Salida, CadenaFinal);
 
      if(strncmp(CadenaFinal, Serial, largoSerial) == 0)
      { //Si CadenaFinal es igual a la cadena que estamos buscando salimos del bucle
         retval=true;
         salir = true;
      }
      else if(strncmp(Salida, CadenaTope, largoSerial) == 0)
      { //Si la cadena es igual al tope querrá decir que ya recorrimos todo y no se encontró así que salimos del bucle
         salir = true;
      }
 
      primeraPasada = false; //Indicamos que ya no es la primera pasada
      contador++; //Incrementamos el contador
      if(contador == largoRango) //Si el contador es igual al largo de la cadena rango...
         contador=0; //Ponemos el contador a 0
   }while(!salir); //Salimos solo cuando se encuentre la cadena deseada o cuando se llegue al final
 
   //Liberamos la memoria
   free(CadenaFinal);
   free(CadenaTope);
 
   //Retornamos indicando si la busqueda tuvo exito o no
   return retval;
}
//---------------------------------------------------------------------------
 
int main(int argc, char* argv[])
{
   char serialEncriptado[]= "NVOEP";
   char salida[25];
   char Rango[]= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //Rango de caracteres que se usará para la fuerza bruta
   if(FuerzaBruta(serialEncriptado,salida,Rango))
      printf("Serial desencriptado = %s\n",salida);
   else
      printf("Serial no encontrado.\n");
   getchar();
   return 0;
}
//---------------------------------------------------------------------------
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar