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

📄 cdes.cpp

📁 学校两基管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		for(k=0;k<56;k++)
		{
			if(k<28)
				Swap_Bit[k]=C0[k];
			else Swap_Bit[k]=D0[k-28];
		}
		// PC-2
		for(k=0;k<48;k++)
			Key_Bit[i][k]=Swap_Bit[PC_2[k]-1];
	}
	/*
#ifdef DEBUG 
	printf("\n");
	for(i=0;i<16;i++)
	{
		for(k=0;k<48;k++)
			printf("%d",Key_Bit[i][k]);
		printf("\n");
	}
	printf("\n");
#endif
*/
	for(i=0;i<16;i++)
		Bit64To8Byte(Key_Bit[i],key[i]);
	/*
#ifdef DEBUG
	printf("\n");
	for(i=0;i<16;i++)
		for(j=0;j<8;j++)
			printf("%c",key[i][j]);
	printf("\n");
#endif
	*/
}
/***********Expand**********/
// Function Name: Expand
// 传入参数: orig(32bits)
// 功能:将传入的32bit扩展为48bit,
// 传出参数:Ex[48](48bits)
// 返回值: void
/********************************/

void DES::Expand(unsigned char *orig,unsigned char Ex[48])
{
	int i;
	for(i=0;i<48;i++)
		Ex[i]=orig[E[i]-1];
}

/***********Bit64To32Bit**********/
// Function Name: Bit64To32Bit
// 传入参数: Bit64
// 功能:将传入的64bit均分为8bit,
//       把高4位截去(eg:00001011=>1011)
// 传出参数:Bit32
// 返回值: void
/********************************/
void DES::Bit64To32Bit(unsigned char *Bit64,unsigned char *Bit32)
{
	int i;
	for(i=0;i<8;i++)
		memcpy(Bit32+i*4,Bit64+i*8+4,4);
}

/***********S_Box**********/
// Function Name: S_Box
// 传入参数: Ex[48]
// 功能:将传入的48bits,经过S盒压缩替换为32bits
// 传出参数:S_Bit[32]
// 返回值: void
/********************************/

void DES::S_Box(unsigned char Ex[48],unsigned char S_Bit[32])
{
	int i,j;
	unsigned char row=0,col=0;
	unsigned char s_tmp[8];
	unsigned char tmp[6];
	unsigned char RowCol_Bit[64];
	unsigned char RowCol_Byte[8];
	//unsigned char Result[32];
	memset(tmp,0,6);
	memset(s_tmp,0,8);
	for(i=0;i<8;i++)
	{
		
		memset(RowCol_Bit,0,64);
		memset(RowCol_Byte,0,8);
		memcpy(tmp,Ex+6*i,6);
		RowCol_Bit[6]=tmp[0];
		RowCol_Bit[7]=tmp[5];
		//取头尾2位组成S盒的行
		Bit64To8Byte(RowCol_Bit,RowCol_Byte);
		row=RowCol_Byte[0];
		memset(RowCol_Bit,0,16);
		memcpy(RowCol_Bit+4,tmp+1,4);
		//取中间4位组成S盒的列
		Bit64To8Byte(RowCol_Bit,RowCol_Byte);
		col=RowCol_Byte[0];
		//由行和列查对应的S盒
		switch(i)
		{
		case 0: 
			s_tmp[i]=S1[row][col];
			break;
		case 1:
			s_tmp[i]=S2[row][col];
			break;
		case 2:
			s_tmp[i]=S3[row][col];
			break;
		case 3:
			s_tmp[i]=S4[row][col];
			break;
		case 4:
			s_tmp[i]=S5[row][col];
			break;
		case 5:
			s_tmp[i]=S6[row][col];
			break;
		case 6:
			s_tmp[i]=S7[row][col];
			break;
		case 7:
			s_tmp[i]=S8[row][col];
			break;
		}
	}
	memset(RowCol_Bit,0,64);
	Byte8To64Bit(s_tmp,RowCol_Bit);
	/*
#ifdef DEBUG
	printf("\n S_R Bit:\n");
	for(i=0;i<63;i++)
		printf("%d",RowCol_Bit[i]);
	printf("\n");
#endif
	*/
	Bit64To32Bit(RowCol_Bit,S_Bit);//clean high 4bit(0000)
}

