精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>编码解码>>56bitDES加密算法的源程序

主题:56bitDES加密算法的源程序
发信人: sonicln()
整理人: wenbobo(2002-12-27 15:50:04), 站内信件
下面的程序是我刚刚编的.仅把主要函数贴上.
RSA的程序我正在编,过几天贴上.
void descode(char *p)是加密程序*p指向一个8byte的字符数组
为明文.函数调用后将产生8byte的密文.
void desdecode(char *p)为解密函数.输入密文输出明文.

unsigned char key48[16][6],key[8]={0,0,0,0,0,0,0,0};
unsigned char sel_table1[]={
        0x38,0x30,0x28,0x20,0x18,0x10,0x08,
        0x00,0x39,0x31,0x29,0x21,0x19,0x11,
        0x09,0x01,0x3a,0x32,0x2a,0x22,0x1a,
        0x12,0x0a,0x02,0x3b,0x33,0x2b,0x23,

        0x3e,0x36,0x2f,0x26,0x1e,0x16,0x0e,
        0x06,0x3d,0x35,0x2d,0x25,0x1d,0x15,
        0x0d,0x05,0x3b,0x34,0x2c,0x24,0x1c,
        0x14,0x0c,0x04,0x1b,0x13,0x0b,0x03};

unsigned char sel_table2[]={
        0x0d,0x10,0x0a,0x17,0x00,0x04,0x02,0x1b,
        0x0e,0x05,0x14,0x09,0x16,0x12,0x0b,0x03,
        0x19,0x07,0x0f,0x06,0x1a,0x13,0x0c,0x01,
        0x28,0x33,0x1e,0x24,0x2e,0x36,0x1d,0x27,
        0x32,0x2c,0x20,0x2f,0x2b,0x30,0x26,0x37,
        0x21,0x34,0x2d,0x29,0x31,0x23,0x1c,0x1f};

unsigned char sel_table3[]={
         0x1f,0x00,0x01,0x02,0x03,0x04,0x03,0x04,
         0x05,0x06,0x07,0x08,0x07,0x08,0x09,0x0a,
         0x0b,0x0c,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,
         0x0f,0x10,0x0f,0x10,0x11,0x12,0x13,0x14,
         0x13,0x14,0x15,0x16,0x17,0x18,0x17,0x18,
         0x19,0x1a,0x1b,0x1c,0x1b,0x1c,0x1d,0x1e};

unsigned char sel_table4[8][4][16]={
 {{0x0e,0x04,0x0d,0x01,0x02,0x0f,0x0b,0x08,0x03,0x0a,0x06,0x0c,0x05,0

x09,0x00,0x07},
  {0x00,0x0f,0x07,0x04,0x0e,0x02,0x0d,0x01,0x0a,0x06,0x0c,0x0b,0x09,0

x05,0x03,0x08},
  {0x04,0x01,0x0e,0x08,0x0d,0x06,0x02,0x0b,0x0f,0x0c,0x09,0x07,0x03,0

x0a,0x05,0x00},
  {0x0f,0x0c,0x08,0x02,0x04,0x09,0x01,0x07,0x05,0x0b,0x03,0x0e,0x0a,0

x00,0x06,0x0d}
 },/*   s1   */
 {{0x0f,0x01,0x08,0x0e,0x06,0x0b,0x03,0x04,0x09,0x07,0x02,0x0d,0x0c,0

x00,0x05,0x0a},
  {0x03,0x0d,0x04,0x07,0x0f,0x02,0x08,0x0e,0x0c,0x00,0x01,0x0a,0x06,0

x09,0x0b,0x05},
  {0x00,0x0e,0x07,0x0b,0x0a,0x04,0x0d,0x01,0x05,0x08,0x0c,0x06,0x09,0

x03,0x02,0x0f},
  {0x0d,0x08,0x0a,0x01,0x03,0x0f,0x04,0x02,0x0b,0x06,0x07,0x0c,0x00,0

x05,0x0e,0x09}
 },/*   s2   */
 {{0x0a,0x00,0x09,0x0e,0x06,0x03,0x0f,0x05,0x01,0x0d,0x0c,0x07,0x0b,0

x04,0x02,0x08},
  {0x0d,0x07,0x00,0x09,0x03,0x04,0x06,0x0a,0x02,0x08,0x05,0x0e,0x0c,0

x0b,0x0f,0x01},
  {0x0d,0x06,0x04,0x09,0x08,0x0f,0x03,0x00,0x0b,0x01,0x02,0x0c,0x05,0

x0a,0x0e,0x07},
  {0x01,0x0a,0x0d,0x00,0x06,0x09,0x08,0x07,0x04,0x0f,0x0e,0x03,0x0b,0

x05,0x02,0x0c}
 },/*   s3   */
 {{0x07,0x0d,0x0e,0x03,0x00,0x06,0x09,0x0a,0x01,0x02,0x08,0x05,0x0b,0

x0c,0x04,0x0f},
  {0x0d,0x08,0x0b,0x05,0x06,0x0f,0x00,0x03,0x04,0x07,0x02,0x0c,0x01,0

x0a,0x0e,0x09},
  {0x0a,0x06,0x09,0x00,0x0c,0x0b,0x07,0x0d,0x0f,0x01,0x03,0x0e,0x05,0

x02,0x08,0x04},
  {0x03,0x0f,0x00,0x06,0x0a,0x01,0x0d,0x08,0x09,0x04,0x05,0x0b,0x0c,0

x07,0x02,0x0e}
 },/*   s4   */
 {{0x02,0x0c,0x04,0x01,0x07,0x0a,0x0b,0x06,0x08,0x05,0x03,0x0f,0x0d,0

x00,0x0e,0x09},
  {0x0e,0x0b,0x02,0x0c,0x04,0x07,0x0d,0x01,0x05,0x00,0x0f,0x0a,0x03,0

x09,0x08,0x06},
  {0x04,0x02,0x01,0x0b,0x0a,0x0d,0x07,0x08,0x0f,0x09,0x0c,0x05,0x06,0

x03,0x00,0x0e},
  {0x0b,0x08,0x0c,0x07,0x01,0x0e,0x02,0x0d,0x06,0x0f,0x00,0x09,0x0a,0

x04,0x05,0x03}
 },/*   s5   */
 {{0x0c,0x01,0x0a,0x0f,0x09,0x02,0x06,0x08,0x00,0x0d,0x03,0x04,0x0e,0

x07,0x05,0x0b},
  {0x0a,0x0f,0x04,0x02,0x07,0x0c,0x09,0x05,0x06,0x01,0x0d,0x0e,0x00,0

x0b,0x03,0x08},
  {0x09,0x0e,0x0f,0x05,0x02,0x08,0x0c,0x03,0x07,0x00,0x04,0x0a,0x01,0

x0d,0x0b,0x06},
  {0x04,0x03,0x02,0x0c,0x09,0x05,0x0f,0x0a,0x0b,0x0e,0x01,0x07,0x06,0

x00,0x08,0x0d}
 },/*   s6   */
 {{0x04,0x0b,0x02,0x0e,0x0f,0x00,0x08,0x0d,0x03,0x0c,0x09,0x08,0x05,0

x0a,0x06,0x01},
  {0x0d,0x00,0x0b,0x07,0x04,0x09,0x01,0x0a,0x0e,0x03,0x05,0x0c,0x02,0

x0f,0x08,0x06},
  {0x01,0x04,0x0b,0x0d,0x0c,0x03,0x07,0x0e,0x0a,0x0f,0x06,0x08,0x00,0

x05,0x09,0x02},
  {0x06,0x0b,0x0d,0x08,0x01,0x04,0x0a,0x07,0x09,0x05,0x00,0x0f,0x0e,0

x02,0x03,0x0c}
 },/*   s7   */
 {{0x0d,0x02,0x08,0x04,0x06,0x0f,0x0b,0x01,0x0a,0x09,0x03,0x0e,0x05,0

x00,0x0c,0x07},
  {0x01,0x0f,0x0d,0x08,0x0a,0x03,0x07,0x04,0x0c,0x05,0x06,0x0b,0x00,0

x0e,0x09,0x02},
  {0x07,0x0b,0x04,0x01,0x09,0x9c,0x0e,0x02,0x00,0x06,0x0a,0x0d,0x0f,0

x03,0x05,0x08},
  {0x02,0x01,0x0e,0x07,0x04,0x0a,0x08,0x0d,0x0f,0x0c,0x09,0x00,0x03,0

x05,0x06,0x0b}
 }/*    s8   */
};
unsigned char sel_table5[]={
 0x10,0x07,0x14,0x15,0x1d,0x0c,0x1c,0x11,
 0x01,0x0f,0x17,0x1a,0x05,0x12,0x1f,0x0a,
 0x02,0x08,0x18,0x0e,0x20,0x1b,0x03,0x09,
 0x13,0x0d,0x1e,0x06,0x16,0x0b,0x04,0x19};

