#include<stdio.h>
#include<conio.h>
void p10(int data[10])
{
int i,j;
int temp[10];
temp[0]=data[2];
temp[1]=data[4];
temp[2]=data[1];
temp[3]=data[6];
temp[4]=data[3];
temp[5]=data[9];
temp[5]=data[0];
temp[7]=data[8];
temp[8]=data[7];
temp[9]=data[5];
for(i=0;i<10;i++)
data[i]=temp[i];
}
void p8(int data[10],int data2[8])
{
data2[0]=data[5];
data2[1]=data[2];
data2[2]=data[6];
data2[3]=data[3];
data2[4]=data[7];
data2[5]=data[4];
data2[6]=data[9];
data2[7]=data[8];
}
void ip(int data[8])
{
int i,j,temp[8];
temp[0]=data[1];
temp[1]=data[5];
temp[2]=data[2];
temp[3]=data[0];
temp[4]=data[3];
temp[5]=data[7];
temp[6]=data[4];
temp[7]=data[6];
for(i=0;i<8;i++)
data[i]=temp[i];
}
void iip(int data[8])
{
int i,j;
int temp[8];
temp[0]=data[3];
temp[1]=data[0];
temp[2]=data[2];
temp[3]=data[4];
temp[4]=data[6];
temp[5]=data[1];
temp[6]=data[7];
temp[7]=data[5];
for(i=0;i<8;i++)
data[i]=temp[i];
}
void ep(int data[4],int data2[8])
{
data2[0]=data[3];
data2[1]=data[0];
data2[2]=data[1];
data2[3]=data[2];
data2[4]=data[1];
data2[5]=data[2];
data2[6]=data[3];
data2[7]=data[0];
}
void p4(int data[4])
{
int i,j;
int temp[4];
temp[0]=data[1];
temp[1]=data[3];
temp[2]=data[2];
temp[3]=data[0];
for(i=0;i<4;i++)
data[i]=temp[i];
}
/*void mat(int ss1[],int ss2[])
{
}*/
void lshift(int key[])
{
int temp=key[0];
for(int i=0;i<5;i++)
key[i]=key[i+1];
key[4]=temp;
}
void b4lshift(int key[],int k1h[],int k2h[])
{
for(int i=0;i<5;i++)
{
k1h[i]=key[i];
k2h[i]=key[i+5];
}
}
void aflshift(int k1h[],int k2h[],int temp[],int key[])
{
for(int i=0;i<5;i++)
{
temp[i]=k1h[i];
temp[i+5]=k2h[i];
key[i]=k1h[i];
key[i+5]=k2h[i];
}
}
void div_pt(int pt[],int pt1[],int pt2[])
{
for(int i=0;i<4;i++)
{
pt1[i]=pt[i];
pt2[i]=pt[i+4];
}
}
void xor8(int pt[],int subkey[])
{
for(int i=0;i<8;i++)
{
if(pt[i]==subkey[i])
pt[i]=0;
else
pt[i]=1;
}
}
void xor4(int temp1[],int temp2[])
{
for(int i=0;i<4;i++)
{
if(temp1[i]==temp2[i])
temp1[i]=0;
else
temp1[i]=1;
}
}
void binary(int n,int bin[2])
{
int i;
for(i=1;i>=0;i--)
{
bin[i]=n%2;
n=n/2;
}
}
void subs_choice(int sc1[],int sc2[])
{
//int ss01[2],ss1[2];
int s0[4][4]={1,0,3,2,3,2,1,0,0,2,1,3,3,1,3,2},s1[4][4]={0,1,2,3,2,0,1,3,3,0,1,0,2,1,0,3},i,j,k,l,bin1[2],bin2[2];
//binary2decimal
i=sc1[0]*2+sc1[3];
j=sc1[1]*2+sc1[2];
k=sc2[0]*2+sc2[3];
l=sc2[1]*2+sc2[2];
i=s0[i][j];
binary(i,bin1);
j=s1[k][l];
binary(j,bin2);
//4 bits are stored in sc1
for(i=0;i<2;i++)
{
sc1[i]=bin1[i];
sc1[i+2]=bin2[i];
}
}
void swap(int a1[4],int a2[4],int a3[8])
{
for(int i=0;i<4;i++)
{
a3[i]=a2[i];
a3[i+4]=a1[i];
}
}
void main()
{
int i,j,pt[8],key[10],pt1[4],pt2[4],k1h[5],k2h[5],ct[8];
int s0[4][4],s1[4][4],temp[10],subkey[8],sc1[4],sc2[4],li[4];
clrscr();
printf("Enter the 8 bit plain text:");
for(i=0;i<8;i++)
scanf("%d",&pt[i]);
printf("Enter key:");
for(i=0;i<10;i++)
scanf("%d",&key[i]);
ip(pt);
p10(key);
b4lshift(key,k1h,k2h);
lshift(k1h);
lshift(k2h);
aflshift(k1h,k2h,temp,key);
p8(temp,subkey);
//round operation
div_pt(pt,pt1,pt2);
for(i=0;i<4;i++)
li[i]=pt2[i];
ep(pt2,pt);
xor8(pt,subkey); //stores xor value in pt
div_pt(pt,sc1,sc2);
//sbox
subs_choice(sc1,sc2); //sc1 stores the 4 bits
p4(sc1);
xor4(sc1,pt1);//xor value stored in sc1
swap(li,sc1,ct);
iip(ct);
printf("\n\nThe cipher text is : ");
for(i=0;i<8;i++)
printf("%d ",ct[i]);
getch();
}
No comments:
Post a Comment