Visual c++ 简单字节移位器未正确解密数据

Visual c++ 简单字节移位器未正确解密数据,visual-c++,encryption,byte,shift,Visual C++,Encryption,Byte,Shift,我不认为有一天我会在这里问一个问题,但看到这里有非常好和有才华的编程人员,我可能有机会解决我的问题。。。 我正在使用一个朋友制作的简单字节移位器来加密像C1、C2、C3、C4这样的数据包(用于游戏)。 客户端的加密部分工作正常,我绕过send(),然后调用crypt过程。 服务器端的解密部分根本不正常,我测试了接收,它接收来自客户端的相同加密数据包,但在调用解密过程之后,它就做得很好。 在服务器端,我在IOCP::RecvDataParse中使用了解密。 程序如下: inline void pr

我不认为有一天我会在这里问一个问题,但看到这里有非常好和有才华的编程人员,我可能有机会解决我的问题。。。 我正在使用一个朋友制作的简单字节移位器来加密像C1、C2、C3、C4这样的数据包(用于游戏)。 客户端的加密部分工作正常,我绕过send(),然后调用crypt过程。 服务器端的解密部分根本不正常,我测试了接收,它接收来自客户端的相同加密数据包,但在调用解密过程之后,它就做得很好。 在服务器端,我在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]];
    }
}
内联无效进程数据(常量进程类型,常量字节(*键)[键编号],字节*数据,常量无符号整数)
{
断言(pData!=NULL);
断言(类型>=0);
断言(类型缓冲区,lpIOContext->nSentBytes)

好的,结果如下:

原始数据包:C1 06 A9 20 9C 2F

已加密的数据包是否正常:81 6f 4e 07 b8 89

解密的结果包:d5 b3 ee f6 c3 8d

有人能告诉我我做错了什么吗?经过几个小时的测试,我一无所获

乐:我想如果我把调用函数的地方贴出来会更好…也许我错了

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;
}
bool IOCP::RecvDataParse(_PER_IO_CONTEXT*lpIOContext,int-uIndex)
{
bool-bReturn=true;
// ----
UCHAR*recvbuf=lpIOContext->Buffer;
int-lOfs=0;
int size=0;
字节头码=0x00;
字节xcode=0x00;
// ----
if(lpIOContext->nSentBytes<3)
{
bReturn=false;
}
// ----
对于(int i=0;inSentBytes;++i)
{
OnError(“加密的:%02X”,(字节)recvbuf[i]);
}
while(true&&bReturn)
{
处理数据(解密、客户端密钥、recvbuf、lpIOContext->nSentBytes);
//
对于(int i=0;inSentBytes;++i)
{
OnError(“已解密:%02X”,(字节)recvbuf[i]);
}
//OnError(“[%s][DECRYPT]:(数据包)%02X”,m_名称,(字节)recvbuf);
if((recvbuf[lOfs+0]==0xC1)| |(recvbuf[lOfs+0]==0xC3))
{
大小=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;
尺寸|=recvbuf[lOfs+2];
headcode=recvbuf[lOfs+3];
xcode=recvbuf[lOfs+0];
}
其他的
{
OneError(“[%s][RecvDataParse]:(ParseHeaderPackage)故障大小%d头代码%x xcode%x”,m_名称、大小、头代码、xcode);
// ----
bReturn=false;
// ----
打破
}
if(大小缓冲区);
打破
}
// ----
if(大小N个字节)
{
OnRecv(uIndex、headcode和recvbuf[lOfs],size);
// ----
lOfs+=尺寸;
lpIOContext->nSentBytes-=大小;
// ----
如果(lpIOContext->nSentBytes 0)
{
if(lpIOContext->nSentBytes<1)
{
一个错误(“[%s][RecvDataParse]:(RecvDataParse)recvbuflen 1%s%d”,m_名称,u文件,u行);
// ----
打破
}
// ----
if(lpIOContext->nSentBytesnSentBytes);
// ----
OneError(“[%s][RecvDataParse]:(RecvDataParse)消息副本%d”,m_名称,lpIOContext->nSentBytes);
}
// ----
打破
}
其他的
{
打破
}
}
// ----
回程;
}

首先,你写的所有东西都毫无意义

字节加密(主要使用XOR加密)的示例如下:

#定义最大数据包长度2048
字符加密(字符*字符串,字符*密钥){
字符输出[最大长度];
for(int i=0;i

请注意,加密/解密密钥必须相同。

这是什么意思?我只是想在该函数中进行测试,因为我尝试绕过send()和recv(),这是相同的问题。客户端:处理数据(加密、客户端密钥、buf、len);服务器:处理数据(解密、客户端密钥、recvbuf、lpIOContext->nSentBytes);为什么解密时数据包会不同?这是我的问题…请帮帮我!如果有必要,我会付钱的!
#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;
}