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

📄 viewdlg.cpp

📁 这是一个用VC.Net编写的加密算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//密钥产生函数
void CViewDlg::code(int code_code[64],int K[][48],int C1[28],int C2[28])
{
	int C[28],D[28];
	int tempC = 0,tempD = 0;
	int Union[56];
	int i=0,j=0;
	for(i=0;i<28;i++)
	{
		C[i] = code_code[C1[i]-1];      // 两者的下标都是从1~64
		D[i] = code_code[C2[i]-1];      
	}
	for(i=0;i<16;i++)             
	{
		//实现循环移位
		for(j=0;j<W[i];j++)
		{
			tempC = C[0];
			tempD = D[0];
			for(int k=0;k<27;k++)
			{
				C[k] = C[k+1];
				D[k] = D[k+1];
			}
			C[27] = tempC;
			D[27] = tempD;
		}

		//将循环移位后的两个数组联合起来,进行置换选择2

		for(j=0;j<28;j++)
			Union[j] = C[j];
		for(j =28;j<56;j++)
			Union[j] = D[j-28];

		//进行置换选择2

		for(j=0;j<48;j++)
			K[i][j] = Union[IP2[j]-1];        //置换选择2数组的元素下标从1~56

	}
}

//加密操作

//在加密的过程中都是以64个字符串为一个变换单位进行的,所以读取到的字符必须以64个为一个处理单元

void CViewDlg::permute(int bin[64],int L[32],int R[32],int IP[64])
{
	for(int i=0;i<32;i++)
	{
		L[i]=bin[IP[i]-1];     //IP数组的下标是从1~64之间
		R[i]=bin[IP[32+i]-1];
	}
}

void CViewDlg::encrypt(int Result_IP[],int IP_athwart[],int K[][48],int E[],int R[],int L[],int S[][4][16])
{
	int In[48];         //记录经过选择运算E之后的数列
	int Mid[48];        //记录中间输入S盒的48位数列
	int Out[32];        //经过整个S盒之后产生的二进制数列
	int temp[4];        //经过每个S盒之后产生的二进制数列
	int Result[32];     //记录R与K加密后输出的32位加密结果
	int Result_mid[64]; //记录经过16次迭代之后的64位密文(未进行逆初始置换)
	int i=0,j=0;
	int L_Code[32];
	int R_Code[32];
	//	int Result_IP[64];  //记录最后的密文输出(已进行逆初始置换)

	//选择运算,产生48位的中间结果

	//进行迭代16次
	for(i=0;i<16;i++)       //进行15次迭代,因为最后一次的迭代的情况略有不同         
	{
		int count_s = 0;
		int count_o = 0;

		//48位中间结果与48位密钥进行模2加,得到48为输入数组
		for(j=0;j<48;j++)
		{

			Mid[j] = (R[E[j]-1]+K[i][j])%2;
		}

		//将48位数据输入到8个S盒中进行置换选择,得到32位的输出
		for(j=0;j<48;j=j+6)
		{
			int row = Mid[j]*2+Mid[j+5];
			int col = Mid[j+1]*8+Mid[j+2]*4+Mid[j+3]*2+Mid[j+4];
			int num = S[count_s++][row][col];      //得到对应的4位输出
			convert(temp,num);
			for(int k=0;k<4;k++)
			{
				Out[count_o] = temp[3-k];
				count_o++;
			}
		}

		for(j=0;j<32;j++)
		{
			L_Code[j]=L[j];
			R_Code[j]=R[j];
			L[j] = R[j];
			R[j] = (Out[P[j]-1] + L_Code[j]) % 2;   //迭代一次完成
		}
	}

	for(i=0;i<32;i++)
	{	
		Result_mid[i]=R[i];
		Result_mid[32+i] = L[i];
	}

	//进行逆初始置换,输出最后的64位明文
	for(i=0;i<64;i++)
		Result_IP[i] = Result_mid[IP_athwart[i]-1];

}

//解密操作

