typedef unsigned long DWORD;
typedef unsigned char BYTE;
//加解密常量
const DWORD c_dwConst = 0x61C88647;
void yt_code(BYTE* pDst, BYTE* pSrc,int nSrcLen);
void yt_encode(BYTE* pDst, BYTE* pSrc, int nSrcLen);
//加解密KEY数组,全局变量
DWORD g_dwKeyArray[4];
int main()
{
BYTE byKey1[] = {0x5D, 0x42, 0x73, 0x50, 0x59, 0x7E, 0x7F, 0x7C, 0x45, 0x3A, 0x4B, 0x38, 0x41, 0x76, 0x47, 0x74};
BYTE byKey2[] = {0x34, 0x80, 0x1C, 0x64, 0xEE, 0x26, 0xA6, 0xCB, 0x24, 0x8F, 0x69, 0xAF, 0x41, 0x0B, 0x73, 0x4C};
BYTE byKey3[] = {0xE4 ,0x55 ,0xAA ,0xD2 ,0xB1 ,0x3E ,0x9C ,0xED ,0x5A ,0xD3 ,0x69 ,0xAF ,0x41 ,0x0B ,0x73 ,0x4C};
//赋值给KEY数组
for(int i = 0 ; i < 4 ; i++)
memcpy((BYTE*)&g_dwKeyArray[i],byKey2 + i * 4, 4);
//加密测试
BYTE pTest1[24] = {0x5 ,0x0 ,0x31 ,0x32 ,0x33 ,0x34 ,0x35 ,0x36 ,0x0 ,0x0 ,0x0 ,0x31 ,0x32 ,0x33 ,0x34 ,0x35 ,0x36 ,0x0 ,0x0 ,0x0 ,0x0 ,0x0 ,0x0 ,0x0};
BYTE* pTestRes1 = new BYTE[24]();
yt_code(pTestRes1, pTest1,24);
delete pTestRes1;
//解密测试
BYTE pTest2[8] = {0x7, 0x52, 0xC0, 0x80, 0x6D, 0x62, 0xF4, 0xA9};
BYTE* pTestRes2 = new BYTE[8]();
yt_encode(pTestRes2,pTest2,8);
delete pTestRes2;
return 0;
}
void yt_code(BYTE* pDst, BYTE* pSrc,int nSrcLen)
{
int nCnt = nSrcLen >> 3;
DWORD dwBeg, dwBack;
DWORD dwTempA, dwTempB, dwTempC;
for(int i = 0; i < nCnt; i++)
{
memcpy((BYTE*)&dwBeg,pSrc + i * 8,4);
memcpy((BYTE*)&dwBack,pSrc + i * 8 + 4 ,4);
DWORD dwEsi = 0;
for(int j = 16; j >0; j--)
{
dwTempA = dwBack + dwEsi;
dwTempB = dwTempA ^ g_dwKeyArray[0];
dwTempA = dwBack << 4;
dwTempB += dwTempA;
dwTempA = dwBack >> 5;
dwTempA += g_dwKeyArray[1];
dwTempC = dwTempB ^ dwTempA;
dwBeg += dwTempC;
dwEsi -= c_dwConst;
dwTempA = dwBeg + dwEsi;
dwTempB = dwTempA ^ g_dwKeyArray[2];
dwTempA = dwBeg << 4;
dwTempB += dwTempA;
dwTempA = dwBeg >> 5;
dwTempA += g_dwKeyArray[3];
dwTempC = dwTempB ^ dwTempA;
dwBack += dwTempC;
}
memcpy(pDst + i * 8,(BYTE*)&dwBeg,4);
memcpy(pDst + i * 8 + 4,(BYTE*)&dwBack,4);
}
return;
}
void yt_encode(BYTE* pDst, BYTE* pSrc, int nSrcLen)
{
int nCnt = nSrcLen >> 3;
DWORD dwBeg, dwBack;
DWORD dwTempA, dwTempB, dwTempC;
for(int i = 0 ; i < nCnt ; i++)
{
memcpy((BYTE*)&dwBeg,pSrc + i * 8, 4);
memcpy((BYTE*)&dwBack,pSrc + i * 8 + 4 ,4);
DWORD dwEsi = 0xE3779B90;
for(int n = 16; n > 0; n--)
{
dwTempA = dwBeg + dwEsi;
dwTempB = dwTempA ^ g_dwKeyArray[2];
dwTempA = dwBeg << 4;
dwTempB += dwTempA;
dwTempA = dwBeg >> 5;
dwTempA += g_dwKeyArray[3];
dwEsi +=c_dwConst;
dwTempC = dwTempB ^ dwTempA;
dwBack -= dwTempC;
dwTempA = dwBack + dwEsi;
dwTempB = dwTempA ^ g_dwKeyArray[0];
dwTempA = dwBack << 4;
dwTempB += dwTempA;
dwTempA = dwBack >> 5;
dwTempA += g_dwKeyArray[1];
dwTempC = dwTempB ^ dwTempA;
dwBeg -= dwTempC;
}
memcpy(pDst + i * 8,(BYTE*)&dwBeg, 4);
memcpy(pDst + i * 8 + 4,(BYTE*)&dwBack, 4);
}
return;
}
metin C++加解密算法
最新推荐文章于 2023-03-25 21:00:47 发布