⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udes.c

📁 DES算法实现程序,可用于DOS、WINDOWS、UNIX、LINUX等各平台。
💻 C
字号:
/****************************************/
/*PROGRAM:udes.C                        */
/*        DES function on UNIX          */
/*By Dongshifang                        */
/****************************************/
#include<stdio.h>
#include<malloc.h>
#include<time.h>
#include<string.h>
#include <signal.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/termio.h>

typedef unsigned char uchar;
//typedef unsigned short ushort;

void endes(uchar src[8],uchar pwd[8],uchar cipher[8]);
void undes(uchar cipher[8],uchar pwd[8],uchar src[8]);

void generate_key(uchar inkey[8],uchar outkey[17][6]);
void fun_encode(uchar a[4],uchar k[6],uchar outstr[4]);
void x_matrix(uchar *instr,const uchar *index,uchar *outstr,uchar outstr_bits);

const uchar index_org1[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
	  };
const uchar index_org2[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
		};
const uchar index_org3[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
	 };
const uchar index_org4[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
	  };
const uchar tab_org[8][64]=
	 {
		{//1
		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,
		 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
		},
		{//2
		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
		},
		{//3
		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
		},
		{//4
		 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
		},
		{//5
		 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,
		 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
		},
		{//6
		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
		},
		{//7
		 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
		},
		{//8
		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
		}
	 };
const uchar index_key11[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
	 };
const uchar index_key12[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
	 };
const uchar index_key20[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
	 };
const uchar index_rotate[16]=
	 {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

void endes(uchar src[8],uchar pwd[8],uchar cipher[8])
{
uchar  xstr[8],i,j;
uchar org[17][8],key[17][6];

  //1:Gen 16 KEY
  generate_key(pwd,key);

  //2:org replace
  x_matrix(src,index_org1,org[0],64);

  for(i=0;i<16;i++)
  {
  //3:Gen next org left
  memmove(org[i+1],org[i]+4,4);

  //4:call encode function
  fun_encode(org[i]+4,key[i+1],xstr);

  //5:XOR ,form Last org[i+1] right
  for(j=0;j<4;j++)
	org[i+1][j+4]=xstr[j]^org[i][j];
	}//for(i)

  //6:exchange org left and right
  memcpy(xstr,org[16]+4,4);
  memcpy(xstr+4,org[16],4);

  //7:displace cipher
  x_matrix(xstr,index_org2,cipher,64);
}

void undes(uchar cipher[8],uchar pwd[8],uchar src[8])
{
uchar xstr[8],j;
char i;
uchar org[17][8],key[17][6];

  //1:Gen 16 KEY
  generate_key(pwd,key);

  //2:org displace
  x_matrix(cipher,index_org1,org[16],64);

  //3:exchange org left and right
  memcpy(xstr,org[16]+4,4);
  memcpy(xstr+4,org[16],4);
  memcpy(org[16],xstr,8);

  for(i=15;i>=0;i--)
  {
  //4:Gen last org right
  memcpy(org[i]+4,org[i+1],4);

  //5:call encode function
  fun_encode(org[i+1],key[i+1],xstr);

  //6:XOR ,form Last org[i] left
  for(j=0;j<4;j++)
   org[i][j]=xstr[j]^org[i+1][j+4];
  }//for(i)

  //replace cipher
  x_matrix(org[0],index_org2,src,64);
}

void fun_encode(uchar a[4],uchar k[6],uchar outstr[4])
{
uchar m,n,cc,j,xstr[8],resp[8];
ushort tmpu;

  //1:org select,from 32 bits to 48 bits
  x_matrix(a,index_org3,xstr,48);

	//2:XOR org and k
  for(j=0;j<6;j++)
	 resp[j]=xstr[j]^k[j];

  //3:last select,from 48 bits to 32 bits
  for(j=0;j<8;j++)
    {
    //get 6 bits from 48 bits resp
	 tmpu=(ushort)(resp[j*6/8]<<8)+resp[j*6/8+1];
    xstr[j]=(tmpu<<(j*6%8))>>8;
	 }

  for(j=0;j<8;j++)
    {
    cc=xstr[j];
    //fetch VALUE from tab_org
    m=((cc>>6)&0x02)+((cc>>2)&0x01);
    n=(cc>>3)&0x0f;
    cc=m*16+n;
    xstr[j]=tab_org[j][cc];
    }//for(j)

  //4:form 32 bits outstr--32 bits
  for(j=0;j<4;j++)
	resp[j]=(xstr[2*j]<<4)+(xstr[2*j+1]&0x0f);

  //5:replace org right
  x_matrix(resp,index_org4,outstr,32);
}

void generate_key(uchar inkey[8],uchar outkey[17][6])
{
uchar resp[8],xstr[6],c[17][4],d[17][4],i,cc;
long tmpl;

	//shift key
  memcpy(resp,inkey,8);
  /*
  for(i=0;i<8;i++)
	  {
	  for(j=1,m=0;j<8;j++)
		 if((inkey[i]>>(j-1))&0x01)m++;
	  resp[i]=(inkey[i]<<1)+m%2;
	  }
	*/

	//1:select 28 bits--c[i]
	x_matrix(resp,index_key11,c[0],28);
	//2:select 28 bits--d[i]
	x_matrix(resp,index_key12,d[0],28);

  for(i=0;i<16;i++)
	{
	//3:rotate c[i] and d[i]
	  tmpl=((long)c[i][0]<<24)+((long)c[i][1]<<16)
	 +((long)c[i][2]<< 8)+ (long)(c[i][3]&0xf0);
	  tmpl<<=index_rotate[i];
	  c[i+1][1]=tmpl>>16;
	  c[i+1][2]=tmpl>> 8;
	  c[i+1][3]=tmpl&0xf0;
	  c[i+1][0]=tmpl>>24;

	  tmpl=((long)d[i][0]<<24)+((long)d[i][1]<<16)
	 +((long)d[i][2]<< 8)+ (long)(d[i][3]&0xf0);
	  tmpl<<=index_rotate[i];
	  d[i+1][1]=tmpl>>16;
	  d[i+1][2]=tmpl>> 8;
	  d[i+1][3]=tmpl&0xf0;
	  d[i+1][0]=tmpl>>24;
	  c[i+1][3]|=(c[i][0]>>(8-index_rotate[i]))<<4;
	  d[i+1][3]|=(d[i][0]>>(8-index_rotate[i]))<<4;

	//4:form 56 bits--resp
	memcpy(resp,c[i+1],3);
	resp[3]=(c[i+1][3]&0xf0)+(d[i+1][0]>>4);
	resp[4]=(d[i+1][0]<<4)+(d[i+1][1]>>4);
	resp[5]=(d[i+1][1]<<4)+(d[i+1][2]>>4);
	resp[6]=(d[i+1][2]<<4)+(d[i+1][3]>>4);

	//5:select 48 bits key[i]
	x_matrix(resp,index_key20,xstr,48);
	memcpy(outkey[i+1],xstr,6);
	}//for(i)
}

void x_matrix(uchar *instr,const uchar *index,uchar *outstr,uchar outstr_bits)
{
uchar i,cc;

 if(outstr_bits%8)
  memset(outstr,0x00,outstr_bits/8+1);
 else
   memset(outstr,0x00,outstr_bits/8);

 for(i=0;i<outstr_bits;i++)
   {
   cc=instr[(index[i]-1)/8] << (index[i]-1)%8;
   cc&=0x80;
   if(cc)
     outstr[i/8]+=cc >> i%8;
   }//for
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -