简单的字节移位器不以正确的方式解密数据

时间:2014-10-26 06:34:28

标签: visual-c++ encryption byte shift

我不认为有一天我会在这里问一个问题,但是看到这里有非常优秀和有才华的程序员,我可能有机会解决我的问题...... 我正在使用一个由朋友制作的简单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;
}

1 个答案:

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

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