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

📄 templetdlg.cpp

📁 des的实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			
			//初始置换IP,结果放入plain_dup中
			for(int k=0;k<64;k++)
				Set(plain_dup,i,k,Get(plain,i,IP[k]-1,8),8);//Set函数将plain_dup的第i行第k个元素赋值为Get(plain,IP[k]),而Get函数返回plain的第i行第IP[K]个元素
			//初始化R,L
			for(n=0;n<4;n++)		
			{
				L[n]=plain_dup[i*radix+n];				
				R[n]=plain_dup[i*radix+n+4];				
			}
			
			//16轮加密
			encoding(L,R,K,i);
			//将L,R组合后放入cipher_dup中
			
			for(n=0;n<4;n++)
			{
				cipher_dup[n]=R[n];
				cipher_dup[n+4]=L[n];
			}
			
			//逆初始置换
			for(n=0;n<64;n++)
				Set(cipher,i,n,Get(cipher_dup,0,IPR[n]-1,8),8);		
		}
		m_cipher=_T("");
		for(i=0;i<len_virtual*radix*radix;i++)
		{
			m_cipher+=char(48+Get(cipher,0,i,8));
			if(i%8==7)
				m_cipher+=" ";
		}
		delete []plain;
		delete []plain_dup;
		delete []cipher;
	}
	UpdateData(false);
}

void CTempletDlg::OnButtonDecrypt() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	mode_flag=false;
	
	int len=m_cipher.GetLength()/9;
	int len_virtual;
	len_virtual=len/8;
	//cipher和cipher_dup都用于存放明文
	char *cipher=new char[len_virtual*radix+1];
	char *cipher_dup=new char[len_virtual*radix];
	//cipher用于存放密文
	char *plain=new char[len_virtual*radix+1];
	plain[len_virtual*radix]='\0';
	
	if(cipher_dup==NULL || plain==NULL||cipher==NULL)
	{
		MessageBox("内存分配失败!");
		return;
	}
	else
	{
		char temp_key[9];
		char plain_dup[8];
		char key[8];
		char C[4];
		char D[4];
		char K[16*6];
		char L[4];
		char R[4];
		int i=0;
		int n=0;
		int k=0;
		len=m_key.GetLength();
		if(len!=8)//用' '填充m_key至64bit
		{
			len=8-len;
			for(i=0;i<len;i++)
				m_key+=" ";
		}
		//从m_key中获得密钥放入temp_key中
		strcpy(temp_key,(LPCTSTR)m_key);
		//置换PC-1,结果放入key中
		for(k=0;k<56;k++)
			Set(key,0,k,Get(temp_key,0,PC1[k]-1,8),8);
		//将key分为C,D两部分
		for(k=0;k<4;k++)
		{
			C[k]=key[k];
			D[k]=key[k+3];
		}
		//正式生成子密钥,放入K中
		produce_key(C,D,K);
		//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>		
		//从m_cipher中获得密文放入cipher中
		for(i=0;i<len_virtual*radix;i++)
			cipher[i]=(m_cipher.GetAt(i*(radix+1))-48)*128+(m_cipher.GetAt(i*(radix+1)+1)-48)*64
			+(m_cipher.GetAt(i*(radix+1)+2)-48)*32+(m_cipher.GetAt(i*(radix+1)+3)-48)*16
			+(m_cipher.GetAt(i*(radix+1)+4)-48)*8+(m_cipher.GetAt(i*(radix+1)+5)-48)*4
			+(m_cipher.GetAt(i*(radix+1)+6)-48)*2+m_cipher.GetAt(i*(radix+1)+7)-48;
		for(i=0;i<len_virtual;i++)
		{
			
			//初始置换IP,结果放入cipher_dup中
			for(int k=0;k<64;k++)
				Set(cipher_dup,i,k,Get(cipher,i,IP[k]-1,8),8);//Set函数将cipher_dup的第i行第k个元素赋值为Get(plain,IP[k]),而Get函数返回plain的第i行第IP[K]个元素
			//初始化R,L
			for(n=0;n<4;n++)		
			{
				L[n]=cipher_dup[i*radix+n];				
				R[n]=cipher_dup[i*radix+n+4];				
			}
			
			//16轮加密
			encoding(L,R,K,i);
			//将L,R组合后放入cipher_dup中
			
			for(n=0;n<4;n++)
			{
				plain_dup[n]=R[n];
				plain_dup[n+4]=L[n];
			}
			
			//逆初始置换
			for(n=0;n<64;n++)
				Set(plain,i,n,Get(plain_dup,0,IPR[n]-1,8),8);		
		}
		m_plaindup.Format("%s",plain);
		delete []plain;
		delete []cipher_dup;
		delete []cipher;
	}
	UpdateData(false);	
}

