/* keylength.c * This program attempts to guess the key length based on repetitions * * that are some number of characters apart. The program will only * * work for alphabetic characters. */ #include #include #define MAX_LETTERS 26 #define MAX_OCCUR 256 #define THRESH 0 int main (argc, argv) int argc; char *argv[]; { int doubleL [MAX_LETTERS][MAX_LETTERS][MAX_OCCUR] = {0}; int keysize [MAX_OCCUR] = {0}; int prev, curr; int count = 0, totalReps = 0; int i = 0, j = 0, k = 0; int temp; if ((curr = tolower(getchar())) == EOF){ fprintf(stderr, "No input given\n"); return 1; } while (curr < (int)'a' || curr > (int)'z'){ if ((curr = tolower(getchar())) == EOF){ fprintf(stderr, "No input or invalid input\n"); return 1; } } prev = curr; count++; while ((curr = tolower(getchar())) != EOF){ if (curr >= (int)'a' && curr <= (int)'z'){ doubleL[prev - (int)'a'][curr - (int)'a'][0]++; temp = doubleL[prev-(int)'a'][curr-(int)'a'][0]; if (temp < MAX_OCCUR) doubleL[prev - (int)'a'][curr - (int)'a'][temp] = count; prev = curr; count++; } } while (i < MAX_LETTERS){ while (j < MAX_LETTERS){ while (k < doubleL[i][j][0] && doubleL[i][j][0] > 1){ totalReps += doubleL[i][j][0]-1; fprintf(stdout, "\nThe characters %c%c occured at positions : ", (char)(i+(int)'a'), (char)(j+(int)'a')); while (k < doubleL[i][j][0]){ if (k == 0) fprintf(stdout, "%d, ", doubleL[i][j][1]); else{ temp = doubleL[i][j][k+1] - doubleL[i][j][k]; fprintf(stdout, "%d(%d), ", doubleL[i][j][k+1], temp); if (temp < MAX_OCCUR) keysize[temp]++; } k++; } k++; } k = 0; j++; } j = 0; i++; } fprintf(stdout, "\n\n"); fprintf(stdout, "-------------------------------------------------------\n"); fprintf(stdout, "Keysize statistics\n"); temp = 0; for (i = 0; i < MAX_OCCUR; i++){ if (keysize[i] > keysize[temp]) temp = i; if (keysize[i] > THRESH) fprintf(stdout, "Keysize = %d with frequency %d/%d\n", i, keysize[i], totalReps); } fprintf(stdout, "\n\n*****************************************************************\n"); fprintf(stdout, "Highest frequency = %d(%0.3f) with first occurance at %d\n", keysize[temp], (double)keysize[temp]/totalReps, temp); fprintf(stdout, "*****************************************************************\n\n"); return 0; }