Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: AlbertoBSD en 21 Enero 2022, 18:19 pm



Título: Evitar multiples for en incrementos variables Base58 Fuerza bruta
Publicado por: AlbertoBSD en 21 Enero 2022, 18:19 pm
Aunque creo que es una pregunta Noob, he buscado y no encuentro un ejemplo usable, la verdad no quiero codear tanto pero si he de hacerlo*quiero encontrar la forma mas eficiente.

Tengo un cadena donde faltan caraceteres Unos son totalmente desconocidos "*" y hay que hacerles fuerza bruta (Esta parte ya la tengo hecha)
Pero la misma cadena tiene algunos caraceters que son Probables "?" con ciertos caracteres posibles que no se alcanzan a ver ejemplos 8 y B. X, K y k, S y 5, Esta parte la manejo cada caracter "?"  con su lista individual de caraceters posibles y no es la misma para cada simbolo "?"

Ejemplo:

Código:
sV***??c8NSs1X85ws9Er?z9FwtdJ

Cada caracter "*" puede ser uno de los 58 caraceteres del base58 Esta parte la manejo mas o menos asi

Código
  1. do{
  2. //CODIGO
  3. }while(increment_base58(string,aux));

La solucion anterior es general para cualquier numero de * en el string dado

Pero la parte de los "?" es variable, para este ejemplo vamos a decir que los los ? pueden ser alguno de los siguientes caraceteres respectivamente:

Código
  1. const char *doubt_possibles[3] = {"ec","B28","XKk"};

Significa que el primer caracter "?" de Izquierda a Derecha puede ser e o c el segundo "?" puede ser  B, 2 u 8 (Imagen muy distorcionada) y el ultimo Signo "?" podria ser "X, K o k"

Esta solucion esta hardcodeada de la siguiente manera:

Código
  1. for(contadores[0] = 0; contadores[0] < strlen(doubt_possibles[0]) ; contadores[0]++) {
  2. current_string[doubt_locations[0]] = doubt_possibles[0][contadores[0]];
  3. for(contadores[1] = 0; contadores[1] < strlen(doubt_possibles[1]) ; contadores[1]++) {
  4. current_string[doubt_locations[1]] = doubt_possibles[1][contadores[1]];
  5. for(contadores[2] = 0; contadores[2] < strlen(doubt_possibles[2]) ; contadores[2]++) {
  6. current_string[doubt_locations[2]] = doubt_possibles[2][contadores[2]];
  7. //Otro Codigo
  8. do{
  9. //CODIGO
  10. }while(increment_base58(current_string,aux));
  11. }
  12. }
  13. }
  14.  

El problema con lo anterior es que si me mandan otra cadena diferente o cambia la cantidad de caracteres tengo que editar la mitad del codigo actual.

Mas o menos tengo un leve idea de como hacerlo de forma general, cualquier numero de ? y cualquier longitud de posibles, pero me pregunto cual seria su forma de abordar este problema sin utilizar tanto for, quedando algo asi:

Código
  1. do{ //Do para los "?" en lugar de tanto for....
  2. do{ // Do para los "*"
  3. //CODIGO
  4. }while(increment_base58(current_string,aux));
  5. }while(magic_function(current_string,aux2));
  6.  

Es decir como codificarian "magic_function"

Código
  1. bool magic_function(char *current_string,int aux2){
  2. // Que hay aqui?
  3. }
  4.  


Título: Re: Evitar multiples for en incrementos variables Base58 Fuerza bruta
Publicado por: Mr.Moonlight en 7 Febrero 2022, 11:59 am
Que el primer caracter "?" tome un valor o otro influye sobre la lista de posibles caracteres de los siguientes? o esta se mantienes siempre igual?

Si el valor de este primer "?" influye sobre la lista de los siguientes lo mejor sería una función recursiva pienso yo no?


Título: Re: Evitar multiples for en incrementos variables Base58 Fuerza bruta
Publicado por: Danielㅤ en 7 Febrero 2022, 14:37 pm
Hola Alberto, si es posible evitar tantos bucles for, por ejemplo en tu código utilizas 3 y lo podes dejar en 2 o tal vez hasta en 1, pero para lograrlo debes aprovechar el bucle primario y también vas a tener que usar condicionales y métodos de funciones, por ejemplo si vos querés comprobar si un X caracter se encuentra dentro de una variable, la mayoría utilizaría un bucle for o while, pero esto yo personalmente lo haría de otra forma y es la que te recomiendo, que en vez de usar un bucle, podes usar un método tipo función, por ejemplo en seudo código:

Código:
Si caracter existe en variable
Entonces se ejecuta una instrucción

Es decir que podes comprobar si un caracter se encuentra dentro de una variable usando una función nativa del lenguaje que devuelva True si lo está o False si no lo está y así te evitas el bucle además que es más rápido.

Hay casos también que podes usar variables auxiliares que sirvan solamente para incrementar un valor numérico int, es decir podes sumar, restar o incluso multiplicar el valor.


Saludos


Título: Re: Evitar multiples for en incrementos variables Base58 Fuerza bruta
Publicado por: Serapis en 8 Febrero 2022, 01:41 am
Necesitas dos bucles, uno iterativo y uno recursivo.
El recursivo explora (avanza) las posiciones el iterativo explora las opciones de cada posición.
Necesitas eso sí, un array donde cada inndice se corresponda con una posición en la cadena y ese índice debe contener un array con todas las opciones para ese índice.

Nota que el bucle recursivo irá recorriendo ese array (posiciones) y el iterativos las opciones de dicha posición.
Los valores conocidos, siguen  existiendo pero solo tiene un elemento entre los que iterar... es necesario para seguir el bucle sin complicarlo con chorrocientas líneas de código o chorrocientos condicionantes, así el código es más limpio y más veloz, a cambio de un muy-poco más de memoria en uso.