📄 3des.cpp
字号:
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 + -