#include #define assert(x) if(!(x)) fprintf(stderr,"Error in line %d file %s\n", __LINE__,__FILE__) #define eval_box(b,x) b[(x)>>3][(x) & 0x7] char *binString(int n, unsigned int mask, char *buff){ int i; int top; for (top=31;!((1<> 1 ) | (c & 0x3); } unsigned char keyRound(unsigned int K, int round){ unsigned int mask = (1<<(9-round+1))-1; unsigned char ret; if (round > 1) ret = ((K & mask) << (round-2) | (K & (~mask))>>(9-round+2)); else ret = K>>1; //printf("Key %X round %d\n",ret,round); return ret; // return (K & mask) << (round-2); //| (K & (~mask))>>(9-round+1)); } unsigned char f(unsigned char R, unsigned char K){ unsigned char iv; iv = expand(R) ^ K; return (eval_box(s1,iv>>4) << 3) | eval_box(s2,iv & 0xf); } unsigned int encript(unsigned int pt, unsigned int K, int rounds){ int i; unsigned char L,R,tmp; L = 0x3f & (pt >> 6); R = pt & 0x3f; for (i=1;i<=rounds;i++){ // printf("1:L=%x R=%x key = %x\n",L,R,keyRound(K,i)); tmp = (L ^ f(R,keyRound(K,i))); L = R; R=tmp; // printf("2:L=%x R=%x\n",L,R); } return (L<<6) | R; } unsigned int decript(unsigned int ct, unsigned int K, int rounds){ int i; unsigned char L,R,tmp; // Right is L and Left is Right R = 0x3f & (ct >> 6); L = ct & 0x3f; for (i=rounds;i>=1;i--){ // printf("1:L=%x R=%x\n",L,R); tmp = (L ^ f(R,keyRound(K,i))); L = R; R=tmp; // printf("2:L=%x R=%x\n",L,R); } return (R<<6) | L; } int readInt(){ char buff[255]; int i=0; char c; while(((c = getchar()) != '\n') && i++<255){ buff[i-1]=c; } buff[i]=0; return atoi(buff); } unsigned int readBin(int bits){ char c; int i; unsigned int ret = 0; for (i=bits-1;i>=0;i--){ c = getchar(); ret = ret | (c == '1'?1<