void CViewDlg::Unpermute(int bin[64],int L[32],int R[32])
{
	int temp[64];
	for(int i=0;i<64;i++)
		temp[i]=bin[i];
	for(i=0;i<64;i++)
		bin[IP_athwart[i]-1] = temp[i];
	for(i=0;i<32;i++)
		R[i]=bin[i];     //IP数组的下标是从1~64之间
	for(int j=32;j<64;j++)
		L[j-32]=bin[j];		
}
void CViewDlg::Unencrypt(int Result_IP[],int K[][48],int E[],int R[],int L[],int S[][4][16])
{
	int In[48];         //记录经过选择运算E之后的数列
	int Mid[48];        //记录中间输入S盒的48位数列
	int Out[32];        //经过整个S盒之后产生的二进制数列
	int temp[4];        //经过每个S盒之后产生的二进制数列
	int Result[32];     //记录R与K加密后输出的32位加密结果
	int Result_mid[64]; //记录经过16次迭代之后的64位密文(未进行逆初始置换)
	int i=0,j=0;
	int L_Code[32];
	int R_Code[32];
	//	int temp_last[64];
	//	int Result_IP[64];  //记录最后的密文输出(已进行逆初始置换)

	//选择运算,产生48位的中间结果

	//进行迭代16次
	for(i=0;i<16;i++)       //进行15次迭代,因为最后一次的迭代的情况略有不同         
	{
		int count_s = 0;
		int count_o = 0;

		for(j=0;j<48;j++)
			In[j] = L[E[j]-1];
		//48位中间结果与48位密钥进行模2加,得到48为输入数组
		for(j=0;j<48;j++)
			Mid[j] = (In[j]+K[i][j])%2;
		//将48位数据输入到8个S盒中进行置换选择,得到32位的输出
		for(j=0;j<48;j=j+6)
		{
			int row = Mid[j]*2+Mid[j+5];
			int col = Mid[j+1]*8+Mid[j+2]*4+Mid[j+3]*2+Mid[j+4];
			int num = S[count_s++][row][col];      //得到对应的4位输出
			convert(temp,num);
			for(int k=0;k<4;k++)
			{
				Out[count_o] = temp[3-k];
				count_o++;
			}
		}
		//进行P置换
		for(j=0;j<32;j++)
			Result[j] = Out[P[j]-1];         //得到置换运算P之后的结果

		for(j=0;j<32;j++)
		{
			L_Code[j]=L[j];
			R_Code[j]=R[j];
			R[j] = L[j];
			L[j] = (Result[j] + R_Code[j]) % 2;   //迭代一次完成
		}
	}

	for(i=0;i<32;i++)
		Result_mid[i]=L[i];
	for(i=32;i<64;i++)
		Result_mid[i] = R[i-32];

	//进行逆初始置换,输出最后的64位明文
	for(i=0;i<64;i++)
		Result_IP[IP_IP[i]-1] = Result_mid[i];	
}
//以此完整的加密过程
void CViewDlg::code_all(CFile fp_ming,CFile fp_code,char code_char[])
{
	char  Ming[SIZE*8];
	char char_array[SIZE*8];
	int i=0;
	int j=0;
	UINT count=0;   //记载读取的字符数
	int count_time=0;
	char my_array[SIZE];
	int code_int[64];
	int cut=0;
	char short_cut[8];
	long time=0;
	long time_count=0;


	charTint(code_char,code_int);
	code(code_int,K_Code,C1,C2);     //产生密钥

	fp_ming.SeekToBegin();
	fp_code.SeekToBegin();

	long len = fp_ming.GetLength();
	time=len/1024;

	while(time_count<=time)
	{
		count = fp_ming.Read(my_array,SIZE);

		for(j=0;j<64;j++)
			Z[j]=Z_1[j];

		if(count<SIZE)
			count_time=(count/8)*8;
		else
			count_time=SIZE;

		for(int x=0;x<count_time;x=x+8)
		{
			for(j=0;j<8;j++)
				char_Uncode[j] = my_array[x+j];

			charTint(char_Uncode,bin_Uncode);
				
			for(j=0;j<64;j++)
				bin_Uncode[j]=(bin_Uncode[j]+Z[j])%2;

			//加密操作				
			permute(bin_Uncode,L,R,IP_IP);
			encrypt(Result_IP,IP_athwart,K_Code,E,R,L,S);

			for(j=0;j<64;j++)
			{

				if(Result_IP[j])
					Ming[8*x+j]='1';
				else
					Ming[8*x+j]='0';
				Z[j]=Result_IP[j];               //计算下一次的反馈数组

			}

		}

		fp_code.Write(Ming,count_time*8); 
		time_count++;
		if(count_time<count)
		{	
			cut=1;
			break;
		}
	}
	if(cut==1)
	{
		fp_ming.Seek(-8,CFile::end);
		fp_ming.Read(short_cut,8);
		charTint(short_cut,bin_Uncode);
		for(i=0;i<8*(8-count%8);i++)
			bin_Uncode[i]=Result_IP[8*(count%8)+i];
		permute(bin_Uncode,L,R,IP_IP);
		encrypt(Result_IP,IP_athwart,K_Code,E,R,L,S);
		for(j=0;j<64;j++)
		{
			if(Result_IP[j])
				Ming[j]='1';
			else
				Ming[j]='0';	            //计算下一次的反馈数组
		}
		int n=8*(count%8)-64;
		fp_code.Seek(n,CFile::end);
		fp_code.Write(Ming,64);
	}

}
//以此完整的解密过程
void CViewDlg::uncode_all(CFile fp_ming,CFile fp_code,char code_char[])
{
	char Ming[SIZE*8];
	char char_array[SIZE*8];
	int i=0;
	int j=0;
	char test[8];
	int code_int[64];
	int count=0;   //记载读取的字符数
	int count_time=0;
	char my_array[SIZE+8];
	int temp[64];
	int y=0;
	int cut=0;
	char char_Uncode[64];
	char short_cut[8];
	char cut_short[8];
	long len,time=0;
	long time_count=0;

	charTint(code_char,code_int);
	code(code_int,K_Code,C1,C2);
	for(i=0;i<16;i++)
		for(int j=0;j<48;j++)
			K_Uncode[i][j] = K_Code[15-i][j];

	fp_ming.SeekToBegin();
	fp_ming.SeekToBegin();

	if( (len = fp_ming.GetLength())%64 != 0) 
	{
		fp_ming.Seek(-64,CFile::end);
		fp_ming.Read(char_array,64);
		for(i=0;i<64;i++)
		{
			if(char_array[i]=='0')
				bin_Uncode[i]=0;
			else
				bin_Uncode[i]=1;
		}
		Unpermute(bin_Uncode,L,R);
		Unencrypt(Result_IP,K_Uncode,E,R,L,S);    //得到短块处理结果
		intTchar(Result_IP,short_cut);   
		for(i=0;i<64;i++)
		{
			if(Result_IP[i]==0)
				Ming[i]='0';
			else
				Ming[i]='1';
		}
		fp_ming.Seek(-64,CFile::end);
		fp_ming.Write(Ming,64);

		for(i=0;i<(len%64)/8;i++)
			cut_short[i]=short_cut[8-(len%64)/8+i];
	}
	fp_ming.SeekToBegin();

	time=len/(SIZE*8);

	while(time_count<=time)
	{
		y=0;
		count = fp_ming.Read(char_array,8*SIZE);
		for(j=0;j<64;j++)
			Z[j]=Z_1[j];

		if(count<8*SIZE)
			count_time=(count/64)*64;
		else
			count_time=8*SIZE;
		for(int x=0;x<count_time;x=x+64)
		{
			for(j=0;j<64;j++)
			{	
				if(char_array[x+j]=='1')
					bin_Uncode[j]=1;
				else
					bin_Uncode[j]=0;
				temp[j]=bin_Uncode[j];
			}

			Unpermute(bin_Uncode,L,R);
			Unencrypt(Result_IP,K_Uncode,E,R,L,S);

			for(j=0;j<64;j++)
			{


				Result_IP[j]=(Result_IP[j]+Z[j])%2;
				Z[j]=temp[j];

			}

			intTchar(Result_IP,ch_code);                //将加密之后的二进制数组转换为字符串输出
			for(j=0;j<8;j++)
			{
				my_array[y]=ch_code[j];
				y++;
			}
		}

		fp_code.Write(my_array,count_time/8);
		time_count++;
		if(count>count_time)
		{
			cut=1;
			break;
		}			
	}

	if(cut==1)
	{
		for(i=0;i<(count-count_time)/8;i++)
			my_array[count_time/8+i]=cut_short[i];
		fp_code.Seek(-count_time/8,CFile::end);
		fp_code.Write(my_array,(count-count_time)/8+count_time/8);
	}

}

//完成预览文件功能

void CViewDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strFileName;
	char szFilter[200];
	strcpy( szFilter, "TXT Files (*.*)|*.*||" );
	CFileDialog *pFileDialog;
	pFileDialog = new CFileDialog( TRUE, 
		NULL, 
		NULL, 
		OFN_HIDEREADONLY,
		szFilter,
		this );
	if(IDOK == pFileDialog->DoModal())
	{
		strFileName = pFileDialog->GetPathName();
		m_editName.SetWindowText(strFileName);
	}

}

void CViewDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strFileName;
	char szFilter[200];
	strcpy( szFilter, "TXT Files (*.*)|*.*||" );
	CFileDialog *pFileDialog;
	pFileDialog = new CFileDialog( TRUE, 
		NULL, 
		NULL, 
		OFN_HIDEREADONLY,
		szFilter,
		this );
	if(IDOK == pFileDialog->DoModal())
	{
		strFileName = pFileDialog->GetPathName();
		m_editFile.SetWindowText(strFileName);
	}
}

⌨️ 快捷键说明

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