Implementation of Simplified Data Encryption Standard (SDES) v1

Submitted By: meetsugan
Rating: starstarstarstarstar (Rate It)


#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()...
 

Recent Jobs

Official Programmer's Heaven Blogs
Web Hosting | Browser and Social Games | Gadgets

Popular resources on Programmersheaven.com
Assembly | Basic | C | C# | C++ | Delphi | Flash | Java | JavaScript | Pascal | Perl | PHP | Python | Ruby | Visual Basic
© Copyright 2011 Programmersheaven.com - All rights reserved.
Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
Operated by CommunityHeaven, a BootstrapLabs company.