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

📄 des.c

📁 C51下DES的另一种算法,可以进行计算DES.
💻 C
字号:
/*--------------------------------------------------------------------------------
DES.C: DES Algorithm Program 
--------------------------------------------------------------------------------*/
#include <string.h>
#define BYTE unsigned char 
#define bool unsigned char
static code BYTE initialtr[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 };
static code BYTE keytr1[56]   ={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,
						   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 };
static code BYTE rots[16]     ={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
static code BYTE keytr2[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 };
static code BYTE etr[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 };
static code BYTE s[8][64] ={{ 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 },
						{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 },
						{ 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 },
						{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 }};
static code BYTE ptr[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};
static code BYTE swap[64]   ={33,34,35,36,37,38,39,40,
						 41,42,43,44,45,46,47,48,
						 49,50,51,52,53,54,55,56,
						 57,58,59,60,61,62,63,64,
						  1, 2, 3, 4, 5, 6, 7, 8,
						  9,10,11,12,13,14,15,16,
						 17,18,19,20,21,22,23,24,
						 25,26,27,28,29,30,31,32};

static code BYTE finaltr[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 };

void increase(BYTE *text1, bool *plainttext1)
{
  BYTE i,j,b;
  for(i=0;i<=7;i++)
  {
	b=text1[i];
    for(j=(i*8);j<=(i*8)+7;j++)
	{
      plainttext1[j]=(b>=0x80);
	  b=b<<1;
	}
  }
}

void transpose(bool *_data, BYTE* t,BYTE n)
{
  BYTE i;
  bool x[64];

  memcpy(x,_data,64);
  for(i=0;i<n;i++)
	_data[i]=x[t[i]-1];
}
void Rotate_left_cycle(bool* keyr)
{
	bool temp;
	BYTE i;

	temp=keyr[0];
	for(i=0;i<55;i++)
	  keyr[i]=keyr[i+1];
	keyr[55]=keyr[27];
    keyr[27]=temp;
}

void DESsubkey(BYTE* key, bool keylistm[16][56])
{
  BYTE i,n;
  bool key0[64];

  increase(key,key0);
  transpose(key0,keytr1,56);
  for(i=0;i<16;i++)
  {
    for(n=0;n<rots[i];n++)
	  Rotate_left_cycle(key0);
	memcpy(keylistm[i], key0, 56);
	transpose(keylistm[i], keytr2, 48);
  }
}
void f(bool* R, bool* subkey)
{
	BYTE i,j,k, p,temp;
	transpose(R,etr,48);         // expand
    for(i=0;i<48;i++)
      R[i]^=subkey[i];			 //XOR
	for(k=0;k<8;k++)
	{
      p=(32*R[6*k]+16*R[6*k+5]+8*R[6*k+1]+4*R[6*k+2]+2*R[6*k+3]+R[6*k+4]);
	  temp=s[k][p];
	  for(j=0;j<4;j++)
	  {
        R[4*k+j]=(temp>=0x08);
        temp=(temp<<1)&0x0f;
      }
	}
	transpose(R,ptr,32);
}
void press(bool *dt1,BYTE *dt2)
{
  BYTE a,i,j;
  for(j=0;j<8;j++)
  {
    a=0;
	for(i=8*j;i<8*j+8; i++)
	{
      a=a<<1;
	  a=a+dt1[i];
	 }
	 dt2[j]=a;
  }
}

void DESBasic(bool tp, bool subkey[16][56], BYTE *dest, BYTE *sour)
{
  bool sour0[80],tmpgrp[32];//sour0; 32+48
  BYTE i,j;

  increase(sour,sour0);
  transpose(sour0,initialtr,64);

  for (i=0;i<16;i++)
  {
    for(j=0;j<32;j++)
      tmpgrp[j]=sour0[32+j];
	if(!tp)
      f(&sour0[32], subkey[i]);
	else
      f(&sour0[32], subkey[15-i]);
    for(j=0;j<32;j++)
	{
      sour0[j]=sour0[j]^sour0[32+j];//XOR
	  sour0[32+j]=tmpgrp[j];
	}
	if(i<15)
	  transpose(sour0,swap,64);
  }
  transpose(sour0,finaltr,64);
  press(sour0,dest);
}

void DESencrypt(BYTE *key,BYTE *dest,BYTE *sour)
{
  bool subkey[16][56];

  DESsubkey(key,subkey);
  DESBasic(0, subkey, dest, sour);
}
void DESdecrypt(BYTE *key,BYTE *dest,BYTE *sour)
{
  bool subkey[16][56];

  DESsubkey(key,subkey);
  DESBasic(1, subkey, dest, sour);
}
void TripDESencrypt(BYTE *key,BYTE *dest,BYTE *sour)
{
  DESencrypt(key,dest,sour);
  DESdecrypt(key+8,dest,dest);
  DESencrypt(key,dest,dest);
}
void TripDESdecrypt(BYTE *key,BYTE *dest,BYTE *sour)
{
  DESdecrypt(key,dest,sour);
  DESencrypt(key+8,dest,dest);
  DESdecrypt(key,dest,dest);
}
void main(void)
{
  char key[8] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
//  char key2[16]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xe7};
//  char key3[8]={0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};
  char sour[8] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
  char dest[8];//={0xA2,0xD9,0x39,0x16,0x5D,0x26,0xA4,0xCA};

  DESencrypt(key,dest,sour);
  while (1);
}


⌨️ 快捷键说明

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