我不认为有一天我会在这里问一个问题,但是看到这里有非常优秀和有才华的程序员,我可能有机会解决我的问题...... 我正在使用一个由朋友制作的简单BYTE移位器来加密像C1,C2,C3,C4(用于游戏)的数据包。 CLIENT SIDE的加密部分工作正常,我绕道了send(),然后调用crypt程序。 来自SERVER端的解密部分根本不行,我测试了接收,它接收到从CLIENT发送的相同加密数据包,但是在调用解密程序之后它就是这样做的。 在服务器端,我在IOCP :: RecvDataParse中使用了解密。 这是程序:
inline void process_data(const PROCESS_TYPE type, const BYTE (* keys)[KEYS_NUMBER], BYTE * pData, const unsigned int uLen)
{
assert(pData != NULL);
assert(type >= 0);
assert(type <= 1);
for (unsigned int i = 0; i < uLen; ++i)
{
pData[i] = keys[type][pData[i]];
}
}
我称之为
process_data(DECRYPT,client_keys,lpIOContext-&gt; Buffer,lpIOContext-&gt; nSentBytes);
好的,结果如下:
原始数据包:C1 06 A9 20 9C 2F
加密数据包可以:81 6f 4e 07 b8 89
解密结果包:d5 b3 ee f6 c3 8d
那么有人可以告诉我我做错了什么吗?它已经过了几个小时的测试,我什么都没有......
LE:我认为如果我发布我正在调用函数的地方会更好......也许我错了?
bool IOCP::RecvDataParse(_PER_IO_CONTEXT * lpIOContext, int uIndex)
{
bool bReturn = true;
// ----
UCHAR* recvbuf = lpIOContext->Buffer;
int lOfs = 0;
int size = 0;
BYTE headcode = 0x00;
BYTE xcode = 0x00;
// ----
if(lpIOContext->nSentBytes < 3)
{
bReturn = false;
}
// ----
for (int i = 0; i < lpIOContext->nSentBytes; ++i)
{
OnError("ENCRYPTED : %02X", (BYTE) recvbuf[i]);
}
while(true && bReturn)
{
process_data(DECRYPT, client_keys, recvbuf, lpIOContext->nSentBytes);
//
for (int i = 0; i < lpIOContext->nSentBytes; ++i)
{
OnError("DECRYPTED : %02X", (BYTE) recvbuf[i]);
}
//OnError("[%s][DECRYPT] :: (Packets) %02X", m_Name, (BYTE) recvbuf);
if((recvbuf[lOfs+0] == 0xC1) || (recvbuf[lOfs+0] == 0xC3))
{
size = recvbuf[lOfs+1];
headcode = recvbuf[lOfs+2];
xcode = recvbuf[lOfs+0];
}
else if((recvbuf[lOfs+0] == 0xC2) || (recvbuf[lOfs+0] == 0xC4))
{
size = recvbuf[lOfs+1] * 256;
size |=recvbuf[lOfs+2];
headcode = recvbuf[lOfs+3];
xcode = recvbuf[lOfs+0];
}
else
{
OnError("[%s][RecvDataParse] :: (ParseHeaderPacket) faill size %d headcode %x xcode %x", m_Name, size, headcode, xcode);
// ----
bReturn = false;
// ----
break;
}
if(size <= 0)
{
OnError("[%s][RecvDataParse] :: (RecvDataParse) size %d", m_Name, size);
// ----
bReturn = false;
// ----
//CloseClient(lpIOContext->Buffer);
break;
}
// ----
if(size <= lpIOContext->nSentBytes)
{
OnRecv(uIndex, headcode, &recvbuf[lOfs], size);
// ----
lOfs += size;
lpIOContext->nSentBytes -= size;
// ----
if(lpIOContext->nSentBytes <= 0)
{
break;
}
}
else if(lOfs > 0)
{
if(lpIOContext->nSentBytes < 1)
{
OnError("[%s][RecvDataParse] :: (RecvDataParse) recvbuflen 1 %s %d", m_Name, __FILE__, __LINE__);
// ----
break;
}
// ----
if(lpIOContext->nSentBytes < MAX_IO_BUFFER_SIZE)
{
memcpy(recvbuf, &recvbuf[lOfs], lpIOContext->nSentBytes);
// ----
OnError("[%s][RecvDataParse] :: (RecvDataParse) Message copy %d", m_Name, lpIOContext->nSentBytes);
}
// ----
break;
}
else
{
break;
}
}
// ----
return bReturn;
}
答案 0 :(得分:1)
首先,你所写的一切都没有意义。
Byte Encryption(主要使用XOR加密)的一个例子是:
#define MAX_PACKET_LENGTH 2048
char encrypt(char *String,char *Key) {
char output[MAX_LENGTH];
for (int i = 0; i < sizeof(String); i++)
output[i] = toEncrypt[i] ^ key;
return output;
}
string decrypt(char *String,char *Key) {
char output[MAX_LENGTH];
for (int i = 0; i < sizeof(String); i++)
output[i] = String[i] ^ key;
return output;
}
请注意,加密/解密密钥必须相同。