Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 4

http://www.daniweb.

com/code/snippet217313
.html

PRACTICAL 3
AIM: TO IMPLEMENT DATA ENCRYPTION STANDARD (DES) ALGORITHM.
PROGRAM:#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<math.h>
#define MAX 100
int keycreate(int fkey[48],int key[56],int s)
{
int n,i,j,left[28],right[28],temp[28];
//for left side
for(i=0;i<28;i++)
left[i]=key[i];
//for right side
for(j=0;i<56;i++,j++)
right[j]=key[i];
//for leftside bit Left Shifted by S
for(i=0;i<s;i++)
temp[i]=left[i];
for(i=0;i<28;i++)
{
left[i]=left[(i+s)%28];
}
for(i=28-s,j=0;i<28;i++,j++)
left[i]=temp[j];
//for rightside bit Shifted by S
for(i=0;i<s;i++)
temp[i]=right[i];
for(i=0;i<28;i++)
{
right[i]=right[(i+s)%28];
}
for(i=28-s,j=0;i<28;i++,j++)
right[i]=temp[j];
// for Merging left bit + right bit
for(i=0;i<28;i++)
key[i]=left[i];
for(j=0;i<56;i++,j++)
key[i]=right[j];
//Randomly Select 48 bits
for(i=0;i<48;i++)

fkey[i]=key[rand()%56];

return 0;
}
//conversion in binary value
int dtob(char ch,int bin[8])
{
int no,i;
no=(int)ch;
for(i=7;i>=0;i--)
{
bin[i]=no%2;
no=no/2;
}
return 0;
}
int permutation(int right[32],int res[48])
{
int i,j;
for(i=0;i<48;i++)
{
res[i]=right[i];
res[i+16]=right[i];
}
return 0;

int xor(int right[48],int key[48],int res[48])


{
int i;
for(i=0;i<48;i++)
{
if(key[i]==right[i])
res[i]=0;
else
res[i]=1;
}
return 0;
}
int dtob1(int no,int bin[4])
{
int i;
for(i=3;i>=0;i--)
{
bin[i]=no%2;
no=no/2;
}
return 0;
}
int sbox(int input[48],int output[32])
{
int sbox[4][16],i,j,temp[8][6],row[8],column[8],bin[4];
for(i=0;i<4;i++)
{ for(j=0;j<16;j++)
{
sbox[i][j]=((int)(rand()+12)%16);
}

}
for(i=0;i<8;i++)
{
for(j=0;j<6;j++)
temp[i][j]=input[i*6+j];
}
for(i=0;i<8;i++)
{
row[i]=temp[i][0]*2+temp[i][5];
column[i]=temp[i][1]*8+temp[i][2]*4+temp[i][3]*2+temp[i][4];
}
for(i=0;i<8;i++)
{
dtob1(sbox[row[i]][column[i]],bin);
for(j=0;j<4;j++)
{
output[i*4+j]=bin[j];
}
}
return 0;
}
int main()
{
int
fkey[48],i,j,k,n=0,len,right[32],left[32],bin[8],input[64],res[48],
output[32],nright[32],no[8],key[56],temp[32],s1;
char ch,plain[MAX],cipher[MAX];
clrscr();
//for 64 bit Plain Text
for(i=0;i<56;i++)
{
key[i]=rand()%2;
}
printf("enter your plain Text :");
while((ch=getchar())!='\n')
{
plain[n]=ch;
n++;
}
plain[n]='\0';
printf("\n enter value for circular shift");
scanf("%d",&s1);
for(i=0;i<8;i++)
{
dtob(plain[i],bin);
for(j=0;j<8;j++)
input[i*8+j]=bin[j];
}
// MSB 32 bits
for(i=0;i<32;i++)
left[i]=input[i];
// LSB 32 bits
for(j=0;i<64;i++,j++)
right[j]=input[i];
for(i=0;i<16;i++)
{
for(j=0;j<32;j++)
temp[j]=right[j];
permutation(right,res);
keycreate(fkey,key,s1);
printf("\n key for round:%3d --> ",i+1);

for(k=0;k<48;k++)
{
printf("%d",fkey[k]);
}
xor(res,fkey,res);
sbox(res,output);
xor(left,output,right);
for(j=0;j<32;j++)
left[j]=temp[j];

}
printf("\n\n Cipher Text
for(i=0;i<64;i++)
{
printf("%d",output[i]);
}
getch();
return 0;

OUTPUT:-

\n :");

You might also like