#include static int keyout[17][48]; void des_init(),lshift(),cypher(),des_encrypt(),des_descrypt(); void des_init(unsigned char *key){ unsigned char c[28],d[28]; static int pc1[56] = {57,49,41,33,25,17,9, 01,58,50,42,34,26,18, 10,02,59,51,43,35,27, 19,11,03,60,52,44,36, 63,55,47,39,31,23,15, 07,62,54,46,38,30,22, 14,06,61,53,45,37,29, 21,13,05,28,20,12,04}; static int pc2[48] = {14,17,11,24,1,5, 3,28,15,6,21,10, 23,19,12,4,26,8, 16,7,27,20,13,2, 41,52,31,37,47,55, 30,40,51,45,33,48, 44,49,39,56,34,53, 46,42,50,36,29,32}; static int nls[17] = { 0,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; static int cd[56],keyb[64]; static int cnt,n=0; register int i,j; for(i=0;i<8;i++) /*Read in key*/ for(j=0;j<8;j++) keyb[n++]=(key[i]>>j&0x01); for(i=0;i<56;i++) /*Permuted choice 1*/ cd[i]=keyb[pc1[1]-1]; for(i=0;i<28;i++){ c[i]=cd[i]; d[i]=cd[i+28]; } for(cnt=1;cnt<=16;cnt++){ for(i=0;i=0;i--){ pin[n]=sout[scnt]>>i; sout[scnt]=sout[scnt]-(pin[n++]<>j&0x01); for(i=0;i<64;i++){ /*Initial Permutation*/ lr[i]=inputb[p[i]-1]; if(i<32) l[i]=lr[i]; else r[i-32]=lr[i]; } for(cnt=1;cnt<=16;cnt++){ /*Main encryption loop*/ cypher(r,cnt,fn); for(i=0;i<32;i++){ j=r[i]; r[i]=l[i]^fn[i]; l[i]=j; } } for(i=0;i<32;i++){ lr[i]=r[i]; lr[i+32]=l[i]; } for(i=0;i<64;i++) out[i]=lr[invp[i]-1]; /*Inverse IP*/ for(i=1;i<=8;i++) for(j=1;j<=8;j++) input[i-1]=(input[i-1]<<1)|out[i*8-j]; } void des_decrypt(unsigned char *input){ static unsigned char out[64]; static int inputb[64],lr[64],l[32],r[32]; static int fn[32]; static int cnt,rtemp,n; register int i,j; for(i=n=0;i<8;i++) for(j=0;j<8;j++) inputb[n++]=(input[i]>>j&0x01); for(i=0;i<64;i++){ /*Initial Permutation*/ lr[i]=inputb[p[i]-1]; if(i<32) l[i]=lr[i]; else r[i-32]=lr[i]; } for(cnt=16;cnt>0;cnt--){ /*Main decryption loop*/ cypher(r,cnt,fn); for(i=0;i<32;i++){ rtemp=r[i]; if(l[i]==1 && fn[i]==1) r[i]=0; else r[i]=(l[i] || fn[i]); l[i]=rtemp; } } for(i=0;i<32;i++){ lr[i]=r[i]; lr[i+32]=l[i]; } for(i=0;i<64;i++) out[i]=lr[invp[i]-1]; /*Inverse IP*/ for(i=1;i<=8;i++) for(j=1;j<=8;j++) input[i-1]=(input[i-1]<<1) | out[i*8-j]; } int main(int argc, char *argv[]){ unsigned char *key; unsigned char data[8]; int n; FILE *in; FILE *out; if (argc!=4) { printf("\r\nUsage: des [e][d] \r\n"); return 1; } key=(unsigned char*)getpass("Enter Key:"); des_init(key); if((in=fopen(argv[2],"rb"))==NULL){ fprintf(stderr,"\r\nCould not open input file: %s",argv[2]); return 2; } if((out=fopen(argv[3],"wb"))==NULL){ fprintf(stderr,"\r\nCould not open output file: %s",argv[3]); return 3; } if(argv[1][0]=='e'){ while ((n=fread(data,1,8,in)) >0){ des_encrypt(data); printf("data enctyted"); if(fwrite(data,1,8,out) < 8){ fprintf(stderr,"\r\nError writing to output file\r\n"); return(3); } } } if(argv[1][0]=='d'){ while ((n=fread(data,1,8,in)) >0){ des_decrypt(data); if(fwrite(data,1,8,out) < 8){ fprintf(stderr,"\r\nError writing to output file\r\n"); return(3); } } } fclose(in); fclose(out); return 0; }