DES encryption algorithm

Source: Internet
Author: User

#include <windows.h>

#include <errno.h>
#include <string.h>
#include <stdio.h>


unsigned char c[17][28],d[17][28],k[17][48];

unsigned char pc_1_c[28]={
57,49,41,33,25,17,9
, 1,58,50,42,34,26,18
, 10,2,59,51,43,35,27
, 19,11,3,60,52,44,36};
unsigned char pc_1_d[28]={
63,55,47,39,31,23,15
, 7,62,54,46,38,30,22
, 14,6,61,53,45,37,29
, 21,13,5,28,20,12,4};
unsigned char pc_2[48]={
14,17,11,24,1,5,
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};

unsigned char ls_count[16]={
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

unsigned char ip_tab[64]={
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7};
unsigned char _ip_tab[64]={
40,8,48,16,56,24,64,32,
39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,
33,1,41,9,49,17,57,25};

unsigned char e_r[48]={
32,1,2,3,4,5,4,5,6,7,8,9,
8,9,10,11,12,13,12,13,14,15,16,17,
16,17,18,19,20,21,20,21,22,23,24,25,
24,25,26,27,28,29,28,29,30,31,32,1};

unsigned char p_des[32]={
16,7,20,21,29,12,28,17,
1,15,23,26,5,18,31,10,
2,8,24,14,32,27,3,9,
19,13,30,6,22,11,4,25};
unsigned char sss[16][4][16]={
14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,/* Err on */
4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,

15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,
3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,

10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,
13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,

7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,
13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,/* err on */

2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,
14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,/* err on */
4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,

12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,

4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,

13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,
1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11};

void son (unsigned char *cc,unsigned char *dd,unsigned char *kk);
void LS (unsigned char *bits, unsigned char *buffer,unsigned char count);
void Setkeystar (unsigned char bits[64]);
void S_box (unsigned char *aa,unsigned char *bb);
void F_des (unsigned char n,unsigned char *ll,unsigned char *rr,unsigned char *ll,unsigned char *rr);
void Ip_des (unsigned char *text,unsigned char *ll,unsigned char *rr);
void _ip_des (unsigned char *text,unsigned char *ll,unsigned char *rr);
void expand0 (unsigned char *in,unsigned char *out);
void Compress0 (unsigned char *out,unsigned char *in);
void compress016 (unsigned char *out,unsigned char *in);
void Encrypt0 (unsigned char *text,unsigned char *mtext);
void Discrypt0 (unsigned char *mtext,unsigned char *text);
void DES (unsigned char *key,unsigned char *text,unsigned char *mtext);
void B_des (unsigned char *key,unsigned char *text,unsigned char *mtext);

void son (unsigned char *cc,unsigned char *dd,unsigned char *kk)
{
unsigned char i;
unsigned char buffer[56];
for (i=0;i<28;i++)
buffer[i]=*cc++;

for (i=28;i<56;i++)
buffer[i]=*dd++;

for (i=0;i<48;i++)
*KK++=BUFFER[PC_2[I]-1];
}

void LS (unsigned char *bits,unsigned char *buffer,unsigned char count)
{
unsigned char i;
for (i=0;i<28;i++)
{
buffer[i]=bits[(I+count)%28];
}
}

void Setkeystar (unsigned char bits[64])
{
unsigned char i,j;

for (i=0;i<28;i++)
C[0][I]=BITS[PC_1_C[I]-1];
for (i=0;i<28;i++)
D[0][I]=BITS[PC_1_D[I]-1];
for (j=0;j<16;j++)
{
LS (C[j],c[j+1],ls_count[j]);
LS (D[j],d[j+1],ls_count[j]);
Son (C[j+1],d[j+1],k[j+1]);
}
}

void S_box (unsigned char *aa,unsigned char *bb)
{
unsigned char i,j,k,m;
unsigned char y,z;
unsigned char ss[8];
m=0;
for (i=0;i<8;i++)
{
J=6*i;
Y=AA[J]*2+AA[J+5];
Z=AA[J+1]*8+AA[J+2]*4+AA[J+3]*2+AA[J+4];
SS[I]=SSS[I][Y][Z];
y=0x08;
for (k=0;k<4;k++)
{
bb[m++]= (ss[i]/y) &1;
y/=2;
}

}
}

void F_des (unsigned char n,unsigned char *ll,unsigned char *rr,unsigned char *ll,unsigned char *rr)
{
unsigned char i;
unsigned char buffer[64],tmp[64];
for (i=0;i<48;i++)
BUFFER[I]=RR[E_R[I]-1];
for (i=0;i<48;i++)
Buffer[i]= (Buffer[i]+k[n][i]) &1;

S_box (BUFFER,TMP);

for (i=0;i<32;i++)
BUFFER[I]=TMP[P_DES[I]-1];

for (i=0;i<32;i++)
Rr[i]= (Buffer[i]+ll[i]) &1;

for (i=0;i<32;i++)
Ll[i]=rr[i];


}

void expand0 (unsigned char *in,unsigned char *out)
{
unsigned char divide;
unsigned char i,j;

for (i=0;i<8;i++)
{
divide=0x80;
for (j=0;j<8;j++)
{
*out++= (in[i]/divide) &1;
divide/=2;
}
}
}

void Ip_des (unsigned char *text,unsigned char *ll,unsigned char *rr)
{
unsigned char i;
unsigned char buffer[64];
/*
Char tmp[64];
*/
Expand0 (Text,buffer);

for (i=0;i<32;i++)
LL[I]=BUFFER[IP_TAB[I]-1];

for (i=0;i<32;i++)
RR[I]=BUFFER[IP_TAB[I+32]-1];
}

void _ip_des (unsigned char *text,unsigned char *ll,unsigned char *rr)
{
unsigned char i;
unsigned char tmp[64];
for (i=0;i<32;i++)
Tmp[i]=ll[i];
for (i=32;i<64;i++)
TMP[I]=RR[I-32];
for (i=0;i<64;i++)
TEXT[I]=TMP[_IP_TAB[I]-1];
}


void Compress0 (unsigned char *out,unsigned char *in)
/*
unsigned char *in;
Char *out;
*/
{
unsigned char times;
unsigned char i,j;

for (i=0;i<8;i++)
{
times=0x80;
in[i]=0;
for (j=0;j<8;j++)
{
in[i]+= (*out++) *times;
times/=2;
}
}
}
void compress016 (unsigned char *out,unsigned char *in)
/*
unsigned char *in;
Char *out;
*/
{
unsigned char times;
unsigned char i,j;

for (i=0;i<16;i++)
{
times=0x8;
in[i]= ' 0 ';
for (j=0;j<4;j++)
{
in[i]+= (*out++) *times;
times/=2;
}
}
}

void Encrypt0 (unsigned char *text,unsigned char *mtext)
/*
unsigned char *text,*mtext;
*/
{
unsigned char ll[64],rr[64],ll[64],rr[64];
unsigned char tmp[64];
unsigned char i,j;
Ip_des (TEXT,LL,RR);

for (i=1;i<17;i++)
{
F_des (I,LL,RR,LL,RR);
for (j=0;j<32;j++)
{
LL[J]=LL[J];
RR[J]=RR[J];
}
}

_ip_des (TMP,RR,LL);

COMPRESS0 (Tmp,mtext);
}

void Discrypt0 (unsigned char *mtext,unsigned char *text)
/*
unsigned char *text,*mtext;
*/
{
unsigned char ll[64],rr[64],ll[64],rr[64];
unsigned char tmp[64];
unsigned char i,j;
Ip_des (MTEXT,LL,RR);

for (i=16;i>0;i--)
{
F_des (I,LL,RR,LL,RR);
for (j=0;j<32;j++)
{
LL[J]=LL[J];
RR[J]=RR[J];
}
}

_ip_des (TMP,RR,LL);

COMPRESS0 (Tmp,text);
}


void DES (unsigned char *key,unsigned char *text,unsigned char *mtext)
/*
unsigned char *text,*mtext,*key;
*/
{
unsigned char tmp[64];
Expand0 (KEY,TMP);
Setkeystar (TMP);
Encrypt0 (Text,mtext);
}
void B_des (unsigned char *key,unsigned char *text,unsigned char *mtext)
/*
unsigned char *text,*mtext,*key;
*/
{
unsigned char tmp[64];
Expand0 (KEY,TMP);
Setkeystar (TMP);
Discrypt0 (Text,mtext);
}

DES encryption algorithm

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.