unsigned char init_tran[]={
         0x39,0x31,0x29,0x21,0x19,0x11,0x09,0x01,
         0x3b,0x33,0x2b,0x23,0x1b,0x13,0x0b,0x03,
         0x3d,0x35,0x2d,0x25,0x1d,0x15,0x0d,0x05,
         0x3f,0x37,0x2f,0x27,0x1f,0x17,0x0f,0x07,
         0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00,
         0x3a,0x32,0x2a,0x22,0x1a,0x12,0x0a,0x02,
         0x3c,0x34,0x2c,0x24,0x1c,0x14,0x0c,0x04,
         0x3e,0x36,0x2e,0x26,0x1e,0x16,0x0e,0x06};

unsigned char uninit_tran[]={
        0x27,0x07,0x2f,0x0f,0x37,0x17,0x3f,0x1f,
        0x26,0x06,0x2e,0x0e,0x36,0x16,0x3e,0x1e,
        0x25,0x05,0x2d,0x0d,0x35,0x15,0x3d,0x1d,
        0x24,0x04,0x2c,0x0c,0x34,0x14,0x3c,0x1c,
        0x23,0x03,0x2b,0x0b,0x33,0x13,0x3b,0x1b,
        0x22,0x02,0x2a,0x0a,0x32,0x12,0x3a,0x1a,
        0x21,0x01,0x29,0x09,0x31,0x11,0x39,0x19,
        0x20,0x00,0x28,0x08,0x30,0x10,0x38,0x18};

unsigned char cyc[]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

void cyc_move(unsigned char *p,int n);
void change1(unsigned char *p,int n);
void init_transform(unsigned char *p);    /* 64bit to 64bit initialize

 transform  */
void uninit_transform(unsigned char *p);  /* 64bit to 64bit uninitiali

ze transform*/
void select1(unsigned char *p1,unsigned char *p2); /* 64bit to 56bit t

ransform             */
void select2(unsigned char *p1,unsigned char *p2); /* 56bit to 48bit t

ransform             */
void select3(unsigned char *p1,unsigned char *p2); /* 32bit to 48bit t

ransform             */
void select4(unsigned char *p1,unsigned char *p2); /* 48bit to 32bit S

 box transform       */
void select5(unsigned char *p);
void mod2add(unsigned char *p1,unsigned char *p2,int byte); /* p1 XOR 

p2                           */
void descode(unsigned char *text);        /* DES code                 

            */
void desdecode(unsigned char *text);      /* DES decode               

            */void decipher()
void encipher();
void decipher();


void init_transform(unsigned char *p)
{
 int i,j,m,n,k;
 unsigned char t[8]={0,0,0,0,0,0,0,0};
 for(i=0;i<8;i++)
for(j=0;j<8;j++)
{
k=init_tran[i*8+j];m=k/8;n=k%8;
if (p[m]&0x01<<n) k=1; else k=0;
t[i]=t[i]|(k<<j);
}
for(i=0;i<8;i++)
p[i]=t[i];
}

void uninit_transform(unsigned char *p)
{
int i,j,m,n,k;
unsigned char t[8]={0,0,0,0,0,0,0,0};
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{
k=uninit_tran[i*8+j];m=k/8;n=k%8;
if (p[m]&0x01<<n) k=1; else k=0;
t[i]=t[i]|(k<<j);
}
for(i=0;i<8;i++)
p[i]=t[i];
}

void select5(unsigned char *p)
{
int i,j,m=0,n=0,k;
unsigned char t[4];
t[0]=0; t[1]=0; t[2]=0; t[3]=0;
for(i=0;i<4;i++)
for(j=0;j<8;j++)
{
k=sel_table5[i*8+j];m=k/8;n=k%8;
if (p[m]&0x01<<n) k=1; else k=0;
t[i]=t[i]|(k<<j);
}
for(i=0;i<4;i++)
p[i]=t[i];
}

void select4(unsigned char *p1,unsigned char *p2)
{
unsigned char s;
int i,j,m=0,n=0,k,x,y;
p2[0]=0x00; p2[1]=0x00; p2[2]=0x00; p2[3]=0x00;
for(i=0;i<8;i++)
{
s=0x00;
for(j=0;j<6;j++)
{
if (p1[m]&(0x01<<n)) k=1;else k=0;
s=s|(k<<j);
n++;
if (n==8) {n=0;m++;}
}
x=((s&0x20)>>4)|(s&0x01);
  y=(s&0x1e)>>1;
  k=sel_table4[i][x][y];
  if (i%2) p2[i/2]=p2[i/2]|k; else p2[i/2]=p2[i/2]|(k<<4);
}
}



void mod2add(unsigned char *p1,unsigned char *p2,int byte)
{
int i,j,k,l;
for(i=0;i<byte;i++)
{
p1[i]=~p1[i]&p2[i]|p1[i]&~p2[i];
}
}

