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

📄 3des.cpp

📁 能够进行des和3des加密解密运算,内有详细的注释
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	for(i=0;i<nKey;i++)
	{
		SetSubKey(&m_SubKey[i],&Key[i<<3]);
	}

	if(bMode == CRYPT_MODE_ECB)	//ECB模式
	{
		if(nKey	==	1)	//单Key
		{
			for(i=0,j=datalen>>3;i<j;++i,Out+=8,In+=8)
			{
				DES(Out,In,&m_SubKey[0],bType);
			}
		}
		else
		if(nKey == 2)	//3DES 2Key
		{
			for(i=0,j=datalen>>3;i<j;++i,Out+=8,In+=8)
			{
				DES(Out,In,&m_SubKey[0],bType);
				DES(Out,Out,&m_SubKey[1],!bType);
				DES(Out,Out,&m_SubKey[0],bType);
			}
		}
		else			//3DES 3Key
		{
			for(i=0,j=datalen>>3;i<j;++i,Out+=8,In+=8)
			{
				DES(Out,In,&m_SubKey[bType? 2 : 0],bType);
				DES(Out,Out,&m_SubKey[1],!bType);
				DES(Out,Out,&m_SubKey[bType? 0 : 2],bType);	
			}
		}
	}	
	else				//CBC模式
	{
		BYTE	cvec[8]	=	"";	//扭转向量
		BYTE	cvin[8]	=	""; //中间变量

		memcpy(cvec,parameter,8);
		if(nKey == 1)	//单Key
		{
			for(i=0,j=datalen>>3;i<j;++i,Out+=8,In+=8)
			{
				if(bType	==	ENCRYPT)
				{
					for(j=0;j<8;++j)		//将输入与扭转变量异或
					{
						cvin[j]	=	In[j] ^ cvec[j];
					}
				}
				else
				{
					memcpy(cvin,In,8);
				}

				DES(Out,cvin,&m_SubKey[0],bType);

				if(bType	==	ENCRYPT)
				{
					memcpy(cvec,Out,8);			//将输出设定为扭转变量
				}
				else
				{
					for(j=0;j<8;++j)		//将输出与扭转变量异或
					{
						Out[j]	=	Out[j] ^ cvec[j];
					}
					memcpy(cvec,cvin,8);			//将输入设定为扭转变量
				}
			}			
		}
		else
		if(nKey == 2)	//3DES CBC 2Key
		{
			for(i=0,j=datalen>>3;i<j;++i,Out+=8,In+=8)
			{
				if(bType	==	ENCRYPT)
				{
					for(j=0;j<8;++j)		//将输入与扭转变量异或
					{
						cvin[j]	=	In[j] ^ cvec[j];
					}
				}
				else
				{
					memcpy(cvin,In,8);
				}
				
				DES(Out,cvin,&m_SubKey[0],bType);
				DES(Out,Out,&m_SubKey[1],!bType);
				DES(Out,Out,&m_SubKey[0],bType);
				
				if(bType	==	ENCRYPT)
				{
					memcpy(cvec,Out,8);			//将输出设定为扭转变量
				}
				else
				{
					for(j=0;j<8;++j)		//将输出与扭转变量异或
					{
						Out[j]	=	Out[j] ^ cvec[j];
					}
					memcpy(cvec,cvin,8);			//将输入设定为扭转变量
				}
			}
		}
		else			//3DES CBC 3Key
		{			
			for(i=0,j=datalen>>3;i<j;++i,Out+=8,In+=8)
			{
				if(bType	==	ENCRYPT)
				{
					for(j=0;j<8;++j)		//将输入与扭转变量异或
					{
						cvin[j]	=	In[j] ^ cvec[j];
					}
				}
				else
				{
					memcpy(cvin,In,8);
				}

				DES(Out,cvin,&m_SubKey[bType ? 2 : 0],bType);
				DES(Out,Out,&m_SubKey[1],!bType);
				DES(Out,Out,&m_SubKey[bType ? 0 : 2],bType);
				
				if(bType	==	ENCRYPT)
				{
					memcpy(cvec,Out,8);			//将输出设定为扭转变量
				}
				else
				{					
					for(j=0;j<8;++j)		//将输出与扭转变量异或
					{
						Out[j]	=	Out[j] ^ cvec[j];
					}
					memcpy(cvec,cvin,8);			//将输入设定为扭转变量
				}
			}
		}
		memcpy(parameter,cvec,8);
	}
	
	return SCARD_SUCCESS;
}




