#include<fstream.h>
#include<conio.h>
#include<string.h>
#include<math.h>
char result[11];
char input_to_sbox[5];
char sbox0[4][4],sbox1[4][4];
char key1[9];
char key2[9];
char key[10];
void xor(char *str1,char *str2)
{
if(strlen(str1)!=strlen(str2))
{
cout<<"X-or can be done with same length numbers only!!!";
return;
}
for(int i=0;i<strlen(str1);i++)
{
if(str1[i]==str2[i])
result[i]='0';
else
result[i]='1';
}
result[i]=NULL;
}
int convert_to_decimal(char *str)
{
if(strlen(str)!=2)
return -1;
if (strcmp(str,"00")==0)
return 0;
if (strcmp(str,"01")==0)
return 1;
if (strcmp(str,"10")==0)
return 2;
if (strcmp(str,"11")==0)
return 3;
return -1;
}
void convert_to_binary(int num)
{
if(num==0)
strcpy(result,"00");
if(num==1)
strcpy(result,"01");
if(num==2)
strcpy(result,"10");
if(num==3)
strcpy(result,"11");
}
void s_box(int s_box_no)
{
int row,column;
char temp1[3];
char buff[4];
strcpy(buff,input_to_sbox);
//strset(buff,'\0');
/*if(strlen(buff)!=4)
return "ERROR";*/
temp1[0]=input_to_sbox[0];
temp1[1]=input_to_sbox[3];
temp1[2]=NULL;
row=convert_to_decimal(temp1);
temp1[0]=input_to_sbox[1];
temp1[1]=input_to_sbox[2];
temp1[2]=NULL;
column=convert_to_decimal(temp1);
//cout<<"Row:"<<row<<"Columm"<<column;
int tmp;
if(s_box_no==0)
{
tmp=sbox0[row][column]-48;
convert_to_binary(tmp);
//cout<<"SBox0:"<<result;
}
else
{
tmp=sbox1[row][column]-48;
convert_to_binary(tmp);
//cout<<"SBox1:"<<result;
}
}
void fk(char *input,char* key)
{
char temp[9],buff[2];
if(strlen(input)!=4 || strlen(key)!=8)
{
cout<<"Wrong input!!!";
return;
}
//Expansion and Permutation E/P
temp[0]=temp[6]=input[3];
temp[1]=temp[7]=input[0];
temp[2]=temp[4]=input[1];
temp[3]=temp[5]=input[2];
temp[8]=NULL;
xor(temp,key); //Xor with key...
strcpy(temp,result);
input_to_sbox[0]=temp[0];
input_to_sbox[1]=temp[1];
input_to_sbox[2]=temp[2];
input_to_sbox[3]=temp[3];
input_to_sbox[4]=NULL;
char str1[2],str2[2];
strset(result,'\0');
s_box(0);
result[2]='\0';
strcpy(str1,result);
input_to_sbox[0]=temp[4];
input_to_sbox[1]=temp[5];
input_to_sbox[2]=temp[6];
input_to_sbox[3]=temp[7];
input_to_sbox[4]=NULL;
strset(result,'\0');
s_box(1);
result[2]='\0';
strcat(str1,result);
result[0]=str1[1];
result[1]=str1[3];
result[2]=str1[2];
result[3]=str1[0];
result[4]=NULL;
//strcpy(result,s_box_result);
}
void generate_sub_keys(char key[])
{
int k1_order[]={0,6,8,3,7,2,9,5};
int k2_order[]={7,2,5,4,9,1,8,0};
for(int i=1;i<=8;i++)
{
key1[i-1]=key[k1_order[i-1]];
key2[i-1]=key[k2_order[i-1]];
}
key1[8]=key2[8]=NULL;
}//void generate_sub_keys()
void ip(char str[])
{
result[0]=str[1];
result[1]=str[5];
result[2]=str[2];
result[3]=str[0];
result[4]=str[3];
result[5]=str[7];
result[6]=str[4];
result[7]=str[6];
result[8]=NULL;
}
void ip_inverse(char str[])
{
result[0]=str[3];
result[1]=str[0];
result[2]=str[2];
result[3]=str[4];
result[4]=str[6];
result[5]=str[1];
result[6]=str[7];
result[7]=str[5];
result[8]=NULL;
}
int convert_to_dec(long int bin)
{
int n=0,c=0,temp;
while(bin>0)
{
temp=bin%10;
bin/=10;
n+=pow(2,c)*temp;
c++;
}
return n;
}
void getachar(int ch,int len=8)
{
long int n,dec,temp,bin=0,c=0,counter=0;
char str[10],tmp_str[10];
//cout<<"Enter a Character:";
//dec=getche();
dec=ch;
while(dec>0)
{
temp=dec%2;
dec/=2;
bin+=pow10(c)*temp;
c++;
}
n=bin;
strset(tmp_str,'\0');
strset(str,'\0');
while(n>0)
{
temp=n%10;
n/=10;
tmp_str[counter]=temp+48;
counter++;
///cout<<'\t'<<temp;
}
tmp_str[counter]=NULL;
strrev(tmp_str);
counter=len-counter;
for(int i=0;i<counter;i++)
str[i]='0';
str[i]=NULL;
strcat(str,tmp_str);
strcpy(result,str);
}
void main()
{
char in_file_path[50],out_file_path[50];
char ch,choice;
char plain_text[9],cipher_text[9];
char l[5],r[5];
char buff[9];
char pass[25];
int i,tmp;
strcpy(sbox0[0],"1032");
strcpy(sbox0[1],"3210");
strcpy(sbox0[2],"0213");
strcpy(sbox0[3],"3132");
strcpy(sbox1[0],"0123");
strcpy(sbox1[1],"2013");
strcpy(sbox1[2],"3010");
strcpy(sbox1[3],"2103");
//strcpy(key,"1010101101");
menu:
clrscr();
cout<<"Enter Your Option..."<<endl;
cout<<"Encrypt a File ??? 1"<<endl;
cout<<"Decrypt a File ??? 2"<<endl;
cout<<"Quit ??? 3"<<endl;
choice=getch();
switch(choice)
{
case '1':
cout<<"Enter the file to be Encrypted:";
cin>>in_file_path;
cout<<"Enter a name for the Encrypted file:";
cin>>out_file_path;
cout<<"Enter Password(key):";
cin>>pass;
tmp=0;
cout<<endl<<"Pass:";
for(i=0;i<strlen(pass);i++)
{
cout<<pass[i];
tmp+=(int)pass[i];
}
tmp%=1024;
getachar(tmp,10);
strcpy(key,result);
ifstream in_file(in_file_path);
if(!in_file)
{
cout<<"File not Found!!!\a";
getch();
goto menu;
}
ofstream out_file(out_file_path);
while(in_file.get(ch)!=NULL)
{
//cout<<ch;
long int n,dec,temp,bin=0,c=0,counter=0;
char str[9],tmp_str[9];
dec=ch;
while(abs(dec)>0)
{
temp=dec%2;
dec/=2;
bin+=pow10(c)*temp;
c++;
}
n=bin;
strset(tmp_str,'\0');
strset(str,'\0');
while(abs(n)>0)
{
temp=n%10;
n/=10;
tmp_str[counter]=temp+48;
counter++;
///cout<<'\t'<<temp;
}
tmp_str[counter]=NULL;
strrev(tmp_str);
counter=8-counter;
for(i=0;i<counter;i++)
str[i]='0';
strcat(str,tmp_str);
strcpy(plain_text,str);
bin=0;
//cout<<endl<<"Plain Text:"<<plain_text;
/*
cout<<"Enter The 8-bit Plain Text:";
cin>>plain_text;
cout<<"Enter The 10-bit Key:";
cin>>key;
*/
//strcpy(key,"1100111001");
//*************************Start of Encryption********************************
//Generate Sub keys k1 and k2...
generate_sub_keys(key);
// Initial Permutation...
ip(plain_text);
strcpy(plain_text,result);
l[0]=plain_text[0];
l[1]=plain_text[1];
l[2]=plain_text[2];
l[3]=plain_text[3];
l[4]=NULL;
r[0]=plain_text[4];
r[1]=plain_text[5];
r[2]=plain_text[6];
r[3]=plain_text[7];
r[4]=NULL;
fk(r,key1);//Fk1...
strcpy(buff,result);
xor(buff,l);// Xor with left...
//Switch the blocks...
strcpy(buff,result);
strcpy(l,r);
strcpy(r,buff);
fk(r,key2);//Fk1...
strcpy(buff,result);
xor(buff,l); // Xor with left...
strcpy(buff,result);
strcpy(l,buff);
strcpy(cipher_text,l);
strcat(cipher_text,r);
//cout<<"Cipher before IP-1:"<<cipher_text;
ip_inverse(cipher_text);
strcpy(cipher_text,result);
//cout<<endl<<"Cipher Text:"<<cipher_text;
bin=0;
for(i=7;i>=0;i--)
bin+=pow(10,7-i)*((int)cipher_text[i]-48);
//cout<<endl<<bin;
dec=convert_to_dec(bin);
//cout<<(char)dec;
out_file.put(dec);
}//while(in_file.get(ch)!=NULL)...
out_file.close();
break;
case '2':
cout<<"Enter the file to be Decrypted:";
cin>>in_file_path;
cout<<"Enter a name for the Decrypted file:";
cin>>out_file_path;
cout<<"Enter Password(key):";
cin>>pass;
tmp=0;
cout<<endl<<"Pass:";
for(i=0;i<strlen(pass);i++)
{
cout<<pass[i];
tmp+=(int)pass[i];
}
tmp%=10241;
getachar(tmp,10);
strcpy(key,result);
ifstream in_file_de(in_file_path);
if(!in_file_de)
{
cout<<"File not Found!!!\a";
getch();
goto menu;
}
ofstream out_file_de(out_file_path);
long int dec=0,bin=0;
while(in_file_de.get(ch)!=NULL)
{
//*************************Start of Decryption********************************
dec=ch;
if(dec<0)
dec+=256;
getachar(dec);
result[8]=NULL;
strcpy(cipher_text,result);
generate_sub_keys(key);
ip(cipher_text);
strcpy(cipher_text,result);
l[0]=cipher_text[0];
l[1]=cipher_text[1];
l[2]=cipher_text[2];
l[3]=cipher_text[3];
l[4]=NULL;
r[0]=cipher_text[4];
r[1]=cipher_text[5];
r[2]=cipher_text[6];
r[3]=cipher_text[7];
r[4]=NULL;
fk(r,key2);//Fk1...
strcpy(buff,result);
xor(buff,l);// Xor with left...
//Switch the blocks...
strcpy(buff,result);
strcpy(l,r);
strcpy(r,buff);
fk(r,key1);//Fk1...
strcpy(buff,result);
xor(buff,l); // Xor with left...
strcpy(buff,result);
strcpy(l,buff);
strcpy(cipher_text,l);
strcat(cipher_text,r);
//cout<<"Cipher before IP-1:"<<cipher_text;
ip_inverse(cipher_text);
strcpy(plain_text,result);
//cout<<endl<<"Plain Text:"<<plain_text;
bin=0;
for(i=7;i>=0;i--)
bin+=pow(10,7-i)*((int)plain_text[i]-48);
//cout<<endl<<bin;
dec=convert_to_dec(bin);
cout<<endl<<"The Decrypted char is:\'"<<(char)dec<<'\''<<endl<<"Its Ascii is:"<<dec;
out_file_de<<(char)dec;
//*************************End of Decryption**********************************
}//while..
out_file_de.close();
in_file_de.close();
break;
case '3':
break;
default:
goto menu;
}//switch(choice)...
}//main()...