void select1(unsigned char *p1,unsigned char *p2)
{
int i,j,m,n,k;
for(i=0;i<7;i++)
{
p2[i]=0x00;
for(j=0;j<8;j++)
{
m=sel_table1[i*8+j]/8;n=sel_table1[i*8+j]%8;
if (p1[m]&(0x01<<n)) k=1;else k=0;
p2[i]=p2[i]|(k<<j);
}
}
}

void select2(unsigned char *p1,unsigned char *p2)
{
int i,j,m,n,k;
for(i=0;i<6;i++)
{
p2[i]=0x00;
for(j=0;j<8;j++)
{
m=sel_table2[i*8+j]/8;n=sel_table2[i*8+j]%8;
if (p1[m]&(0x01<<n)) k=1;else k=0;
p2[i]=p2[i]|(k<<j);
}
}
}

void select3(unsigned char *p1,unsigned char *p2)
{
int i,j,m,n,k;
for(i=0;i<6;i++)
{
p2[i]=0x00;
for(j=0;j<8;j++)
{
m=sel_table3[i*8+j]/8;n=sel_table1[i*8+j]%8;
if (p1[m]&(0x01<<n)) k=1;else k=0;
p2[i]=p2[i]|(k<<j);
}
}
}

void change1(unsigned char *p,int n)
{
unsigned char low[4],high[4];
high[0]=p[0];
high[1]=p[1];
high[2]=p[2];
high[3]=p[3]&0x0f0;
high[3]>>=4;
 low[0]=((p[3]&0x0f)<<4)|((p[4]&0x0f0)>>4);
 low[1]=((p[4]&0x0f)<<4)|((p[5]&0x0f0)>>4);
 low[2]=((p[5]&0x0f)<<4)|((p[6]&0x0f0)>>4);
 low[3]=p[6]&0x0f;
 cyc_move(high,n);
 cyc_move(low,n);
 p[0]=high[0];
 p[1]=high[1];
 p[2]=high[2];
 p[3]=high[3]<<4|((low[0]&0x0f0)>>4);
 p[4]=(low[0]&0x0f)<<4|((low[1]&0x0f0)>>4);
 p[5]=(low[1]&0x0f)<<4|((low[2]&0x0f0)>>4);
 p[6]=(low[2]&0x0f)<<4|(low[3]&0x0f);
}

void cyc_move(unsigned char *p,int n)
{
int i,k1,k2;
for(i=0;i<n;i++)
{
k1=p[0]&0x01;
p[0]>>=1;
  p[0]=p[0]&0x7f;
  k2=p[1]&0x01;
  p[1]>>=1;
  p[1]=p[1]&0x7f;
  p[1]=p[1]|(k1<<7);
k1=p[2]&0x01;
p[2]>>=1;
  p[2]=p[2]&0x7f;
  p[2]=p[2]|(k2<<7);
k2=p[3]&0x01;
p[3]>>=1;
  p[3]=p[3]&0x7f;
  p[3]=p[3]|(k1<<3);
p[0]=p[0]|(k2<<7);
}
}

void descode(unsigned char *text)
{
int i,j;
unsigned char high[4],low[4],temp[4];
unsigned char a48[6],b48[6];
init_transform(text);
for(i=0;i<4;i++)
{
high[3-i]=text[i];
low[3-i]=text[4+i];
temp[3-i]=text[4+i];
}
for(i=0;i<16;i++)
{
select3(low,a48);
mod2add(a48,key48[i],6);
select4(a48,low);
mod2add(low,high,4);
for(j=0;j<4;j++)
{
high[j]=temp[j];
temp[j]=low[j];
}
}
for(i=0;i<4;i++)
{
text[i]=high[3-i];
text[4+i]=low[3-i];
}
uninit_transform(text);
}

void desdecode(unsigned char *text)
{
int i,j;
unsigned char high[4],low[4],temp[4];
unsigned char a48[6],b48[6];
init_transform(text);
for(i=0;i<4;i++)
{
high[3-i]=text[i];
low[3-i]=text[4+i];
temp[3-i]=text[i];
}

for(i=0;i<16;i++)
{
select3(high,a48);
mod2add(a48,key48[15-i],6);
select4(a48,high);
mod2add(high,low,4);
for(j=0;j<4;j++)
{
low[j]=temp[j];
temp[j]=high[j];
}
}
for(i=0;i<4;i++)
{
text[i]=high[3-i];
text[4+i]=low[3-i];
}
uninit_transform(text);
}



--
※ 修改:.sonicln 于 May 15 11:02:11 修改本文.[FROM: 202.96.53.231]
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.53.231]

[关闭][返回]