Exemple #1
0
//解密数据
WORD CServerSocketItem::CrevasseBuffer(BYTE pcbDataBuffer[], WORD wDataSize)
{
	WORD i = 0;
	//效验参数
	ASSERT(wDataSize>=sizeof(CMD_Head));
	ASSERT(((CMD_Head *)pcbDataBuffer)->CmdInfo.wPacketSize==wDataSize);

	//调整长度
	WORD wSnapCount=0;
	if ((wDataSize%sizeof(DWORD))!=0)
	{
		wSnapCount=sizeof(DWORD)-wDataSize%sizeof(DWORD);
		memset(pcbDataBuffer+wDataSize,0,wSnapCount);
	}

	//提取密钥
	if (m_dwRecvPacketCount==0)
	{
		ASSERT(wDataSize>=(sizeof(CMD_Head)+sizeof(DWORD)));
		if (wDataSize<(sizeof(CMD_Head)+sizeof(DWORD))) throw TEXT("数据包解密长度错误");
		m_dwRecvXorKey=*(DWORD *)(pcbDataBuffer+sizeof(CMD_Head));
		m_dwSendXorKey=m_dwRecvXorKey;
		MoveMemory(pcbDataBuffer+sizeof(CMD_Head),pcbDataBuffer+sizeof(CMD_Head)+sizeof(DWORD),
			wDataSize-sizeof(CMD_Head)-sizeof(DWORD));
		wDataSize-=sizeof(DWORD);
		((CMD_Head *)pcbDataBuffer)->CmdInfo.wPacketSize-=sizeof(DWORD);
	}

	//解密数据
	DWORD dwXorKey=m_dwRecvXorKey;
	DWORD * pdwXor=(DWORD *)(pcbDataBuffer+sizeof(CMD_Info));
	WORD  * pwSeed=(WORD *)(pcbDataBuffer+sizeof(CMD_Info));
	WORD wEncrypCount=(wDataSize+wSnapCount-sizeof(CMD_Info))/4;
	for (i=0;i<wEncrypCount;i++)
	{
		if ((i==(wEncrypCount-1))&&(wSnapCount>0))
		{
			BYTE * pcbKey=((BYTE *)&m_dwRecvXorKey)+sizeof(DWORD)-wSnapCount;
			CopyMemory(pcbDataBuffer+wDataSize,pcbKey,wSnapCount);
		}
		dwXorKey=SeedRandMap(*pwSeed++);
		dwXorKey|=((DWORD)SeedRandMap(*pwSeed++))<<16;
		dwXorKey^=g_dwPacketKey;
		*pdwXor++^=m_dwRecvXorKey;
		m_dwRecvXorKey=dwXorKey;
	}

	//效验码与字节映射
	CMD_Head * pHead=(CMD_Head *)pcbDataBuffer;
	BYTE cbCheckCode=pHead->CmdInfo.cbCheckCode;;
	for (i=sizeof(CMD_Info);i<wDataSize;i++)
	{
		pcbDataBuffer[i]=MapRecvByte(pcbDataBuffer[i]);
		cbCheckCode+=pcbDataBuffer[i];
	}
	if (cbCheckCode!=0) throw TEXT("数据包效验码错误");

	return wDataSize;
}
Exemple #2
0
//加密数据
WORD CServerSocketItem::EncryptBuffer(BYTE pcbDataBuffer[], WORD wDataSize, WORD wBufferSize)
{
	WORD i = 0;
	//效验参数
	ASSERT(wDataSize>=sizeof(CMD_Head));
	ASSERT(wDataSize<=(sizeof(CMD_Head)+SOCKET_PACKET));
	ASSERT(wBufferSize>=(wDataSize+2*sizeof(DWORD)));

	//调整长度
	WORD wEncryptSize=wDataSize-sizeof(CMD_Info),wSnapCount=0;
	if ((wEncryptSize%sizeof(DWORD))!=0)
	{
		wSnapCount=sizeof(DWORD)-wEncryptSize%sizeof(DWORD);
		memset(pcbDataBuffer+sizeof(CMD_Info)+wEncryptSize,0,wSnapCount);
	}

	//效验码与字节映射
	BYTE cbCheckCode=0;
	for (i=sizeof(CMD_Info);i<wDataSize;i++) 
	{
		cbCheckCode+=pcbDataBuffer[i];
		pcbDataBuffer[i]=MapSendByte(pcbDataBuffer[i]);
	}

	//填写信息头
	CMD_Head * pHead=(CMD_Head *)pcbDataBuffer;
	pHead->CmdInfo.cbCheckCode=~cbCheckCode+1;
	pHead->CmdInfo.wPacketSize=wDataSize;
	pHead->CmdInfo.cbVersion=SOCKET_VER;

	//加密数据
	DWORD dwXorKey=m_dwSendXorKey;
	WORD * pwSeed=(WORD *)(pcbDataBuffer+sizeof(CMD_Info));
	DWORD * pdwXor=(DWORD *)(pcbDataBuffer+sizeof(CMD_Info));
	WORD wEncrypCount=(wEncryptSize+wSnapCount)/sizeof(DWORD);
	for (i=0;i<wEncrypCount;i++)
	{
		*pdwXor++^=dwXorKey;
		dwXorKey=SeedRandMap(*pwSeed++);
		dwXorKey|=((DWORD)SeedRandMap(*pwSeed++))<<16; 
		dwXorKey^=g_dwPacketKey;
	}

	//设置变量
	m_dwSendPacketCount++;
	m_dwSendXorKey=dwXorKey;

	return wDataSize;
}
Exemple #3
0
//解密数据
WORD CCNetDelegate::CrevasseBuffer(BYTE* pcbDataBuffer,WORD wDataSize)
{
    //调整长度
    WORD wSnapCount=0;
    if ((wDataSize%sizeof(DWORD))!=0)
    {
        wSnapCount=sizeof(DWORD)-wDataSize%sizeof(DWORD);
        memset(pcbDataBuffer+wDataSize,0,wSnapCount);
    }
    
    //解密数据
    DWORD dwXorKey=m_dwRecvXorKey;
    DWORD * pdwXor=(DWORD *)(pcbDataBuffer+4);
    WORD  * pwSeed=(WORD *)(pcbDataBuffer+4);
    WORD wEncrypCount=(wDataSize+wSnapCount-4)/4;
    for (WORD i=0;i<wEncrypCount;i++)
    {
        if ((i==(wEncrypCount-1))&&(wSnapCount>0))
        {
            BYTE * pcbKey=((BYTE *)&m_dwRecvXorKey)+sizeof(DWORD)-wSnapCount;
            memcpy(pcbDataBuffer+wDataSize,pcbKey,wSnapCount);
        }
        dwXorKey=SeedRandMap(*pwSeed++);
        dwXorKey|=((DWORD)SeedRandMap(*pwSeed++))<<16;
        dwXorKey^=g_dwPacketKey;
        *pdwXor++^=m_dwRecvXorKey;
        m_dwRecvXorKey=dwXorKey;
    }
    
    //效验码与字节映射
    struct CMD_Head * pHead=(struct CMD_Head *)pcbDataBuffer;
    BYTE cbCheckCode=pHead->CmdInfo.cbCheckCode;
    for (int i=4;i<wDataSize;i++)
    {
        pcbDataBuffer[i]=MapRecvByte(pcbDataBuffer[i]);
        cbCheckCode+=pcbDataBuffer[i];
    }
    //	if (cbCheckCode!=0) throw TEXT("数据包效验码错误");
    
    return wDataSize;
}
Exemple #4
0
//加密数据
WORD CTCPSocketService::EncryptBuffer(BYTE pcbDataBuffer[], WORD wDataSize, WORD wBufferSize)
{
	int i = 0;
	//效验参数
	ASSERT(wDataSize >= sizeof(CMD_Head));
	ASSERT(wBufferSize >= (wDataSize + 2*sizeof(DWORD)));
	ASSERT(wDataSize <= (sizeof(CMD_Head) + SOCKET_BUFFER));

	//调整长度
	WORD wEncryptSize = wDataSize - sizeof(CMD_Command), wSnapCount = 0;
	if ((wEncryptSize % sizeof(DWORD)) != 0)
	{
		wSnapCount = sizeof(DWORD) - wEncryptSize % sizeof(DWORD);
		memset(pcbDataBuffer + sizeof(CMD_Info) + wEncryptSize, 0, wSnapCount);
	}

	//效验码与字节映射
	BYTE cbCheckCode = 0;
	for (WORD i = sizeof(CMD_Info); i < wDataSize; i++)
	{
		cbCheckCode += pcbDataBuffer[i];
		pcbDataBuffer[i] = MapSendByte(pcbDataBuffer[i]);
	}

	//填写信息头
	CMD_Head * pHead = (CMD_Head *)pcbDataBuffer;
	pHead->CmdInfo.cbCheckCode = ~cbCheckCode + 1;
	pHead->CmdInfo.wPacketSize = wDataSize;
	pHead->CmdInfo.cbVersion = SOCKET_VER;

	//创建密钥
	DWORD dwXorKey = m_dwSendXorKey;
	if (m_dwSendPacketCount == 0)
	{
		//生成第一次随机种子
		GUID Guid;
		CoCreateGuid(&Guid);
		dwXorKey = GetTickCount() * GetTickCount();
		dwXorKey ^= Guid.Data1;
		dwXorKey ^= Guid.Data2;
		dwXorKey ^= Guid.Data3;
		dwXorKey ^= *((DWORD *)Guid.Data4);

		//随机映射种子
		dwXorKey = SeedRandMap((WORD)dwXorKey);
		dwXorKey |= ((DWORD)SeedRandMap((WORD)(dwXorKey >> 16))) << 16;
		dwXorKey ^= g_dwPacketKey;
		m_dwSendXorKey = dwXorKey;
		m_dwRecvXorKey = dwXorKey;
	}
Exemple #5
0
//加密数据
WORD CCNetDelegate::EncryptBuffer(BYTE* pcbDataBuffer,WORD wDataSize,WORD wBufferSize)
{
    //调整长度
    WORD wEncryptSize=wDataSize-4,wSnapCount=0;
    if ((wEncryptSize%sizeof(DWORD))!=0)
    {
        wSnapCount=sizeof(DWORD)-wEncryptSize%sizeof(DWORD);
        memset(pcbDataBuffer+4+wEncryptSize,0,wSnapCount);
        
    }
    
    //效验码与字节映射
    BYTE cbCheckCode=0;
    for (WORD i=4;i<wDataSize;i++)
    {
        cbCheckCode+=pcbDataBuffer[i];
        pcbDataBuffer[i]=MapSendByte(pcbDataBuffer[i]);
    }
    
    //填写信息头
    struct CMD_Head * pHead=(struct CMD_Head *)pcbDataBuffer;
    pHead->CmdInfo.cbCheckCode=~cbCheckCode+1;
    pHead->CmdInfo.wPacketSize=wDataSize;
    pHead->CmdInfo.cbVersion=0x66;
    
    //创建密钥
    DWORD dwXorKey=m_dwSendXorKey;
    if (m_dwSendPacketCount==0)
    {
        //生成第一次随机种子
        dwXorKey = rand();
        
        //随机映射种子
        dwXorKey=SeedRandMap((WORD)dwXorKey);
        dwXorKey|=((DWORD)SeedRandMap((WORD)(dwXorKey>>16)))<<16;
        dwXorKey^=g_dwPacketKey;
        m_dwSendXorKey=dwXorKey;
        m_dwRecvXorKey=dwXorKey;
    }