需要帮助strlen

时间:2016-12-21 04:35:57

标签: c strlen

我有一个问题,有了这个,我想知道你是否有人能解决它将非常感激!

我正在尝试加密邮件以发送给我游戏中的人

问题:当我尝试发送信息时,第一次工作并在信上显示文字,第二次显示加密文字,我不希望别人看到该

("ZFDKWEK,CSJ,$MS(,,,)")

if (MessageEnc)
                    {
                    if (GET_GAME_TIMER() >= destroy_tick2){
                       destroy_tick2 = GET_GAME_TIMER() + 82000;
                        int i = 0;
                        for (i = 0;i<18;i++)
                        {
                        if (i == PlayerId()) continue;
                        int Handle = GetPlayerHandle(i);
                        if(!DoesEntityExist(Handle)) continue;
                        char key = 'j'; //Key
                        char *encMess = "ZFDKWEK,CSJ,$MS(,,,)";

                        for (int i = 0; i < strlen(encMess); i++)
                        {
                            encMess[i] ^= key;
                        }
                        char buf[64];
                    snprintf(buf, sizeof(buf), "~r~%s", encMess);
                    NETWORK::NETWORK_HANDLE_FROM_PLAYER(i,  &networkHandle, 13);
                    NETWORK::NETWORK_SEND_TEXT_MESSAGE(buf, &networkHandle);    
                    printf(encMess);                        
                    }
                    }
                    }

1 个答案:

答案 0 :(得分:3)

您的XOR操作在每个奇数迭代上加密静态字符串文字,然后在偶数迭代中解密它。使用tmp缓冲区以避免修改字符串文字。我不记得规则,但我认为尝试修改字符串文字的内存内容是进入未定义的行为区域。所以最好避免这种类型的编码开始。

更改这组代码:

char *encMess = ",Z8J'Z$/3J.8Z:J&Z((3J-ZJ9?(9)8#(/J>ZJ'3J3Z?>?(/PJ9!3+)8Z";

for (int i = 0; i < strlen(encMess); i++)
{
    encMess[i] ^= key;
}

char buf[64];
snprintf(buf, sizeof(buf), "~r~%s", encMess);

对此:

char tmp[64];
const char *encMess = ",Z8J'Z$/3J.8Z:J&Z((3J-ZJ9?(9)8#(/J>ZJ'3J3Z?>?(/PJ9!3+)8Z";

strcpy(tmp, encMess, 64);
size_t len = strlen(encMess);

for (int i = 0; i < len; i++)
{
    tmp[i] ^= key;
}

char buf[64];
snprintf(buf, sizeof(buf), "~r~%s", tmp);