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

📄 desdlg.cpp

📁 包涵了密码学教程里面的大部分加密算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
		IP(ip_2, 64, q);
		for(j=0; j<8; j++)
			cryptography_CBC[i+j] = q[j];

		index ++;
	}

	//---------------------显示CBC密文----------------------//
	char *code_cbc = new char[LL*8+LL];
	h = 0;
	for(i=0; i<LL; i++)
	{
		for(j=1; j<=8; j++)
		{
			if(pick(cryptography_CBC[i], j))
				code_cbc[h++] = '1';
			else
				code_cbc[h++] = '0';
		}
		code_cbc[h++] = ' ';
	}
	code_cbc[h] = '\0';
	SetDlgItemText(IDC_CBCCipher, code_cbc);
	//--------------------CBC加密算法结束---------------------//

	//----------------------CFB加密算法-----------------------//
	index = 0;
	for(i=0; i<LL; i+=8)
	{
		for(j=0; j<8; j++)
			p[j] = plaintext[i+j];

		if(index == 0)
		{
			for(j=0; j<8; j++)
				q[j] = p[j] ^ IV[j];

			for(j=0; j<8; j++)
				cryptography_CFB[i+j] = q[j];
		}
		else
		{
			IP(ip_1, 64, q);
			char L[4], R[4];
			for(k=0; k<4; k++)
			{
				L[k] = q[k];
				R[k] = q[k+4];
			}

			for(j=1; j<=16; j++)
			{
				Fk(L, R, j);
				InterChange(L, R, 4);
			}
			for(k=0; k<4; k++)
			{
				q[k] = L[k];
				q[k+4] = R[k];
			}
			IP(ip_2, 64, q);

			for(j=0; j<8; j++)
				cryptography_CFB[i+j] = q[j];
		}
		
		index ++;
	}

	//--------------------显示CFB二进制密文----------------------//
	char *code_cfb = new char[LL*8+LL];
	h = 0;
	for(i=0; i<LL; i++)
	{
		for(j=1; j<=8; j++)
		{
			if(pick(cryptography_CFB[i], j))
				code_cfb[h++] = '1';
			else
				code_cfb[h++] = '0';
		}
		code_cfb[h++] = ' ';
	}
	code_cfb[h] = '\0';
	SetDlgItemText(IDC_CFBCipher, code_cfb);
	//------------------------------CFB加密结束----------------------------//

	//------------------------------OFB加密算法----------------------------//
	index = 0;
	
	//以q作为中间循环变量数组,首先赋初值IV
	for(j=0; j<8; j++)
		q[j] = IV[j];

	for(i=0; i<LL; i+=8)
	{
		//每次运算64 bit明文
		for(j=0; j<8; j++)
			p[j] = plaintext[i+j];
		
		//如果是第一次,只是与初始向量做异或运算
		if(index == 0)
		{
			for(j=0; j<8; j++)
				p[j] = p[j] ^ IV[j];
			for(j=0; j<8; j++)
				cryptography_OFB[i+j] = p[j];
		}
		//如果是后续加密,则采取后续运算方法
		else
		{		
			//首先对初始向量做加密运算
			char L[4], R[4];
			IP(ip_1, 64, q);
			for(k=0; k<4; k++)
			{
				L[k] = q[k];
				R[k] = q[k+4];
			}
			
			for(j=1; j<=16; j++)
			{
				Fk(L, R, j);
				InterChange(L, R, 4);
			}

			for(k=0; k<4; k++)
			{
				q[k] = L[k];
				q[k+4] = R[k]; 
			}

			IP(ip_2, 64, q);

			for(j=0; j<8; j++)
				cryptography_OFB[i+j] = q[j];			
		}
	}

	//---------------------显示OFB二进制密文-----------------------//
	char *code_ofb = new char[LL*8+LL];
	h = 0;
	for(i=0; i<LL; i++)
	{
		for(j=1; j<=8; j++)
		{
			if(pick(cryptography_OFB[i], j))
				code_ofb[h++] = '1';
			else
				code_ofb[h++] = '0';
		}

		code_ofb[h++] = ' ';
	}

	code_ofb[h] = '\0';
	SetDlgItemText(IDC_OFBCipher, code_ofb);
}


//32 bit左右两边的交换
void CDesDlg::InterChange(char *c1, char *c2, int n)
{
	int i;
	char temp;
	for(i=0; i<n; i++)
	{
		temp = c1[i];
		c1[i] = c2[i];
		c2[i] = temp;
	}
}


