📄 encrypt.cpp
字号:
#include "StdAfx.h"
#include ".\encrypt.h"
#include "ThemidaSDK.h"
CEncrypt::CEncrypt(void)
{
VM_START_WITHLEVEL(25)
IP_Table[0] = 58, IP_Table[1] = 50, IP_Table[2] = 42, IP_Table[3] = 34, IP_Table[4] = 26, IP_Table[5] = 18, IP_Table[6] = 10, IP_Table[7] = 2, IP_Table[8] = 60, IP_Table[9] = 52, IP_Table[10] = 44, IP_Table[11] = 36, IP_Table[12] = 28, IP_Table[13] = 20, IP_Table[14] = 12, IP_Table[15] = 4,
IP_Table[16] = 62, IP_Table[17] = 54, IP_Table[18] = 46, IP_Table[19] = 38, IP_Table[20] = 30, IP_Table[21] = 22, IP_Table[22] = 14, IP_Table[23] = 6, IP_Table[24] = 64, IP_Table[25] = 56, IP_Table[26] = 48, IP_Table[27] = 40, IP_Table[28] = 32, IP_Table[29] = 24, IP_Table[30] = 16, IP_Table[31] = 8,
IP_Table[32] = 57, IP_Table[33] = 49, IP_Table[34] = 41, IP_Table[35] = 33, IP_Table[36] = 25, IP_Table[37] = 17, IP_Table[38] = 9, IP_Table[39] = 1, IP_Table[40] = 59, IP_Table[41] = 51, IP_Table[42] = 43, IP_Table[43] = 35, IP_Table[44] = 27, IP_Table[45] = 19, IP_Table[46] = 11, IP_Table[47] = 3,
IP_Table[48] = 61, IP_Table[49] = 53, IP_Table[50] = 45, IP_Table[51] = 37, IP_Table[52] = 29, IP_Table[53] = 21, IP_Table[54] = 13, IP_Table[55] = 5, IP_Table[56] = 63, IP_Table[57] = 55, IP_Table[58] = 47, IP_Table[59] = 39, IP_Table[60] = 31, IP_Table[61] = 23, IP_Table[62] = 15, IP_Table[63] = 7;
IPR_Table[0]=40, IPR_Table[1]=8, IPR_Table[2]=48, IPR_Table[3]=16, IPR_Table[4]=56,IPR_Table[5]= 24, IPR_Table[6]=64, IPR_Table[7]=32, IPR_Table[8]=39, IPR_Table[9]=7, IPR_Table[10]=47, IPR_Table[11]=15,IPR_Table[12]= 55, IPR_Table[13]=23,IPR_Table[14]= 63, IPR_Table[15]=31,
IPR_Table[16]=38,IPR_Table[17]= 6, IPR_Table[18]=46, IPR_Table[19]=14, IPR_Table[20]=54, IPR_Table[21]=22, IPR_Table[22]=62, IPR_Table[23]=30,IPR_Table[24]= 37, IPR_Table[25]=5, IPR_Table[26]=45, IPR_Table[27]=13, IPR_Table[28]=53, IPR_Table[29]=21, IPR_Table[30]=61,IPR_Table[31]= 29,
IPR_Table[32]=36, IPR_Table[33]=4, IPR_Table[34]= 44, IPR_Table[35]=12,IPR_Table[36]= 52,IPR_Table[37]= 20,IPR_Table[38]= 60, IPR_Table[39]=28, IPR_Table[40]=35, IPR_Table[41]=3, IPR_Table[42]=43, IPR_Table[43]=11, IPR_Table[44]=51, IPR_Table[45]=19, IPR_Table[46]=59, IPR_Table[47]=27,
IPR_Table[48]=34, IPR_Table[49]=2, IPR_Table[50]=42, IPR_Table[51]=10, IPR_Table[52]=50, IPR_Table[53]=18, IPR_Table[54]=58, IPR_Table[55]=26, IPR_Table[56]=33, IPR_Table[57]=1, IPR_Table[58]=41, IPR_Table[59]=9, IPR_Table[60]=49, IPR_Table[61]=17, IPR_Table[62]=57, IPR_Table[63]=25;
E_Table[0] = 32, E_Table[1] = 1, E_Table[2] = 2, E_Table[3] = 3, E_Table[4] = 4, E_Table[5] = 5, E_Table[6] = 4, E_Table[7] = 5, E_Table[8] = 6, E_Table[9] = 7, E_Table[10] = 8, E_Table[11] = 9,
E_Table[12] = 8, E_Table[13] = 9, E_Table[14] = 10, E_Table[15] = 11, E_Table[16] = 12, E_Table[17] = 13, E_Table[18] = 12, E_Table[19] = 13, E_Table[20] = 14, E_Table[21] = 15, E_Table[22] = 16, E_Table[23] = 17,
E_Table[24] = 16, E_Table[25] = 17, E_Table[26] = 18, E_Table[27] = 19, E_Table[28] = 20, E_Table[29] = 21, E_Table[30] = 20, E_Table[31] = 21, E_Table[32] = 22, E_Table[33] = 23, E_Table[34] = 24, E_Table[35] = 25,
E_Table[36] = 24, E_Table[37] = 25, E_Table[38] = 26, E_Table[39] = 27, E_Table[40] = 28, E_Table[41] = 29, E_Table[42] = 28, E_Table[43] = 29, E_Table[44] = 30, E_Table[45] = 31, E_Table[46] = 32, E_Table[47] = 1;
P_Table[0] =16, P_Table[1] = 7, P_Table[2] = 20, P_Table[3] = 21, P_Table[4] = 29, P_Table[5] =12, P_Table[6] =28, P_Table[7] =17, P_Table[8] = 1, P_Table[9] = 15, P_Table[10] = 23, P_Table[11] = 26, P_Table[12] = 5, P_Table[13] = 18, P_Table[14] = 31, P_Table[15] = 10,
P_Table[16] =2, P_Table[17] = 8, P_Table[18] = 24, P_Table[19] = 14, P_Table[20] = 32, P_Table[21] = 27, P_Table[22] = 3, P_Table[23] = 9, P_Table[24] = 19, P_Table[25] = 13, P_Table[26] = 30, P_Table[27] = 6, P_Table[28] = 22, P_Table[29] = 11, P_Table[30] = 4, P_Table[31] = 25;
PC1_Table[0] = 57, PC1_Table[1] = 49, PC1_Table[2] = 41, PC1_Table[3] = 33, PC1_Table[4] = 25, PC1_Table[5] = 17, PC1_Table[6] = 9, PC1_Table[7] = 1, PC1_Table[8] = 58, PC1_Table[9] = 50, PC1_Table[10] = 42, PC1_Table[11] = 34, PC1_Table[12] = 26, PC1_Table[13] = 18,
PC1_Table[14] = 10, PC1_Table[15] = 2, PC1_Table[16] = 59, PC1_Table[17] = 51, PC1_Table[18] = 43, PC1_Table[19] = 35, PC1_Table[20] = 27, PC1_Table[21] = 19, PC1_Table[22] = 11, PC1_Table[23] = 3, PC1_Table[24] = 60, PC1_Table[25] = 52, PC1_Table[26] = 44, PC1_Table[27] = 36,
PC1_Table[28] = 63, PC1_Table[29] = 55, PC1_Table[30] = 47, PC1_Table[31] = 39, PC1_Table[32] = 31, PC1_Table[33] = 23, PC1_Table[34] = 15, PC1_Table[35] = 7, PC1_Table[36] = 62, PC1_Table[37] = 54, PC1_Table[38] = 46, PC1_Table[39] = 38, PC1_Table[40] = 30, PC1_Table[41] = 22,
PC1_Table[42] = 14, PC1_Table[43] = 6, PC1_Table[44] = 61, PC1_Table[45] = 53, PC1_Table[46] = 45, PC1_Table[47] = 37, PC1_Table[48] = 29, PC1_Table[49] = 21, PC1_Table[50] = 13, PC1_Table[51] = 5, PC1_Table[52] = 28, PC1_Table[53] = 20, PC1_Table[54] = 12, PC1_Table[55] = 4;
PC2_Table[0]=14, PC2_Table[1]=17, PC2_Table[2]=11, PC2_Table[3]=24, PC2_Table[4]= 1, PC2_Table[5]= 5, PC2_Table[6]= 3, PC2_Table[7]=28,PC2_Table[8]= 15,PC2_Table[9]= 6,PC2_Table[10]= 21,PC2_Table[11]= 10,
PC2_Table[12]=23,PC2_Table[13]= 19, PC2_Table[14]=12, PC2_Table[15]=4, PC2_Table[16]=26, PC2_Table[17]= 8, PC2_Table[18]=16, PC2_Table[19]= 7, PC2_Table[20]=27,PC2_Table[21]= 20,PC2_Table[22]= 13, PC2_Table[23]= 2,
PC2_Table[24]=41, PC2_Table[25]=52, PC2_Table[26]=31, PC2_Table[27]=37, PC2_Table[28]=47, PC2_Table[29]=55, PC2_Table[30]=30, PC2_Table[31]=40,PC2_Table[32]= 51, PC2_Table[33]=45, PC2_Table[34]=33, PC2_Table[35]=48,
PC2_Table[36]=44, PC2_Table[37]=49, PC2_Table[38]=39, PC2_Table[39]=56, PC2_Table[40]=34, PC2_Table[41]=53, PC2_Table[42]=46, PC2_Table[43]=42, PC2_Table[44]=50, PC2_Table[45]=36, PC2_Table[46]=29, PC2_Table[47]=32;
LOOP_Table[0] = 1,LOOP_Table[1] = 1,LOOP_Table[2] = 2,LOOP_Table[3] = 2,LOOP_Table[4] = 2,LOOP_Table[5] = 2,LOOP_Table[6] = 2,LOOP_Table[7] = 2,LOOP_Table[8] = 1,LOOP_Table[9] = 2,LOOP_Table[10] = 2,LOOP_Table[11] = 2,LOOP_Table[12] = 2,LOOP_Table[13] = 2,LOOP_Table[14] = 2,LOOP_Table[15] = 1;
VM_END
}
CEncrypt::~CEncrypt(void)
{
}
void CEncrypt::Rand_key(char key[16])
{
VM_START_WITHLEVEL(23)
srand((unsigned)time(NULL));
for(int i=0; i<16; ++i)
{
key[i] = rand() & 0x7F;
}
VM_END
}
bool CEncrypt::Des_Go(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type)
{
VM_START_WITHLEVEL(20)
if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) )
return false;
SetKey(Key, keylen);
if( !Is3DES ) { // 1次DES
for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8)
DES(Out, In, &SubKey[0], Type);
} else{ // 3次DES 加密:加(key0)-解(key1)-加(key0) 解密::解(key0)-加(key1)-解(key0)
for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8) {
DES(Out, In, &SubKey[0], Type);
DES(Out, Out, &SubKey[1], !Type);
DES(Out, Out, &SubKey[0], Type);
}
}
VM_END
return true;
}
void CEncrypt::SetKey(const char* Key, int len)
{
VM_START_WITHLEVEL(19)
memset(deskey, 0, 16);
memcpy(deskey, Key, len>16?16:len);
SetSubKey(&SubKey[0], &deskey[0]);
Is3DES = len>8 ? (SetSubKey(&SubKey[1], &deskey[8]), true) : false;
VM_END
}
void CEncrypt::DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type)
{
VM_START_WITHLEVEL(18)
static bool M[64], tmp[32], *Li=&M[0], *Ri=&M[32];
ByteToBit(M, In, 64);
Transform(M, M, IP_Table, 64);
if( Type == ENCRYPT ){
for(int i=0; i<16; ++i) {
memcpy(tmp, Ri, 32);
F_func(Ri, (*pSubKey)[i]);
Xor(Ri, Li, 32);
memcpy(Li, tmp, 32);
}
}else{
for(int i=15; i>=0; --i) {
memcpy(tmp, Li, 32);
F_func(Li, (*pSubKey)[i]);
Xor(Li, Ri, 32);
memcpy(Ri, tmp, 32);
}
}
Transform(M, M, IPR_Table, 64);
BitToByte(Out, M, 64);
VM_END
}
void CEncrypt::SetSubKey(PSubKey pSubKey, const char Key[8])
{
VM_START_WITHLEVEL(22)
static bool K[64], *KL=&K[0], *KR=&K[28];
ByteToBit(K, Key, 64);
Transform(K, K, PC1_Table, 56);
for(int i=0; i<16; ++i)
{
RotateL(KL, 28, LOOP_Table[i]);
RotateL(KR, 28, LOOP_Table[i]);
Transform((*pSubKey)[i], K, PC2_Table, 48);
}
VM_END
}
void CEncrypt::F_func(bool In[32], const bool Ki[48])
{
VM_START_WITHLEVEL(21)
static bool MR[48];
Transform(MR, In, E_Table, 48);
Xor(MR, Ki, 48);
S_func(In, MR);
Transform(In, In, P_Table, 32);
VM_END
}
void CEncrypt::S_func(bool Out[32], const bool In[48])
{
VM_START_WITHLEVEL(20)
for(char i=0,j,k; i<8; ++i,In+=6,Out+=4)
{
j = (In[0]<<1) + In[5];
k = (In[1]<<3) + (In[2]<<2) + (In[3]<<1) + In[4];
ByteToBit(Out, &S_Box[i][j][k], 4);
}
VM_END
}
void CEncrypt::Transform(bool *Out, bool *In, const char *Table, int len)
{
VM_START_WITHLEVEL(19)
for(int i=0; i<len; ++i)
Tmp[i] = In[ Table[i]-1 ];
memcpy(Out, Tmp, len);
VM_END
}
void CEncrypt::Xor(bool *InA, const bool *InB, int len)
{
VM_START_WITHLEVEL(23)
for(int i=0; i<len; ++i)
InA[i] ^= InB[i];
VM_END
}
void CEncrypt::RotateL(bool *In, int len, int loop)
{
VM_START_WITHLEVEL(30)
memcpy(Tmp, In, loop);
memcpy(In, In+loop, len-loop);
memcpy(In+len-loop, Tmp, loop);
VM_END
}
void CEncrypt::ByteToBit(bool *Out, const char *In, int bits)
{
VM_START_WITHLEVEL(28)
for(int i=0; i<bits; ++i)
Out[i] = (In[i>>3]>>(i&7)) & 1;
VM_END
}
void CEncrypt::BitToByte(char *Out, const bool *In, int bits)
{
VM_START_WITHLEVEL(29)
memset(Out, 0, bits>>3);
for(int i=0; i<bits; ++i)
Out[i>>3] |= In[i]<<(i&7);
VM_END
}
//根据文件的路径进行加密解密
bool CEncrypt::Des_GoFile(const CString& strFilePath,char *MyKey,BOOL isEncrypt)
{
//CFile File(strFilePath, CFile::shareDenyNone);
CFile File;
File.Open(strFilePath,CFile::modeReadWrite);
Des_GoFile(File,MyKey,isEncrypt);
return true;
}
//根据文件对象进行加密解密
bool CEncrypt::Des_GoFile(CFile& File,char *MyKey,BOOL isEncrypt)
{
CString str="";
CString midStr="";
char Buffer[1000000]={0};
try
{
UINT length;
length =(UINT)File.GetLength();
File.Read( Buffer, length);
if(isEncrypt==0)
{
//Des_Go((char *)Buffer,(char *)Buffer ,length, MyKey, 16, ENCRYPT);
for(int i=0;i<length;i++)
{
Buffer[i]=Buffer[i]-1;
}
}
else
{
//Des_Go((char *)Buffer,(char *)Buffer ,length, MyKey, 16, ENCRYPT);
for(int i=0;i<length;i++)
{
Buffer[i]=Buffer[i]+1;
}
}
File.SeekToBegin();
File.Write(Buffer,length);
File.Close();
}
//report any file exceptions in debug mode only
catch (CFileException* e )
{
TRACE0(" CFileException caught");
throw e;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -