La idea que tenia no a funcionado.
El enfoque era estadístico, lo que hice fue generar N arreglos de Enteros donde N es igual al numero de caracteres del mensaje.
El primer arreglo[0] es de longitud 1
El segundo arrega[1] es de longitud 2
y asi sucesivamente.
Guarde las sumas de los valores ascii de cada caracter en los arreglos. Ademas de contar cuantas veces se sumaba en cada caracter en cada casilla.
Saque los promedios y las desviaciones estandar ademas. saque el promedio de cada arreglo y las desviaciones estandar de las desviaciones estandar valga la redundancia...
Mi idea era ver como cambiaban las desviaciones estandar y me imaginaba que en los puntos de inflexion estaría la pista.
Curiosamente en algunos ejemplos el primer punto de inflexion coincidencia con la longitud de la contraseña, pero en otros no lo hacia.
Codigo:
Código
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/stat.h> off_t fsize(const char *filename); unsigned char max(unsigned char item,unsigned char mx); unsigned char min(unsigned char item,unsigned char mn); int main() { int **sums; int **counts; float **diff; float **promedios; float **desviacion; float *sumdesviaciones; float *promedioDesviaciones; float *diffdesviaciones; float *desviacion2; FILE *file; char *buffer; float temp; int l,i,j,k; if(file) { l = fsize("salida.txt"); i = 0; while(i < l) { i++; } //rellenar array de sumas j = 0; while(j < l) { k =0; while(k < l) { //printf("Procesando sums[%i][%i]\n",j,(k % (j+1))); sums[j][k % (j+1)] += buffer[k]; counts[j][k % (j+1)] +=1; k++; } j++; } //mostramos las sumas y los contadores i=1; j=0; while(j < l) { k =0; while(k < i) { //printf("sums[%i][%i] = %i\n",j,k,sums[j][k]); //printf("counts[%i][%i] = %i\n",k,i,counts[j][k]); k++; } i++; j++; } //calcular promedios i=1; j=0; while(j < l) { k =0; while(k < i) { promedios[j][k] = ((float)sums[j][k])/((float)counts[j][k]); //printf("promedios[%i][%i] = %f\n",j,k,promedios[j][k]); k++; } i++; j++; } //calcular Diferencias j = 0; while(j < l) { k =0; while(k < l) { temp = promedios[j][k % (j+1)] - buffer[k]; if(temp < 0.0) { temp = -1.0 *temp; } diff[j][k % (j+1)] += temp; k++; } j++; } //calcular desviacion i=1; j=0; while(j < l) { k =0; while(k < i) { desviacion[j][k] = diff[j][k]/counts[j][k]; //printf("desviacion[%i][%i] = %f\n",j,k,desviacion[j][k]); k++; } i++; j++; } //calcular suma desviaciones i=1; j=0; while(j < l) { k =0; while(k < i) { sumdesviaciones[j]+= desviacion[j][k]; k++; } promedioDesviaciones[j] = sumdesviaciones[j]/i; i++; j++; } //calcular differencia de desviaciones i=1; j=0; while(j < l) { k =0; while(k < i) { diffdesviaciones[j]+= promedioDesviaciones[j] - desviacion[j][k]; k++; } desviacion2[j] = diffdesviaciones[j]/(float)k; i++; j++; } } return 0; } unsigned char max(unsigned char item,unsigned char mx) { return (item >= mx)? item:mx; } unsigned char min(unsigned char item,unsigned char mn) { return (item <= mn)? item:mn; } off_t fsize(const char *filename) { struct stat st; if (stat(filename, &st) == 0) return st.st_size; return -1; }