//产生初始向量
void CDesDlg::Create_IV()
{
	int i, j;
	for(i=0; i<8; i++)
		IV[i] = char(0);
	srand((unsigned)time(NULL));
	unsigned long k = 100*rand();
	for(i=0; i<64; i++)
	{
		j = i%8 + 1;
		k = (1187*k + 1201) % 598197;
		if(k/598197.0 > 0.5)
			IV[i/8] = (IV[i/8]) | (char(1)<<(8-j));
	}

	//IV向量的二进制表示
	char *laaa = new char[8*8+8];
	int h = 0;
	for(i=0; i<8; i++)
	{
		for(j=1; j<=8; j++)
		{
			if(pick(IV[i], j))
				laaa[h++] = '1';
			else
				laaa[h++] = '0';
		}
		laaa[h++] = ' ';
	}
	laaa[h] = '\0';
	
	SetDlgItemText(IDC_InitVector, laaa);
}


//第i次的复杂函数运算
void CDesDlg::Fk(char *L, char *R, int i)
{
	char *R_E = new char[6];
	//首先进行一次置换
	IP(E_P, 48, R_E, R);
	int j;
	for(j=0; j<6; j++)
		R_E[j] = R_E[j] ^ Key[i][j];
	int k=0, kk=0;
	char temp[4];
	//密码盒的操作
	for(j=1; j<=8; j++)
	{
		int x=0, y=0, s1=0, s2=0, s=0;
		if(pick(R_E[k/8], k%8+1))			x = 2;
		if(pick(R_E[(k+5)/8], (k+5)%8+1))	x = x + 1;
		if(pick(R_E[(k+1)/8], (k+1)%8+1))	y = 8;
		if(pick(R_E[(k+2)/8], (k+2)%8+1))	y = y + 4;
		if(pick(R_E[(k+3)/8], (k+3)%8+1))	y = y + 2;
		if(pick(R_E[(k+4)/8], (k+4)%8+1))	y = y + 1;
		s1 = S_box[j][x*8+y];
		
		x = y = 0;
		k = k + 6;
		j++;
		if(pick(R_E[k/8], k%8+1))			x = 2;
		if(pick(R_E[(k+5)/8], (k+5)%8+1))	x = x + 1;
		if(pick(R_E[(k+1)/8], (k+1)%8+1))	y = 8;
		if(pick(R_E[(k+2)/8], (k+2)%8+1))	y = y + 4;
		if(pick(R_E[(k+3)/8], (k+3)%8+1))	y = y + 2;
		if(pick(R_E[(k+4)/8], (k+4)%8+1))	y = y + 1;
		s2 = S_box[j][x*8+y];
		s = s1*16 + s2;
		temp[kk++] = char(s);
	}

	for(j=0; j<4; j++)
		L[j] = L[j] ^ temp[j];
	delete R_E;
}


//--------------------------ECB模式解密---------------------------//
void CDesDlg::OnECBDecrypt() 
{
	// TODO: Add your control notification handler code here
	char temp[1000];
	char p[8];
	int  i, j, k;

	for(i=0; i<1000; i++)
		temp[i] = '\0';

	for(i=0; i<LL; i+=8)
	{
		for(j=0; j<8; j++)
			p[j] = cryptography_ECB[i+j];
		
		IP(ip_1, 64, p);
		char L[4], R[4];
		for(k=0; k<4; k++)
		{
			L[k] = p[k];
			R[k] = p[k+4];
		}

		for(j=16; j>=1; j--)
		{
			InterChange(L, R, 4);
			Fk(L, R, j);
		}

		for(k=0; k<4; k++)
		{
			p[k] = L[k];
			p[k+4] = R[k];
		}
		IP(ip_2, 64, p);

		for(j=0; j<8; j++)
			temp[i+j] = p[j];
	}

	j = 0;
	for(i=0; i<LL; i++)
	{
	   if(temp[i] != plaintext[i]) 
	   { 
		   j = 1; 
		   i = LL+1; 
	   }
	}

	if(j == 0) 
		SetDlgItemText(IDC_ECBCipher, plaintext_0);
}


