metin C++加解密算法

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值