//加密数据 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; }
//加密数据 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; }
//加密数据 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; }