//------------------------------CBC解密算法-----------------------------//
void CDesDlg::OnCBCDecrypt() 
{
	// TODO: Add your control notification handler code here
	int k = 0, i, j; 
	char p[8];
	char temp[1000]; 

	for(j=0; j<1000; j++)
		temp[j] = '\0';

	for(i=0; i<LL; i+=8)
	{
		for(j=0;j<8;j++)
			p[j]=cryptography_CBC[i+j];

		IP(ip_1, 64, p);                                      
		char L[4], R[4];
		for(k=0; k<4; k++) 
		{	
			L[k] = p[k];	
			R[k] = p[k+4];
		}     
		for(j=16; j>=1; j--)
		{	
			InterChange(L, R, 4);
			Fk(L, R, j);
		}

		for(j=0; j<4; j++)  
		{  
			p[j] = L[j]; 
			p[j+4] = R[j]; 
		}
		IP(ip_2,64,p); 	                          
		
		for(j=0; j<8; j++) 
			temp[j+i] = p[j];  
		
		if(i==0)
		  for(j=0; j<8; j++) 
			  temp[j] = temp[j]^IV[j];
		else
		  for(j=0; j<8; j++) 
			  temp[i+j] = (temp[i+j])^(cryptography_CBC[i-8+j]);
	}

	j=0;
	for(i=0; i<LL; i++)
	{
		if(temp[i] != plaintext[i]) 
		{ 
			j = 1; 
			i = LL + 1;
		}
	}

	if(j == 0) 
		SetDlgItemText(IDC_CBCCipher, plaintext_0);
}


//------------------------------CFB模式解密--------------------------------//
void CDesDlg::OnCFBDecrypt() 
{
	// TODO: Add your control notification handler code here
	char p[8], q[8];
	char temp[1000];
	int  index;
	int  i, j, k;

	for(i=0; i<1000; i++)
		temp[i] = '\0';

	index = 0;
	for(i=0; i<LL; i+=8)
	{
		for(j=0; j<8; j++)
			p[j] = cryptography_CFB[i+j];

		if(index == 0)
		{
			for(j=0; j<8; j++)
				q[j] = p[j] ^ IV[j];

			for(j=0; j<8; j++)
				temp[i+j] = q[j];
		}
		else
		{
			IP(ip_1, 64, q);
			char L[4], R[4];
			for(k=0; k<4; k++)
			{
				L[k] = q[k];
				R[k] = q[k+4];
			}
			for(j=16; j>=1; j--)
			{
				InterChange(L, R, 4);
				Fk(L, R, j);
			}
			for(k=0; k<4; k++)
			{
				q[k] = L[k];
				q[k+4] = R[k];
			}
			IP(ip_2, 64, q);

			for(j=0; j<8; j++)
				temp[i+j] = q[j];
		}
		
		index ++;
	}

	j = 0;
	for(i=0; i<LL; i++)
	{
		if(temp[i] != plaintext[i])
		{
			j = 1;
			i = LL + 1;
		}
	}
	
	if(j==0)
		SetDlgItemText(IDC_CFBCipher, plaintext_0);
}


//------------------------OFB解密-------------------------------//
/*
	按照OFB加密算法的流程,将OFB密文输入到算法流程中去,
	即可得到解密后的明文.
*/
void CDesDlg::OnOFBDecrypt() 
{
	// TODO: Add your control notification handler code here
	char p[8], q[8];
	char temp[1000];
	int  i, j, k, index;

	for(i=0; i<1000; i++)
		temp[i] = '\0';
	
	index = 0;
	
	//以q作为中间循环变量数组,首先赋初值IV
	for(j=0; j<8; j++)
		q[j] = IV[j];

	for(i=0; i<LL; i+=8)
	{
		//每次运算64 bit明文
		for(j=0; j<8; j++)
			p[j] = cryptography_OFB[i+j];
		
		//如果是第一次,只是与初始向量做异或运算
		if(index == 0)
		{
			for(j=0; j<8; j++)
				p[j] = p[j] ^ IV[j];
			for(j=0; j<8; j++)
				temp[i+j] = p[j];
		}
		//如果是后续加密,则采取后续运算方法
		else
		{		
			//首先对初始向量做加密运算
			char L[4], R[4];
			IP(ip_1, 64, q);
			for(k=0; k<4; k++)
			{
				L[k] = q[k];
				R[k] = q[k+4];
			}
			
			for(j=16; j>=1; j--)
			{
				Fk(L, R, j);
				InterChange(L, R, 4);
			}

			for(k=0; k<4; k++)
			{
				q[k] = L[k];
				q[k+4] = R[k]; 
			}

			IP(ip_2, 64, q);

			for(j=0; j<8; j++)
				temp[i+j] = q[j];			
		}
	}

	j = 0;
	for(i=0; i<LL; i++)
	{
		if(temp[i] != plaintext[i])
		{
			j = 1;
			i = LL + 1;
		}
	}

	if(j == 0)
		SetDlgItemText(IDC_OFBCipher, plaintext_0);
}

⌨️ 快捷键说明

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