void DES::Encode(unsigned char orig_str[8],unsigned char orig_pass[8],unsigned char encode_str[8])
{
	unsigned char KEY[16][8];//48 bit(6byte)密码
	unsigned char Origo_Bit[64];
	unsigned char Swap_Bit[64];
	unsigned char LBit[64],RBit[64];
	unsigned char LBYTE[17][8],RBYTE[17][8];
	unsigned char tmpByte[8];
	unsigned char Ex_Bit[64],SBOX_Bit[32];
	unsigned char Pass_Bit[64];
	int i,j;
	memset(Origo_Bit,0,64);
	memset(Swap_Bit,0,64);
	memset(LBit,0,sizeof(LBit));
	
	memset(LBYTE,0,sizeof(LBYTE));
	memset(RBYTE,0,sizeof(RBYTE));
	memset(tmpByte,0,8);
	
	//get key
	BuildKey(orig_pass,KEY);
	Byte8To64Bit(orig_str,Origo_Bit);
	//ip swap
	for(i=0;i<64;i++)
		Swap_Bit[i]=Origo_Bit[IP[i]-1];
	//将IP排列后的64bit一分为二,RBYTE=4byte,LBYTE=4BYTE;
	Bit64To8Byte(Swap_Bit,tmpByte);
	/*
#ifdef DEBUG
	printf("\n Ip swap later:\n");
	for(i=0;i<8;i++)
		printf("%c",tmpByte[i]);
	printf("\n");
#endif
	*/
	memcpy(LBYTE[0],tmpByte,4);
	memcpy(RBYTE[0],tmpByte+4,4);

	//进行16次乘积变换()
	for(i=0;i<16;i++)
	{
		memcpy(LBYTE[i+1],RBYTE[i],4);//L(i)=R(i-1)
		memset(tmpByte,0,8);
		memset(RBit,0,sizeof(RBit));
		Byte8To64Bit(RBYTE[i],RBit);
/*
#ifdef DEBUG
		printf("\nRBit:\n");
		for(j=0;j<64;j++)
			printf("%d",RBit[j]);
		printf("\n");
#endif */
		memset(Ex_Bit,0,64);
		Expand(RBit,Ex_Bit);
		memset(RBYTE[i],0,8);
		Bit64To8Byte(Ex_Bit,RBYTE[i]);
/*
#ifdef DEBUG
	printf("\n Expand RBYTE[%d] :",i);
	for(j=0;j<8;j++)
		printf("%c",tmpByte[j]);
	printf("\n");
#endif */
        //xor R0(48bit) XOR KEY[i] 
		memset(Ex_Bit,0,64);
		for(j=0;j<6;j++)
			RBYTE[i][j] ^= KEY[i][j];
		Byte8To64Bit(RBYTE[i],Ex_Bit);
/*		
#ifdef DEBUG
		printf("\n Ex_Bit:\n");
		for(j=0;j<64;j++)
			printf("%d",Ex_Bit[j]);
		printf("\n");
#endif
#ifdef DEBUG
	printf("\n KEY[%d]:",i);
	for(j=0;j<8;j++)
		printf("%c",KEY[i][j]);
	printf("\n RBYTE0: ");
	for(j=0;j<8;j++)
		printf("%c",RBYTE[0][j]);
	printf("\n");
#endif*/
		memset(SBOX_Bit,0,32);
		S_Box(Ex_Bit,SBOX_Bit);
		memset(RBit,0,64);
		for(j=0;j<32;j++)
			RBit[j]=SBOX_Bit[P[j]-1];//p排列
		/*
#ifdef DEBUG
	printf("\n RBIT:\n");
	for(j=0;j<32;j++)
		printf("%d",RBit[j]);
	printf("\n");
#endif
*/      memset(RBYTE[i],0,8);
		Bit64To8Byte(RBit,RBYTE[i]);
		//32bit == 4 byte
		for(j=0;j<4;j++)
			RBYTE[i+1][j]=LBYTE[i][j] ^ RBYTE[i][j];
/*
#ifdef DEBUG
	printf("\n RBYTE[%d]: ",i);
	for(j=0;j<4;j++)
		printf("%c",RBYTE[i][j]);
	printf("  LBYTE[%d]",i);
	for(j=0;j<4;j++)
		printf("%c",LBYTE[i][j]);
	//printf("\n");
#endif
*/
	}
	memset(tmpByte,0,8);
    memcpy(tmpByte,RBYTE[16],4);
	memcpy(tmpByte+4,LBYTE[16],4);
	/*
printf("\n tmpByte:");
for(j=0;j<8;j++)
  printf("%c",tmpByte[j]);
printf("\n");*/
	memset(Swap_Bit,0,64);
	Byte8To64Bit(tmpByte,Swap_Bit);
	memset(Pass_Bit,0,64);
	for(i=0;i<64;i++)
		Pass_Bit[i]=Swap_Bit[IP_1[i]-1];
	Bit64To8Byte(Pass_Bit,encode_str);

}