/*******************************************************************/
/*
  函 数 名 称:	RunPad
  功 能 描 述:	根据协议对加密前的数据进行填充
  参 数 说 明:	bType	:类型:PAD类型
				In		:数据串指针
				Out		:填充输出串指针
				datalen	:数据的长度
				padlen	:(in,out)输出buffer的长度,填充后的长度

  返回值 说明:	bool	:是否填充成功
  作       者:	邹德强
  修 改 历 史:	

  更 新 日 期:	2003.12.19
*/
/*******************************************************************/
DWORD	RunPad(DWORD nType,BYTE* In,DWORD datalen,BYTE* Out,unsigned int *padlen, int bytes)
{
	int res;
	if (bytes == 8)
		res = (datalen & 0x00000007);
	else if (bytes == 16)
		res = (datalen & 0x0000000f);
	
	
	if(*padlen< (datalen+bytes-res))
	{
		return SCARD_FAIL;
	}
	else
	{
		*padlen	=	(datalen+bytes-res);
		memcpy(Out,In,datalen);
	}
	
	
	if(nType	==	ISO1_PADDING)
	{
		memset(Out+datalen,0x00,8-res);
	}
	else
	if(nType	==	ISO2_PADDING)
	{
		memset(Out+datalen,0x80,1);
		memset(Out+datalen,0x00,7-res);
	}
	else
	if(nType	==	PKCS7_PADDING)
	{
		memset(Out+datalen,bytes-res,bytes-res);		
	}
	else
	{
		return SCARD_FAIL;
	}

	return SCARD_SUCCESS;
}

DWORD	DeletePad(DWORD nType,BYTE* In,DWORD datalen,BYTE* Out,unsigned int *outlen)
{
	BYTE padlen;
	int i;
		
	if(nType	==	ISO1_PADDING)
	{
		return SCARD_FAIL;
	}
	else
	if(nType	==	ISO2_PADDING)
	{
		i = 0;
		while (In[datalen-1-i] != 0x80)
			i++;
		i++;
		if(*outlen < datalen -i)
			return SCARD_FAIL;
		*outlen = datalen - i;
		memcpy(Out,In,*outlen);
	}
	else
	if(nType	==	PKCS7_PADDING)
	{
		padlen = In[datalen-1];
		if (*outlen < datalen - padlen)
			return SCARD_FAIL;
		*outlen = datalen - padlen;
		memcpy(Out,In,*outlen); 
	}
	else
	{
		return SCARD_FAIL;
	}

	return SCARD_SUCCESS;
}




//计算并填充子密钥到SubKey数据中
void SetSubKey(PSubKey pSubKey, const BYTE Key[8])
{
	bool K[64], *KL=&K[0], *KR=&K[28];
    int i;
    ByteToBit(K, Key, 64);
    Transform(K, K, PC1_Table, 56);
    for(i=0; i<16; ++i) {
        RotateL(KL, 28, LOOP_Table[i]);
        RotateL(KR, 28, LOOP_Table[i]);
        Transform((*pSubKey)[i], K, PC2_Table, 48);
    }
}



//DES单元运算
void DES(BYTE Out[8], BYTE In[8], const PSubKey pSubKey, DWORD Type)
{
    bool M[64], tmp[32], *Li=&M[0], *Ri=&M[32];
    int i;
    ByteToBit(M, In, 64);
    Transform(M, M, IP_Table, 64);
    if( Type == ENCRYPT )
	{
        for(i=0; i<16; ++i)
		{
            memcpy(tmp, Ri, 32);		//Ri[i-1] 保存
            F_func(Ri, (*pSubKey)[i]);	//Ri[i-1]经过转化和SBox输出为P
            Xor(Ri, Li, 32);			//Ri[i] = P XOR Li[i-1]
            memcpy(Li, tmp, 32);		//Li[i] = Ri[i-1]
        }
    }
	else
	{
        for(i=15; i>=0; --i) 
		{
			memcpy(tmp, Ri, 32);		//Ri[i-1] 保存
            F_func(Ri, (*pSubKey)[i]);	//Ri[i-1]经过转化和SBox输出为P
            Xor(Ri, Li, 32);			//Ri[i] = P XOR Li[i-1]
            memcpy(Li, tmp, 32);		//Li[i] = Ri[i-1]
        }
	}
	RotateL(M,64,32);					//Ri与Li换位重组M
    Transform(M, M, IPR_Table, 64);		//最后结果进行转化
    BitToByte(Out, M, 64);				//组织成字符
}

⌨️ 快捷键说明

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