void CTempletDlg::OnButtonProduce() 
{
	// TODO: Add your control notification handler code here
	m_key.Format("%s","");
	srand( (unsigned)time( NULL ) );
	for(int i=0;i<8;i++)
		m_key+=char('A')+rand()%26;
	UpdateData(false);
}

void CTempletDlg::Set(char data[],int i,int k,int x,int rad)
{
	int m=k/radix;
	int n=k%radix;
	char temp;
	if(x==1)
	{
		switch(n){
		case 0:
			temp=char(0x80);
			break;
		case 1:
			temp=char(0x40);
			break;
		case 2:
			temp=char(0x20);
			break;
		case 3:
			temp=char(0x10);
			break;
		case 4:
			temp=char(0x08);
			break;
		case 5:
			temp=char(0x04);
			break;
		case 6:
			temp=char(0x02);
			break;
		case 7:
			temp=char(0x01);
			break;
		}
		data[i*rad+m]|=temp;
	}
	else
	{
		switch(n){
		case 0:
			temp=char(0x7F);
			break;
		case 1:
			temp=char(0xBF);
			break;
		case 2:
			temp=char(0xDF);
			break;
		case 3:
			temp=char(0xEF);
			break;
		case 4:
			temp=char(0xF7);
			break;
		case 5:
			temp=char(0xFB);
			break;
		case 6:
			temp=char(0xFD);
			break;
		case 7:
			temp=char(0xFE);
			break;
		}
		data[i*rad+m]&=temp;
	}
}
int CTempletDlg::Get(char data[],int i,int k,int rad)
{
	int m=k/radix;
	int n=k%radix;
	int y;
	char temp;
	char ch_temp=data[i*rad+m];
	switch(n){
	case 0:
		temp=char(0x80);
		break;
	case 1:
		temp=char(0x40);
		break;
	case 2:
		temp=char(0x20);
		break;
	case 3:
		temp=char(0x10);
		break;
	case 4:
		temp=char(0x08);
		break;
	case 5:
		temp=char(0x04);
		break;
	case 6:
		temp=char(0x02);
		break;
	case 7:
		temp=char(0x01);
		break;
	}
	y=int(ch_temp&temp);
	if(y==0)
		return 0;
	else 
		return 1;
}
void CTempletDlg:: produce_key(char C[],char D[],char K[])
{
	char temp_key[7];
	char temp_C[4];
	char temp_D[4];
	for(int k=0;k<16;k++)
	{
		
		C[3]&=0xF0;
		D[0]&=0x0F;
		for(int n=0;n<4;n++)
		{
			temp_C[n]=C[n];
			temp_D[n]=D[n];
		}
		//分别对C、D进行循环移位
		if(LOOP[k]==1)
		{
			C[0]= temp_C[0]<<1 |	((temp_C[1]>>7)&0x01);
			C[1]= temp_C[1]<<1 |	((temp_C[2]>>7)&0x01);
			C[2]= temp_C[2]<<1 |	((temp_C[3]>>7)&0x01);
			C[3]= temp_C[3]<<1 |	((temp_C[0]>>7)&0x01)<<4;
			
			D[0]=(temp_D[0]<<1 |	((temp_D[1]>>7)&0x01))&0x0F;
			D[1]= temp_D[1]<<1 |    ((temp_D[2]>>7)&0x01);
			D[2]= temp_D[2]<<1 |    ((temp_D[3]>>7)&0x01);
			D[3]= temp_D[3]<<1 |	((temp_D[0]>>3)&0x01);
		}
		else
		{
			C[0]= temp_C[0]<<2 |	((temp_C[1]>>6)&0x03);
			C[1]= temp_C[1]<<2 |	((temp_C[2]>>6)&0x03);
			C[2]= temp_C[2]<<2 |	((temp_C[3]>>6)&0x03);
			C[3]= temp_C[3]<<2 |	((temp_C[0]>>6)&0x03)<<4;
			
			D[0]=(temp_D[0]<<2 |	((temp_D[1]>>6)&0x03))&0x0F;
			D[1]= temp_D[1]<<2 |    ((temp_D[2]>>6)&0x03);
			D[2]= temp_D[2]<<2 |    ((temp_D[3]>>6)&0x03);
			D[3]= temp_D[3]<<2 |	((temp_D[0]>>2)&0x03);
		}
		//将C、D组合成temp_key
		for(n=0;n<7;n++)
		{
			if(n<3)
				temp_key[n]=C[n];
			else 
				if(n==3)
					temp_key[n]=C[n]|D[0];
				else
					temp_key[n]=D[n-3]; 
		}
		//进行PC2变换	
		for(n=0;n<48;n++)
			Set(K,k,n,Get(temp_key,0,PC2[n]-1,8),6);
	}
}
void CTempletDlg:: encoding(char L[],char R[],char K[],int i)
{
	char temp_E[6];
	char temp[4];
	for(int j=0;j<16;j++)				
	{
		for(int n=0;n<4;n++)
			temp[n]=R[n];
		//扩展运算E					
		for(n=0;n<48;n++)
			Set(temp_E,0,n,Get(R,0,E[n]-1,8),8);					
		//与密钥做异或运算					
		for(n=0;n<6;n++)
			if(mode_flag)
				temp_E[n]^=K[j*6+n];
			else temp_E[n]^=K[(15-j)*6+n];
			//对temp_E做代换S				
			int coordinate[8][2]; 
			char temp_E6[8];
			for(n=0;n<2;n++)
			{
				temp_E6[4*n]=(temp_E[0+3*n]>>2)&0x3F;
				temp_E6[4*n+1]=(temp_E[1+3*n]>>4)&0x0F|((temp_E[0+3*n]<<6)>>2)&0x3F;
				temp_E6[4*n+2]=(temp_E[2+3*n]>>6)&0x03|((temp_E[1+3*n]<<4)>>2)&0x3F;
				temp_E6[4*n+3]=temp_E[2+3*n]&0x3F;
			}
			for(n=0;n<8;n++)
			{
				coordinate[n][0]=Get(temp_E6,0,n*8+2,8)*2+Get(temp_E6,0,n*8+7,8);
				coordinate[n][1]=Get(temp_E6,0,n*8+3,8)*8+Get(temp_E6,0,n*8+4,8)*4+Get(temp_E6,0,n*8+5,8)*2+Get(temp_E6,0,n*8+6,8);
			}
			char temp_R[4];
			for(n=0;n<4;n++)
				temp_E[n]=S[2*n][coordinate[2*n][0]][coordinate[2*n][1]]*16+S[2*n+1][coordinate[2*n+1][0]][coordinate[2*n+1][1]];
			//P置换				
			for(n=0;n<32;n++)
				Set(temp_R,0,n,Get(temp_E,0,P[n]-1,8),8);
			for(n=0;n<4;n++)
				temp_R[n]^=L[n];
			for(n=0;n<4;n++)
			{
				L[n]=R[n];
				R[n]=temp_R[n];
			}
	}
	
}

⌨️ 快捷键说明

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