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

📄 des.cpp

📁 DES加密程序 速度将就。。娃嘎嘎。。。 完整可运行的程序 有兴趣的加我qq 4964898
💻 CPP
字号:

#include "StdAfx.h"

#include ".\des.h"
// static initilize
//


const BYTE CDES::m_PermutedKey[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
 };

 const BYTE CDES::m_Permutedkey48[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 BYTE CDES::m_PermutedData[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 BYTE CDES::m_KeyShift[16]=
 {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
 const BYTE CDES::m_ExR48[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 BYTE CDES::m_CombPermutedData[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 BYTE CDES::m_PermutedInvert[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 BYTE CDES::m_SubstitutionBox[8][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},
			{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}
   
	 }
	
	};

CDES::CDES(void):
m_FilePath(_T("")),
m_FileType(_T(""))
{
	m_hWnd=NULL;
	m_OperateFile=new COperateFile();
     m_Key64=0;
	 m_Data=0;
	 m_Result=0;
	m_progress=0;
	m_difPro=0;
	for (int i=0;i<18;i++)
	{   m_Key48[17]=0;
		LDATA[17]=RDATA[17]=0;
	}
 }//end function

CDES::~CDES(void)
{
	delete m_OperateFile;
}
double CDES::GetProgress()
{
	return (double)m_progress/m_OperateFile->m_ReadNum;
}
inline BOOL CDES::Permuted(INT i,ULONGLONG& refData,BYTE* shift)
{
  if(i<=0) return false;
  ULONGLONG tmpP=0;
 
      for (int j=0;j<i;j++)
	  {
	      tmpP|=(((refData<<(shift[j]-1))&0X8000000000000000)>>j);
		 
	  }
  refData=tmpP;
     return true;

}

inline BOOL CDES::Permuted(INT i,ULONG& refData,BYTE* shift)
{
  if(i<=0) return false;
  ULONG tmpP=0x0;
      for (int j=0;j<i;j++)
	  {
		 
	      tmpP=tmpP&(((refData<<(shift[j]-1))&0x80000000)>>j);
	      
	  
	  }
  refData=tmpP;
     return true;

}
BOOL CDES::ProcessKey()
{

this->Permuted(56,(ULONGLONG&)m_Key64,(BYTE*)m_PermutedKey);
    register C28,D28,TMPC28,TMPD28;
      C28=D28=TMPC28=TMPD28=0;
	  
TMPC28=C28=(ULONG) ((m_Key64&0xfffffff000000000)>>32);
TMPD28=D28=(ULONG) ((m_Key64&0x0000000fffffff00)>>4);

for(int i=1;i<17;i++)
{
ULONGLONG CD56=0;
	TMPC28=(ULONG)(C28<<m_KeyShift[i-1]);
TMPD28=(ULONG)(D28<<m_KeyShift[i-1]);
ULONGLONG TMPC56=TMPC28;
ULONGLONG TMPD56=TMPD28;
CD56=(ULONGLONG) ((TMPC56<<32)|(TMPD56<<4));//left 56
Permuted(48,(ULONGLONG&)CD56,(BYTE*)m_Permutedkey48);
m_Key48[i]=CD56;

}
return TRUE;

}
BOOL CDES::ProcessData(BOOL DOE)
{

    this->Permuted(64,(ULONGLONG&)m_Data,(BYTE*)m_PermutedData);//Initial Permutation (IP)
	
	this->LDATA[0]=(ULONG)(m_Data>>32);
	this->RDATA[0]=(ULONG)m_Data;
    
	ULONGLONG ExR48,TMPB64;
	ExR48=TMPB64=0;
	BYTE B[8];
	
	INT M,N;
	 M=N=0;
	register DATA32=0;

	for(int k=0;k<8;k++)
		B[k]=0;
	for(int i=1;i<17;i++)
	{
     
	 ExR48=RDATA[i-1];
		ExR48=ExR48<<32;
    Permuted(48,(ULONGLONG&)ExR48,(BYTE*)m_ExR48);
	if(DOE)//加密或解密
    
	  TMPB64=ExR48^m_Key48[i];
	else   TMPB64=ExR48^m_Key48[17-i];
        B[0]=(BYTE)(TMPB64&0xFC00000000000000)>>56;
        B[1]=(BYTE)(TMPB64&0x03F0000000000000)>>52;
		B[2]=(BYTE)(TMPB64&0x000FC00000000000)>>44;
		B[3]=(BYTE)(TMPB64&0x00003F0000000000)>>40;
		B[4]=(BYTE)(TMPB64&0x000000FC00000000)>>32;
		B[5]=(BYTE)(TMPB64&0x00000003F0000000)>>28;
		B[6]=(BYTE)(TMPB64&0x000000000FC00000)>>20;
		B[7]=(BYTE)(TMPB64&0x00000000003F0000)>>16;
    
		for(int j=0;j<8;j++)
		{
          M=(BYTE)((B[j]&0x80)>>6)|(BYTE)((B[j]&0x04)>>2);//1,6
		  N=(BYTE) ((B[j]&0x78)>>3);//2-5
         B[j]=m_SubstitutionBox[j][M][N];
         register TMPB=B[j];
		 DATA32=DATA32|(TMPB<<(4*(7-j))) ;
		 Permuted(32,(ULONG&)DATA32,(BYTE*)m_CombPermutedData);

		}


	 
		
		RDATA[i]=DATA32^LDATA[i-1] ;
	        LDATA[i]=RDATA[i-1];
	
	
	
	}
	


      m_Result=RDATA[16];
	  m_Result=m_Result<<32;
	  m_Result=m_Result|LDATA[16];




 this->Permuted(64,(ULONGLONG&)m_Result,(BYTE*)m_PermutedInvert);

return true;
}
INT CDES::EncryptFile()
{

	if(m_OperateFile->OpenFile(this->m_FilePath,true,this->m_FileType)==-3)
               return -3;
	
	
	
			
                  this->m_Data=this->m_Key64; 

            this->ProcessKey();


	 
	  this->ProcessData(true);


		m_OperateFile->SetKey(this->m_Result);
		m_OperateFile->WriteFileHead();
	 
	 
	
		//处理密码 
m_progress=0;
INT result=0;
INT old=0;
INT now=0;
         while(true)
		 {	//处理实际数据 
			 result=m_OperateFile->ReadData(false);
			 if( result==0)
				 break;
	switch (result)
	{
	case 100000:
	         for(int i=0;i<100000;i++)
			 {
		this->m_Data=m_OperateFile->GetData(i);
	
   
		 this->ProcessData(true);



		 m_OperateFile->SetData(i,this->m_Result);
	   m_progress++;
	   now=this->GetProgress()*100;
if (now-old>=1)
{ 
	

	SendMessage(this->m_hWnd,WM_DEFINE_POS,1,0);
			 old=now;
m_difPro= m_progress;
}		
	   
	      
	
			 }
			
m_OperateFile->SaveDesFile(true,0,100000);
			 break;
	case 8:
		this->m_Data=m_OperateFile->GetData();
	
   
		 this->ProcessData(true);



		m_OperateFile->SetData(-1,this->m_Result);
	   m_progress++;
	m_OperateFile->SaveDesFile(true,0,0);
	   
	now=this->GetProgress()*100;
if (now-old>=1)
{
SendMessage(this->m_hWnd,WM_DEFINE_POS,0,0);
m_difPro= m_progress;
old=now;
}			    
	
	break;
	

	}

}

m_OperateFile->CloseFile(true);
	m_OperateFile->CloseFile(false);
	m_OperateFile->DeleteFile(this->m_FilePath);
	

return 0;
}
INT CDES::DecryptFile()
{
switch(m_OperateFile->OpenFile(this->m_FilePath,false,this->m_FileType))
{
		case 0:
			break;
			
		case -1:

			return -1;//文件格式不对
		case -3:
			return -3;//文件 打开错误 
}        





ULONGLONG tmpKey=this->m_Key64;
  this->ProcessKey();//生成key
if(m_OperateFile->ReadData(true)!=8)
{
	m_OperateFile->CloseFile(true);
	m_OperateFile->CloseFile(false);
	CFile::Remove(this->m_FilePath);
return -1;//文件不对
}
this->m_Data=m_OperateFile->GetData();//得到密码 密文 
	          ::TRACEHEX("key read",this->m_Data);
		this->ProcessData(false);//解密密码 
      

		if(this->m_Result!=tmpKey)
		{
			::TRACEHEX("key input",tmpKey);
			::TRACEHEX("key after de",this->m_Result);
			CString str=this->m_FilePath;
			str.Truncate(str.GetLength()-4);
			
         m_OperateFile->CloseFile(true);
	m_OperateFile->CloseFile(false);
	CFile::Remove(str);
		 	return -2;//密码错误
		}    
      
 m_progress=0;
 INT result=0;
 INT old=0;
 INT now=0;
			while(true)
	{  
		result=m_OperateFile->ReadData(false);
		if(result==0) break;
			switch(result)
			{
			case 100000:
		
	for(int i=0;i<100000;i++)
			 {
		this->m_Data=m_OperateFile->GetData(i);
	
   
		 this->ProcessData(false);



		 m_OperateFile->SetData(i,this->m_Result);
	   m_progress++;
	
	     now=this->GetProgress()*100;
if (now-old>=1)
{ 
SendMessage(this->m_hWnd,WM_DEFINE_POS,1,0);
old=now;			
m_difPro= m_progress;
} 
	      
	
			 }
			

			 m_OperateFile->SaveDesFile(false,0,100000);
			 break;
	case 8:
		this->m_Data=m_OperateFile->GetData();
	
   
		 this->ProcessData(false);



		m_OperateFile->SetData(-1,this->m_Result);
	   m_progress++;
	m_OperateFile->SaveDesFile(false,m_progress,0);
	now=this->GetProgress()*100;
if (now-old>=1)
{ 
SendMessage(this->m_hWnd,WM_DEFINE_POS,0,0);
	 old=now;		
m_difPro= m_progress;
}	      
	
	break;
	}
	}
	m_OperateFile->CloseFile(true);
	m_OperateFile->CloseFile(false);
	m_OperateFile->DeleteFile(this->m_FilePath);
return 0;


}

⌨️ 快捷键说明

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