/* crypt analyser - uses tetragrams in tetra.txt (created using stats prog) - crypt in file should begin with method to use analyse [file] */ #include #include #include #include #include #include int tetfreq[26][26][26][26],ctype,bpt; char buffer[100000]; #define CRYPT_SUBSTITUTION 1 void rndstr(char *d) { int i,j,k; char n; strcpy(d,"abcdefghijklmnopqrstuvwxyz"); i=(rand()%1000)+100; while(i--) { j=rand()%26; k=rand()%26; if(j!=k) { n=d[j]; d[j]=d[k]; d[k]=n; } } } void smalladj(char *d) { int i,j,k; char n; i=(rand()%5)+5; while(i--) { j=rand()%26; k=rand()%26; if(j!=k) { n=d[j]; d[j]=d[k]; d[k]=n; } } } /* higher=better */ double score(char *d) { int i; double sc=0; for(i=0;i='a')&&(buffer[i]<='z')) buffer[bpt++]=buffer[i]; else if((buffer[i]>='A')&&(buffer[i]<='Z')) buffer[bpt++]=buffer[i]-'A'+'a'; } while(!feof(crypt)) { if(fscanf(crypt,"%c",&c)!=1) break; if((c>='a')&&(c<='z')) buffer[bpt++]=c; else if((buffer[i]>='A')&&(buffer[i]<='Z')) buffer[bpt++]=c-'A'+'a'; } buffer[bpt]=0; //strrev(buffer); printf("ho hum %s\n",buffer); printf("Analysing crypt:\n%.2lf %s\n",score("abcdefghijklmnopqrstuvwxyz"),buffer); rndstr(dec); bestscore=score(dec); bestoverall=bestscore-1; smallperturb=1; while(1) { bestadj=bestscore; for(i=0;i<26;i++) for(j=i+1;j<26;j++) { strcpy(testd,dec); c=testd[i]; testd[i]=testd[j]; testd[j]=c; sc=score(testd); if(sc>bestadj) { bestadj=sc; besti=i; bestj=j; } } if(bestadj>bestscore) { c=dec[besti]; dec[besti]=dec[bestj]; dec[bestj]=c; bestscore=bestadj; if(bestscore>bestoverall) { bestoverall=bestscore; smallperturb=1; printf("\n%.2lf %s\n",bestoverall,dec); for(i=0;i