void DES::Uncode(unsigned char orig_str[8],unsigned char orig_pass[8],unsigned char uncode_str[8])
{
	unsigned char KEY[16][8];//48 bit(6byte)密码
	unsigned char Origo_Bit[64];
	unsigned char Swap_Bit[64];
	unsigned char LBit[64],RBit[64];
	unsigned char LBYTE[17][8],RBYTE[17][8];
	unsigned char tmpByte[8];
	unsigned char Ex_Bit[64],SBOX_Bit[32];
	unsigned char Pass_Bit[64];
	int i,j;
	memset(Origo_Bit,0,64);
	memset(Swap_Bit,0,64);
	memset(LBit,0,sizeof(LBit));
	
	memset(LBYTE,0,sizeof(LBYTE));
	memset(RBYTE,0,sizeof(RBYTE));
	memset(tmpByte,0,8);
	
	//get key
	BuildKey(orig_pass,KEY);
	Byte8To64Bit(orig_str,Origo_Bit);
	//ip swap
	for(i=0;i<64;i++)
		Swap_Bit[i]=Origo_Bit[IP[i]-1];
	//将IP排列后的64bit一分为二,RBYTE=4byte,LBYTE=4BYTE;
	Bit64To8Byte(Swap_Bit,tmpByte);
	memcpy(RBYTE[16],tmpByte,4);
	memcpy(LBYTE[16],tmpByte+4,4);

	//进行16次乘积变换()
	for(i=16;i>0;i--)
	{
		memcpy(RBYTE[i-1],LBYTE[i],4);//R(i-1)=L(i)
		memset(tmpByte,0,8);
		memset(LBit,0,sizeof(LBit));
		Byte8To64Bit(LBYTE[i],LBit);

		memset(Ex_Bit,0,64);
		Expand(LBit,Ex_Bit);
		memset(LBYTE[i],0,8);
		Bit64To8Byte(Ex_Bit,LBYTE[i]);

        //xor R0(48bit) XOR KEY[i] 
		memset(Ex_Bit,0,64);
		for(j=0;j<6;j++)
			LBYTE[i][j] ^= KEY[i-1][j];
		Byte8To64Bit(LBYTE[i],Ex_Bit);

		memset(SBOX_Bit,0,32);
		S_Box(Ex_Bit,SBOX_Bit);
		memset(LBit,0,64);
		for(j=0;j<32;j++)
			LBit[j]=SBOX_Bit[P[j]-1];//p排列

        memset(LBYTE[i],0,8);
		Bit64To8Byte(LBit,LBYTE[i]);
		//32bit == 4 byte
		for(j=0;j<4;j++)
			LBYTE[i-1][j]=RBYTE[i][j] ^ LBYTE[i][j];
	}
	memset(tmpByte,0,8);
    memcpy(tmpByte,LBYTE[0],4);
	memcpy(tmpByte+4,RBYTE[0],4);
	memset(Swap_Bit,0,64);
	Byte8To64Bit(tmpByte,Swap_Bit);
	memset(Pass_Bit,0,64);
	for(i=0;i<64;i++)
		Pass_Bit[i]=Swap_Bit[IP_1[i]-1];
	Bit64To8Byte(Pass_Bit,uncode_str);
}

⌨️ 快捷键说明

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