#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;
}
//---------------------------------------------------------------------------