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

📄 des.cpp

📁 本软件基于可视化软件开发平台进行程序开发
💻 CPP
字号:
// des.cpp: implementation of the des class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MyDes.h"
#include <string.h>

#include "des.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define BLOCK_LENGTH 8	///定义块大小
#define SUCCESS 100
#define DESENCRY 0
#define DESDECRY 1

u32 g_outkey[16][2] = {0};/*输出的key*/
u32 g_bufkey[2] = {0};/*形成起始密钥*/

/*实现时多采用查表方式,下面是定义的供查找用的表*/ 
static u8 wz_lefttable[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
static u32 wz_leftandtab[3] = {0x0 , 0x80000000 , 0xc0000000 } ;
static u8 wz_keyleft[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
};

static u8 wz_keyright[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
};

static u8 wz_keychoose[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 u8 wz_pc4[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
};
static u8  wz_pc1[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 u8 wz_pc3[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 u32  wz_pc2[64] = { 
0x80000000L,0x40000000L,0x20000000L,0x10000000L, 0x8000000L, 
0x4000000L, 0x2000000L, 0x1000000L, 0x800000L, 0x400000L,
0x200000L, 0x100000L,  0x80000L, 0x40000L, 0x20000L,0x10000L, 
0x8000L, 0x4000L, 0x2000L, 0x1000L, 0x800L, 0x400L, 0x200L,
0x100L, 0x80L,0x40L,0x20L, 0x10L, 0x8L, 0x4L, 0x2L, 0x1L,
0x80000000L,0x40000000L,0x20000000L,0x10000000L, 0x8000000L,
0x4000000L, 0x2000000L, 0x1000000L, 0x800000L, 0x400000L,
0x200000L, 0x100000L,  0x80000L, 0x40000L, 0x20000L, 0x10000L, 
0x8000L, 0x4000L, 0x2000L, 0x1000L, 0x800L, 0x400L, 0x200L, 
0x100L, 0x80L, 0x40L,0x20L, 0x10L, 0x8L,  0x4L, 0x2L, 0x1L,     
}; 
   
static u8 exptab3[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 u8 SP[8][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  
},

{ 
	0xf,0x3,0x1,0xd,0x8,0x4,0xe,0x7,0x6,0xf,0xb,0x2,0x3,
	0x8,0x4,0xf,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
},
{ 
	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  
},
{ 
	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,0xa,0x7,0xd,0xd,0x8,0xf,0x9,0x1,0x4,
	0x3,0x5,0xe,0xb,0x5,0xc,0x2,0x7,0x8,0x2,0x4,0xe 
},
{ 
	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
},
{ 
	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
},
{ 
	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
},
{ 
	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
} 
};

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

DES::DES()
{

}

DES::~DES()
{

}
///////////////////////////////////////////////////////////////////////////////
//*GetCipher(CString plainText,CString key)
//*初始化明文,密钥等;明文分块,返回组合密文
///////////////////////////////////////////////////////////////////////////////
CString DES::GetCipher(CString plainText,CString key)
{

	int pLen=plainText.GetLength();
	u8 *datas=new u8[pLen];
	datas=(u8*)plainText.GetBuffer(pLen);		//设置明文数组
	//int8 *cipherText=new int8[pLen];		//设置密文数组
	CString returnStr="";
	int kLen=key.GetLength();
	u8 *keys=new u8[kLen];
	keys=(u8*)key.GetBuffer(kLen);
	int times=pLen/BLOCK_LENGTH;
	u8 *data=new u8[BLOCK_LENGTH+1];
	for(int j=0;j<times;j++)
	{
		for(int i=0;i<BLOCK_LENGTH;i++)
			data[i]=datas[i+j*BLOCK_LENGTH];
		data[i]='\0';
		des(data,keys,BLOCK_LENGTH);
		CString temp(data);
		returnStr+=temp;
	}
	int len=pLen%BLOCK_LENGTH;
	for(int i=0;i<len;i++)
		data[i]=datas[i+j*BLOCK_LENGTH];
	data[i]='\0';
	des(data,keys,len);
	CString temp(data);
	returnStr+=temp;
	//delete []datas;
	//delete []data;
	//delete []keys;
	/*
	for(int i=0;i<8;i++)
		mainKey[i]=key[i];//取得密钥摘要

	int times=pLen/BLOCK_LENGTH;//取得明文所分块数

	int8 plainBlock[BLOCK_LENGTH];///明文块定义
	int8 *cipherBlock=new int8[BLOCK_LENGTH];///密文块定义
	for(i=0;i<times;i++)//明文块循环
	{
		for(int ii=0;ii<BLOCK_LENGTH;ii++)
			plainBlock[ii]=plainText[ii+i*BLOCK_LENGTH];//取明文块

		///getBlockCipher(plainBlock,cipherText);
		//getBlockCipher(plainBlock,cipherText);//获得加密后密文


		for(ii=0;ii<BLOCK_LENGTH;ii++)
			cipherText[ii+i*BLOCK_LENGTH]=cipherBlock[ii];//保存密文块
	}
	//善后工作
	delete []cipherText;
	delete []cipherBlock;*/

	return returnStr;
}
CString DES::GetPlain(CString cipherText,CString key)
{
	int pLen=cipherText.GetLength();
	u8 *datas=new u8[pLen];
	datas=(u8*)cipherText.GetBuffer(pLen);		//设置明文数组
	//int8 *cipherText=new int8[pLen];		//设置密文数组
	CString returnStr="";
	int kLen=key.GetLength();
	u8 *keys=new u8[kLen];
	keys=(u8*)key.GetBuffer(kLen);
	int times=pLen/BLOCK_LENGTH;
	u8 *data=new u8[BLOCK_LENGTH+1];
	for(int j=0;j<times;j++)
	{
		for(int i=0;i<BLOCK_LENGTH;i++)
			data[i]=datas[i+j*BLOCK_LENGTH];
		data[i]='\0';
		Ddes(data,keys,BLOCK_LENGTH);
		CString temp(data);
		returnStr+=temp;
	}
	int len=pLen%BLOCK_LENGTH;
	for(int i=0;i<len;i++)
		data[i]=datas[i+j*BLOCK_LENGTH];
	data[i]='\0';
	Ddes(data,keys,len);
	CString temp(data);
	returnStr+=temp;

	//delete []datas;
	//delete []data;
	//delete []keys;

	return returnStr;
}
///////////////////////////////////////////////////////////////////////////////
//*getBlockCipher(int8* plainBlock,int8* cipherBlock)
//*明文块加密
///////////////////////////////////////////////////////////////////////////////
void DES::getBlockCipher(int8* plainBlock,int8* cipherBlock)
{
	int8 *key=new int8[BLOCK_LENGTH];//密钥
	getKey(key);

	//善后工作
	delete []key;
	return ;
}

void DES::getKey(int8* key)
{
	return ;
}

int32 DES::DdesN(u8 *data, u8 **key, u32 n_key,u32 readlen)
{
	int32 i ;
	for ( i = n_key ; i > 0 ; i--)
	{
		Ddes(data,key[i-1],readlen);
	}
	return SUCCESS;
}

int32 DES::desN(u8 *data, u8 **key, u32 n_key,u32 readlen)
{
	u32 i = 0;
	for ( i = 0 ; i < n_key ; i++)
	{
		des(data,key[i],readlen);
	}
	return SUCCESS;
}

int32 DES::des3(u8 *data, u8 *key,u32 n ,u32 readlen)
{
	u32 i = 0 , j = 0 ;
	makefirstkey((u32*)key) ;  /*产生密钥*/
	for ( i = 0 ; i < n ; i++)
	{
		for ( j = 0 ; j < readlen ; j += 8)
		{
		 handle_data( (u32*)&data[j], DESENCRY );
		}
	}
	return SUCCESS;
}

int32 DES::Ddes3(u8 *data,u8 *key,u32 n ,u32 readlen)
{
	u32 i = 0 , j = 0 ;
	makefirstkey((u32*)key) ;  /*产生密钥*/
	for ( i = 0 ; i < n ; i++)
	{
		for ( j = 0 ; j < readlen ; j += 8)
		{
		 handle_data( (u32*)&data[j], DESDECRY );
		}
	}
	return SUCCESS;
}

int32 DES::des(u8 *data, u8 *key,int32 readlen)
{
	int32 i = 0;   
	makefirstkey((u32*)key) ;  /*产生密钥*/
	for ( i = 0 ; i < readlen ; i += 8)
	{
		handle_data( (u32*)&data[i], DESENCRY );
	}
	return SUCCESS;
}

int32 DES::Ddes(u8 *data,u8 *key,int32 readlen)
{
	int32 i = 0;
	makefirstkey((u32*)key) ;  
	for ( i = 0 ; i < readlen ; i += 8)
	{
		handle_data( (u32*)&data[i] ,DESDECRY);
	}
	return SUCCESS;
}
int32 DES::handle_data(u32 *left , u8 choice)
{
	int32  number = 0 ,j = 0;   
	u32 *right = &left[1] ;
	u32 tmp = 0;
	u32 tmpbuf[2] = { 0 };     

	/*第一次调整wz_pc1[64]*/
	for ( j = 0 ; j < 64 ; j++)
	{
		if (j < 32 ) 
		{
		 if ( wz_pc1[j] > 32)/*属于right*/
		 {
		if ( *right&wz_pc2[wz_pc1[j]-1] )
		{
	   tmpbuf[0] |= wz_pc2[j] ;
		}
		 }
		 else
		 {
		if ( *left&wz_pc2[wz_pc1[j]-1] )
		{
	   tmpbuf[0] |= wz_pc2[j] ;
		}
		 }
		}
		else
		{
		 if ( wz_pc1[j] > 32)/*属于right*/
		 {
		if ( *right&wz_pc2[wz_pc1[j]-1] )
		{
	   tmpbuf[1] |= wz_pc2[j] ;
		}
		 }
		 else
		 {
		if ( *left&wz_pc2[wz_pc1[j]-1] )
		{
	   tmpbuf[1] |= wz_pc2[j] ;
		}
		 }
		}
	}
	*left  = tmpbuf[0] ;
	*right = tmpbuf[1];
	tmpbuf[0] = 0 ;
	tmpbuf[1] = 0 ;
		switch( choice )
	{
	case DESENCRY:
		for ( number = 0 ; number < 16 ; number++)
		{    
		 makedata( left , right , (u32)number) ;
		}
		break;
	case DESDECRY:
		 for ( number = 15 ; number >= 0 ; number--)
		 {    
		makedata( left , right ,(u32)number) ;
		 }
		break;
	default:
		break;
	}

	/*最后一轮操作不交换左右值*/

	tmp = *left ;
	*left = *right ;
	*right = tmp ;

	/*最后一次调整wz_pc4[64]*/

	for ( j = 0 ; j < 64 ; j++)
	{
		if (j < 32 ) 
		{
		 if ( wz_pc4[j] > 32)/*属于right*/
		 {
		if ( *right&wz_pc2[wz_pc4[j]-1] )
		{
	   tmpbuf[0] |= wz_pc2[j] ;
		}
		 }
		 else
		 {
		if ( *left&wz_pc2[wz_pc4[j]-1] )
		{
	   tmpbuf[0] |= wz_pc2[j] ;
		}
		 }
		}
		else
		{
		 if ( wz_pc4[j] > 32)/*属于right*/
		 {
		if ( *right&wz_pc2[wz_pc4[j]-1] )
		{
	   tmpbuf[1] |= wz_pc2[j] ;
		}
		 }
		 else
		 {
		if ( *left&wz_pc2[wz_pc4[j]-1] )
		{
	   tmpbuf[1] |= wz_pc2[j] ;
		}
		 }
		}
	}
  
	*left =  tmpbuf[0] ;
	*right = tmpbuf[1];

	return SUCCESS;
}


int32 DES::makedata(u32  *left ,u32  *right ,u32 number) 
{
	int32 j; 
	u32 oldright = *right; 
	u8 rexpbuf[8] = { 0} ;
	u32 datatmp = 0;
	u32 exp[2] = { 0} ; 
	//由32扩充至48位

	for ( j = 0 ; j < 48 ; j++)
	{
		/*两个32位,每个存放24位*/
		if ( j < 24 )
		{
		 if ( *right&wz_pc2[exptab3[j]-1] )
		 {
		exp[0] |= wz_pc2[j] ;
		 }    
		}    
		else
		{
		 if ( *right&wz_pc2[exptab3[j]-1] )
		 {
		exp[1] |= wz_pc2[j-24] ;
		 }
		}
	}

	for ( j = 0 ; j < 2 ; j++)
	{    
		exp[j] ^= g_outkey[number][j] ;
	}    

	/*由48->32*/	

	exp[1] >>= 8 ;
	rexpbuf[7] = (u8) (exp[1]&0x0000003fL) ;
	exp[1] >>= 6 ;
	rexpbuf[6] = (u8) (exp[1]&0x0000003fL) ;
	exp[1] >>= 6 ;
	rexpbuf[5] = (u8) (exp[1]&0x0000003fL) ;
	exp[1] >>= 6 ;
	rexpbuf[4] = (u8) (exp[1]&0x0000003fL) ;
	exp[0]  >>=  8 ;
	rexpbuf[3] = (u8) (exp[0]&0x0000003fL) ;     
	exp[0] >>= 6 ;
	rexpbuf[2] = (u8) (exp[0]&0x0000003fL) ;
	exp[0] >>= 6 ;
	rexpbuf[1] = (u8) (exp[0]&0x0000003fL) ;
	exp[0] >>= 6 ;
	rexpbuf[0] = (u8) (exp[0]&0x0000003fL) ;     
	exp[0] = 0 ;
	exp[1] = 0 ;

	/*由48-> 32*/

	*right = 0 ;
	for ( j = 0 ; j < 7 ; j++)
	{
		*right |= SP[j][rexpbuf[j]] ;
		*right <<= 4 ;
	}
	*right |= SP[j][rexpbuf[j]] ;

	/*又要换位了*/

	datatmp = 0;
	for ( j = 0 ; j < 32 ; j++)
	{
		if ( *right&wz_pc2[wz_pc3[j]-1] )
		{
		 datatmp |= wz_pc2[j] ;
		}
	}
	*right = datatmp ;

	/*一轮结束收尾操作*/

	*right ^= *left;
	*left = oldright;

	return SUCCESS;
}

int32 DES::makefirstkey( u32 *keyP )
{
u32 key[2] = {0};
u32 *Pkey ;
u32 *Pbufkey ;
int32 j; 
Pbufkey = (u32*)g_bufkey ;
Pkey = (u32*)key;
	
memset((u8*)g_bufkey,0,sizeof(g_bufkey));    
memcpy((u8*)&key,(u8*)keyP ,8) ;	
memset((u8*)g_outkey,0,sizeof(g_outkey));
for(  j = 0 ; j < 28 ; j++)
{
	if ( wz_keyleft[j] > 32 ) 
	{
     if ( Pkey[1]&wz_pc2[wz_keyleft[j]-1] )
     {
    Pbufkey[0] |= wz_pc2[j] ;
     }
	}
	else
	{
     if ( Pkey[0]&wz_pc2[wz_keyleft[j]-1] )
     {
    Pbufkey[0] |= wz_pc2[j] ;
     }
	}
	
	if ( wz_keyright[j] > 32 ) 
	{
     if ( Pkey[1]&wz_pc2[wz_keyright[j]-1] )
     {
    Pbufkey[1] |= wz_pc2[j];
     }
	}
	else
	{
     if ( Pkey[0]&wz_pc2[wz_keyright[j]-1] )
     {
    Pbufkey[1] |= wz_pc2[j];
     }
	}
}
for (j = 0 ; j < 16 ; j++)
{
	makekey(&Pbufkey[0],&Pbufkey[1] , j ) ;
}
return SUCCESS;
}


int32 DES::makekey(  u32 *keyleft,u32 *keyright ,u32 number)/*输入密钥的地址,一个32位的*/
{
	u32 tmpkey[2] ={0};
	u32 *Ptmpkey = (u32*)tmpkey;     
	u32 *Poutkey = (u32*)&g_outkey[number]; 
	int32 j;
	memset((u8*)tmpkey,0,sizeof(tmpkey));  
	/*要最高的一位或两位*/
	*Ptmpkey = *keyleft&wz_leftandtab[wz_lefttable[number]] ;   
	Ptmpkey[1] = *keyright&wz_leftandtab[wz_lefttable[number]] ;	
	if ( wz_lefttable[number] == 1)
	{
     *Ptmpkey >>= 27;
     Ptmpkey[1] >>= 27;
	}
	else
	{
     *Ptmpkey >>= 26;
     Ptmpkey[1] >>= 26;    
	}
	Ptmpkey[0] &= 0xfffffff0;
	Ptmpkey[1] &= 0xfffffff0;
	/*得到高位的值*/
	*keyleft <<= wz_lefttable[number] ;
	*keyright <<= wz_lefttable[number] ;
	*keyleft |= Ptmpkey[0] ;
	*keyright |= Ptmpkey[1] ;    
	Ptmpkey[0] = 0;
	Ptmpkey[1] = 0;
    
/*从56位中选出48位,3个16位*/
for ( j = 0 ; j < 48 ; j++)
{
	if ( j < 24 )
	{
		if ( *keyleft&wz_pc2[wz_keychoose[j]-1])
		{
			Poutkey[0] |= wz_pc2[j] ;
		}
	}    
	
	else /*j>=24*/
	{   
		if ( *keyright&wz_pc2[(wz_keychoose[j]-28)])
		{
			Poutkey[1] |= wz_pc2[j-24];
		}   
	}
}
return SUCCESS;
}

⌨️ 快捷键说明

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