#include #include #include #include #include #define MAXBIGRAMS 20 #define BUFSIZE 4096 typedef struct letter { unsigned char val; int count; } LETTER; typedef struct funct { char *name; void (*handler)(); char *fullname; } FUNC; typedef unsigned char(*CRYPTOF)(unsigned char, unsigned char); /* Common data */ unsigned char buffer[BUFSIZE]; int fd; char *filename; float threshold=1.50,maxallowederr=0.50; char *functioname; int myargc; char **myargv; /* Used by stat+decrypt */ LETTER letters[256]; int totall; /* Used by decrypt */ char allowedchars[256]; int alloweds; char allowed[256]; int bads[256]; void decrypt(); void stat(); unsigned char add(unsigned char, unsigned char); unsigned char sub(unsigned char, unsigned char); unsigned char xor(unsigned char, unsigned char); FUNC functions[]= { {"decrypt",decrypt,"[Decrypt]"}, {"stat",stat,"[Statistics]"}, {0,NULL} }; void out(char *fmt, ...) { va_list ap; va_start(ap, fmt); if (functioname) printf("%s ",functioname); vprintf(fmt,ap); va_end(ap); } void fatal(char *fmt, ...) { va_list ap; va_start(ap, fmt); if (functioname) printf("%s:[FATAL]\n ",functioname); vprintf(fmt,ap); va_end(ap); printf("\n"); _exit(-1); } void usage() { printf("Commands:\n"); printf(" decrypt Decrypt\n"); printf(" -a Read allowed characters from file\n"); printf(" -t Threshold for decrypting (in %%)\n"); printf(" -m Maximal allowed error (in %%)\n"); printf("\n"); printf(" stat Create statistics\n"); printf(" -o Generate allowed characters file\n"); exit(-1); } void AddStatistics(unsigned char *data, int len) { int i; for (i=0;icount,b=((LETTER*)bb)->count; if (a0) { if (!allowed[c]) allowedchars[alloweds++]=c; allowed[c]=1; } close(fdd); } void WriteAllowedChars(char *fname) { int fdd; int i; if (!fname || !*fname) fname="chars.out"; out("Writing AllowedChars\n"); if ((fdd=open(fname,O_WRONLY|O_CREAT,0644))<0) { out("Unable to open allowedChars(%s) for writing\n",fname); return; } for (i=0;(i<256) && letters[i].count;i++) write(fdd,&letters[i].val,1); close(fdd); } unsigned char add(unsigned char a, unsigned char b) { return a+b; } unsigned char sub(unsigned char a, unsigned char b) { return a-b; } unsigned char xor(unsigned char a, unsigned char b) { return a^b; } /* encr(x,key), decr(x,key), keyr(enc,dec) */ void TrySimpleCrypto(char *prefix, CRYPTOF encr, CRYPTOF decr, CRYPTOF keyr) { int i,c,j,minbad; unsigned char key,ccrr,llff; int crlfdelta; int fdd; int readed; char *fname; minbad=totall+1; for (i=0;i0) bads[i]+=sqrt(crlfdelta); if (bads[i]=totall/98) { printf("0x%.2x: %5.2f%%",letters[i].val,100.0*letters[i].count/totall); if (letters[i].val>=0x20 && letters[i].val<0x7f) printf(" (%c)",letters[i].val); putchar('\n'); } for (i=3;i