martes, noviembre 07, 2006

Un ejemplo de "uso de fuerza bruta"

Se utiliza el término fuerza bruta, cuando se pretende obtener algún dato o información, y para obtenerlo, como no se conoce un algoritmo que analíticamente lo obtenga (o en su defecto, no se desea implementar) ó su implementación no es viable; por lo que en lugar del algoritmo, se ensayan todas las posibilidades.

Por ejemplo, si deseo conocer todos los números del 1 al 100 que al sumar sus cuadrados, el resultado sea un cuadrado. Realizo la combinación de todos los elementos posibles, para determinar cuales son válidos y cuales no.

También se establece que es un ataque "por fuerza bruta" cuando se pretende obtener un usuario y contraseña, a partir de combinaciones posibles de letras para usuarios, y para contraseñas.

Hace poco aparecieron carteles en la FI de la UNAM en C. U. con el mensaje: " siguiente {10 primeros digitios de pi que sumen 13}.com ". Como se vé, la url esta formada por los 10 primeros digitos del número pi que su suma sea 13.

Bien, a mi me dió flojera pensar una forma "elegante" de encontrar la secuencia, así que en lugar de planear un algoritmo, simplemente apliqué "fuerza bruta", recorriendo toda la secuencia de pi que encontré, obteniendo el siguiente código:

#include <stdio.h>
#include <stdlib.h>

int suma_arreglo(int *, int );
void agrega_num(int *, int, int);

int main(void){

char letra;
int numero, cta=0;
int viejo[10];
int nuevo[10];
int sumas;

FILE *ptoArch;


if((ptoArch = fopen("digits.txt", "r"))==NULL){
printf("No se puede abrir el archivo\n");
exit(1);
}

while(!feof(ptoArch) && cta < 10){
letra=fgetc(ptoArch);
numero=(int)letra;
viejo[cta] = numero-48;
cta++;
}
sumas=suma_arreglo(viejo,10);
while(!feof(ptoArch) && sumas > 13){
letra=fgetc(ptoArch);
numero=(int)letra;
if(numero>=48 && numero <= 57){
agrega_num(viejo,numero-48,10);
cta++;
sumas=suma_arreglo(viejo,10);
printf(" %d %d\n",cta, sumas);
}
}
fclose(ptoArch);
return 0;
}

int suma_arreglo(int *vect, int tam){
int i;
int suma=0;
for(i=0;i<tam;i++){
printf("%d",vect[i]);
suma+=vect[i];
}
return suma;
}

void agrega_num(int *vect, int num, int tam){
int i;
for(i=0;i<tam-1;i++)
vect[i]=vect[i+1];
vect[i]=num;
}

El código es bastante simple, y no tomé ninguna consideración para su realización, porque sentí mucha curiosidad por saber que había en la página y no tuve el tiempo para hacer un análisis más profundo sobre la naturaleza del problema.

Algunos de los cuates publicarón que también resolvieron el problema: hunk y lanjoe9.

1 Comentarios:

Anonymous Anónimo dijo...

http://www.damog.net/20061107/primera-secuencia-de-10-digitos-de-pi-que-sumados-dan-13-com/

:)

7:11 p.m.  

Publicar un comentario

Suscribirse a Comentarios de la entrada [Atom]

<< Página Principal