#include <string.h>
#include "des.h"
#define uchar unsigned char
#define uint unsigned int
uchar xdata lk[4]={0,0,0,0};
uchar xdata rk[4]={0,0,0,0};
uchar xdata oo[4]={0,0,};
uchar xdata pp[4]={0,0,};
uchar xdata blck[9]={0,0,0,};
uchar xdata fnc[4]={0,0,0,0};
uchar xdata enckey[96]={0,0,};
uchar xdata deckey[96]={0,0,};
uchar xdata skey[6]={0,0,};
uchar xdata ls[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
const uchar code
S_BOX1[64]= {
0xe,0x0,0x4,0xf,0xd,0x7,0x1,0x4,
0x2,0xe,0xf,0x2,0xb,0xd,0x8,0x1,
0x3,0xa,0xa,0x6,0x6,0xc,0xc,0xb,
0x5,0x9,0x9,0x5,0x0,0x3,0x7,0x8,
0x4,0xf,0x1,0xc,0xe,0x8,0x8,0x2,
0xd,0x4,0x6,0x9,0x2,0x1,0xb,0x7,
0xf,0x5,0xc,0xb,0x9,0x3,0x7,0xe,
0x3,0xa,0xa,0x0,0x5,0x6,0x0,0xd,
},
S_BOX2[64]= {
0xf,0x3,0x1,0xd,0x8,0x4,0xe,0x7,
0x6,0xf,0xb,0x2,0x3,0x8,0x4,0xe,
0x9,0xc,0x7,0x0,0x2,0x1,0xd,0xa,
0xc,0x6,0x0,0x9,0x5,0xb,0xa,0x5,
0x0,0xd,0xe,0x8,0x7,0xa,0xb,0x1,
0xa,0x3,0x4,0xf,0xd,0x4,0x1,0x2,
0x5,0xb,0x8,0x6,0xc,0x7,0x6,0xc,
0x9,0x0,0x3,0x5,0x2,0xe,0xf,0x9,
},
S_BOX3[64]= {
0xa,0xd,0x0,0x7,0x9,0x0,0xe,0x9,
0x6,0x3,0x3,0x4,0xf,0x6,0x5,0xa,
0x1,0x2,0xd,0x8,0xc,0x5,0x7,0xe,
0xb,0xc,0x4,0xb,0x2,0xf,0x8,0x1,
0xd,0x1,0x6,0xa,0x4,0xd,0x9,0x0,
0x8,0x6,0xf,0x9,0x3,0x8,0x0,0x7,
0xb,0x4,0x1,0xf,0x2,0xe,0xc,0x3,
0x5,0xb,0xa,0x5,0xe,0x2,0x7,0xc,
},
S_BOX4[64]= {
0x7,0xd,0xd,0x8,0xe,0xb,0x3,0x5,
0x0,0x6,0x6,0xf,0x9,0x0,0xa,0x3,
0x1,0x4,0x2,0x7,0x8,0x2,0x5,0xc,
0xb,0x1,0xc,0xa,0x4,0xe,0xf,0x9,
0xa,0x3,0x6,0xf,0x9,0x0,0x0,0x6,
0xc,0xa,0xb,0x1,0x7,0xd,0xd,0x8,
0xf,0x9,0x1,0x4,0x3,0x5,0xe,0xb,
0x5,0xc,0x2,0x7,0x8,0x2,0x4,0xe,
},
S_BOX5[64]= {
0x2,0xe,0xc,0xb,0x4,0x2,0x1,0xc,
0x7,0x4,0xa,0x7,0xb,0xd,0x6,0x1,
0x8,0x5,0x5,0x0,0x3,0xf,0xf,0xa,
0xd,0x3,0x0,0x9,0xe,0x8,0x9,0x6,
0x4,0xb,0x2,0x8,0x1,0xc,0xb,0x7,
0xa,0x1,0xd,0xe,0x7,0x2,0x8,0xd,
0xf,0x6,0x9,0xf,0xc,0x0,0x5,0x9,
0x6,0xa,0x3,0x4,0x0,0x5,0xe,0x3,
},
S_BOX6[64]= {
0xc,0xa,0x1,0xf,0xa,0x4,0xf,0x2,
0x9,0x7,0x2,0xc,0x6,0x9,0x8,0x5,
0x0,0x6,0xd,0x1,0x3,0xd,0x4,0xe,
0xe,0x0,0x7,0xb,0x5,0x3,0xb,0x8,
0x9,0x4,0xe,0x3,0xf,0x2,0x5,0xc,
0x2,0x9,0x8,0x5,0xc,0xf,0x3,0xa,
0x7,0xb,0x0,0xe,0x4,0x1,0xa,0x7,
0x1,0x6,0xd,0x0,0xb,0x8,0x6,0xd,
},
S_BOX7[64]= {
0x4,0xd,0xb,0x0,0x2,0xb,0xe,0x7,
0xf,0x4,0x0,0x9,0x8,0x1,0xd,0xa,
0x3,0xe,0xc,0x3,0x9,0x5,0x7,0xc,
0x5,0x2,0xa,0xf,0x6,0x8,0x1,0x6,
0x1,0x6,0x4,0xb,0xb,0xd,0xd,0x8,
0xc,0x1,0x3,0x4,0x7,0xa,0xe,0x7,
0xa,0x9,0xf,0x5,0x6,0x0,0x8,0xf,
0x0,0xe,0x5,0x2,0x9,0x3,0x2,0xc,
},
S_BOX8[64]= {
0xd,0x1,0x2,0xf,0x8,0xd,0x4,0x8,
0x6,0xa,0xf,0x3,0xb,0x7,0x1,0x4,
0xa,0xc,0x9,0x5,0x3,0x6,0xe,0xb,
0x5,0x0,0x0,0xe,0xc,0x9,0x7,0x2,
0x7,0x2,0xb,0x1,0x4,0xe,0x1,0x7,
0x9,0x4,0xc,0xa,0xe,0x8,0x2,0xd,
0x0,0xf,0x6,0xc,0xa,0x9,0xd,0x0,
0xf,0x3,0x3,0x5,0x5,0x6,0x8,0xb,
};
void SubKey_Generation(uchar *key)
{
uchar xdata i,j;
memset (lk, 0, 4);
memset (rk, 0, 4);
// now PC1 permutation
lk[3] = (lk[3] | (key[7] >> 7 & 0x01)) << 1; //
lk[3] = (lk[3] | (key[6] >> 7 & 0x01)) << 1;
lk[3] = (lk[3] | (key[5] >> 7 & 0x01)) << 1;
lk[3] = (lk[3] | (key[4] >> 7 & 0x01));
lk[2] = (lk[2] | (key[3] >> 7 & 0x01)) << 1;
lk[2] = (lk[2] | (key[2] >> 7 & 0x01)) << 1;
lk[2] = (lk[2] | (key[1] >> 7 & 0x01)) << 1;
lk[2] = (lk[2] | (key[0] >> 7 & 0x01)) << 1;
lk[2] = (lk[2] | (key[7] >> 6 & 0x01)) << 1;
lk[2] = (lk[2] | (key[6] >> 6 & 0x01)) << 1;
lk[2] = (lk[2] | (key[5] >> 6 & 0x01)) << 1;
lk[2] = (lk[2] | (key[4] >> 6 & 0x01));
lk[1] = (lk[1] | (key[3] >> 6 & 0x01)) << 1;
lk[1] = (lk[1] | (key[2] >> 6 & 0x01)) << 1;
lk[1] = (lk[1] | (key[1] >> 6 & 0x01)) << 1;
lk[1] = (lk[1] | (key[0] >> 6 & 0x01)) << 1;
lk[1] = (lk[1] | (key[7] >> 5 & 0x01)) << 1;
lk[1] = (lk[1] | (key[6] >> 5 & 0x01)) << 1;
lk[1] = (lk[1] | (key[5] >> 5 & 0x01)) << 1;
lk[1] = (lk[1] | (key[4] >> 5 & 0x01));
lk[0] = (lk[0] | (key[3] >> 5 & 0x01)) << 1;
lk[0] = (lk[0] | (key[2] >> 5 & 0x01)) << 1;
lk[0] = (lk[0] | (key[1] >> 5 & 0x01)) << 1;
lk[0] = (lk[0] | (key[0] >> 5 & 0x01)) << 1;
lk[0] = (lk[0] | (key[7] >> 4 & 0x01)) << 1;
lk[0] = (lk[0] | (key[6] >> 4 & 0x01)) << 1;
lk[0] = (lk[0] | (key[5] >> 4 & 0x01)) << 1;
lk[0] = (lk[0] | (key[4] >> 4 & 0x01));
rk[3] = (rk[3] | (key[7] >> 1 & 0x01)) << 1;
rk[3] = (rk[3] | (key[6] >> 1 & 0x01)) << 1;
rk[3] = (rk[3] | (key[5] >> 1 & 0x01)) << 1;
rk[3] = (rk[3] | (key[4] >> 1 & 0x01));
rk[2] = (rk[2] | (key[3] >> 1 & 0x01)) << 1;
rk[2] = (rk[2] | (key[2] >> 1 & 0x01)) << 1;
rk[2] = (rk[2] | (key[1] >> 1 & 0x01)) << 1;
rk[2] = (rk[2] | (key[0] >> 1 & 0x01)) << 1;
rk[2] = (rk[2] | (key[7] >> 2 & 0x01)) << 1;
rk[2] = (rk[2] | (key[6] >> 2 & 0x01)) << 1;
rk[2] = (rk[2] | (key[5] >> 2 & 0x01)) << 1;
rk[2] = (rk[2] | (key[4] >> 2 & 0x01));
rk[1] = (rk[1] | (key[3] >> 2 & 0x01)) << 1;
rk[1] = (rk[1] | (key[2] >> 2 & 0x01)) << 1;
rk[1] = (rk[1] | (key[1] >> 2 & 0x01)) << 1;
rk[1] = (rk[1] | (key[0] >> 2 & 0x01)) << 1;
rk[1] = (rk[1] | (key[7] >> 3 & 0x01)) << 1;
rk[1] = (rk[1] | (key[6] >> 3 & 0x01)) << 1;
rk[1] = (rk[1] | (key[5] >> 3 & 0x01)) << 1;
rk[1] = (rk[1] | (key[4] >> 3 & 0x01));
rk[0] = (rk[0] | (key[3] >> 3 & 0x01)) << 1;
rk[0] = (rk[0] | (key[2] >> 3 & 0x01)) << 1;
rk[0] = (rk[0] | (key[1] >> 3 & 0x01)) << 1;
rk[0] = (rk[0] | (key[0] >> 3 & 0x01)) << 1;
rk[0] = (rk[0] | (key[3] >> 4 & 0x01)) << 1;
rk[0] = (rk[0] | (key[2] >> 4 & 0x01)) << 1;
rk[0] = (rk[0] | (key[1] >> 4 & 0x01)) << 1;
rk[0] = (rk[0] | (key[0] >> 4 & 0x01));
lk[3] &= 0x0F;
rk[3] &= 0x0F;
for(i=0; i<=16; i++)
{
j = 6*i;
skey[5]=0;
skey[4]=0;
skey[3]=0;
skey[2]=0;
skey[1]=0;
skey[0]=0;
if(ls[i] == 1)
{
lk[3] = (lk[3] << 1 | lk[2] >> 7);
lk[2] = (lk[2] << 1 | lk[1] >> 7);
lk[1] = (lk[1] << 1 | lk[0] >> 7);
lk[0] = (lk[0] << 1 | lk[3] >> 4);
lk[3] &= 0x0F;
rk[3] = (rk[3] << 1 | rk[2] >> 7);
rk[2] = (rk[2] << 1 | rk[1] >> 7);
rk[1] = (rk[1] << 1 | rk[0] >> 7);
rk[0] = (rk[0] << 1 | rk[3] >> 4);
rk[3] &= 0x0F;
}
else // ls[i] == 2
{
lk[3] = (lk[3] << 2 | lk[2] >> 6);
lk[2] = (lk[2] << 2 | lk[1] >> 6);
lk[1] = (lk[1] << 2 | lk[0] >> 6);
lk[0] = (lk[0] << 2 | lk[3] >> 4);
lk[3] &= 0x0F;
rk[3] = (rk[3] << 2 | rk[2] >> 6);
rk[2] = (rk[2] << 2 | rk[1] >> 6);
rk[1] = (rk[1] << 2 | rk[0] >> 6);
rk[0] = (rk[0] << 2 | rk[3] >> 4);
rk[3] &= 0x0F;
}
// now PC2 permutation
skey[5] = (skey[5] | (lk[1] >> 6 & 0x01)) << 1;
skey[5] = (skey[5] | (lk[1] >> 3 & 0x01)) << 1;
skey[5] = (skey[5] | (lk[2] >> 1 & 0x01)) << 1;
skey[5] = (skey[5] | (lk[0] >> 4 & 0x01)) << 1;
skey[5] = (skey[5] | (lk[3] >> 3 & 0x01)) << 1;
skey[5] = (skey[5] | (lk[2] >> 7 & 0x01)) << 1;
skey[5] = (skey[5] | (lk[3] >> 1 & 0x01)) << 1;
skey[5] = (skey[5] | (lk[0] & 0x01));
enckey[j+5] = skey[5];
skey[4] = (skey[4] | (lk[1] >> 5 & 0x01)) << 1;
skey[4] = (skey[4] | (lk[2] >> 6 & 0x01)) << 1;
skey[4] = (skey[4] | (lk[0] >> 7 & 0x01)) << 1;
skey[4] = (skey[4] | (lk[2] >> 2 & 0x01)) << 1;
skey[4] = (skey[4] | (lk[0] >> 5 & 0x01)) << 1;
skey[4] = (skey[4] | (lk[1] >> 1 & 0x01)) << 1;
skey[4] = (skey[4] | (lk[2] & 0x01)) << 1;
skey[4] = (skey[4] | (lk[3] & 0x01));
enckey[j+4] = skey[4];
skey[3] = (skey[3] | (lk[0] >> 2 & 0x01)) << 1;
skey[3] = (skey[3] | (lk[2] >> 4 & 0x01)) << 1;
skey[3] = (skey[3] | (lk[1] >> 4 & 0x01)) << 1;
skey[3] = (skey[3] | (lk[2] >> 5 & 0x01)) << 1;
skey[3] = (skey[3] | (lk[0] >> 1 & 0x01)) << 1;
skey[3] = (skey[3] | (lk[1] & 0x01)) << 1;
skey[3] = (skey[3] | (lk[1] >> 7 & 0x01)) << 1;
skey[3] = (skey[3] | (lk[3] >> 2 & 0x01));
enckey[j+3] = skey[3];
skey[2] = (skey[2] | (rk[1]