XOR字符串在PHP中与键是一个整数

时间:2018-02-21 07:03:20

标签: php c++ xor

我正在通过HTTP通过POST申请向我的服务器发出C++ sockets个请求,我将XORing POST我的C++应用程序发送到我的服务器之前的值。将这些XORed POST值发送到我的服务器后,我将需要能够解密'他们在处理我的服务器上的值之前。

我的C++申请目前为XORing strings,如此

char *XOR(char *string)
{
    //key = 0x10
    char buffer[1000] = { 0 };
    for (int i = 0; i < strlen(string); i++)
        buffer[i] = string[i] ^ 0x10;
    buffer[strlen(string)] = 0x00;
    return buffer;
    //yes I know, this function could be written much better. But that is not the point of this question...
}

现在在PHP我正在使用此功能XOR string

function XOR($string, $key)
{
    for($i = 0; $i < strlen($string); $i++) 
        $string[$i] = ($string[$i] ^ $key[$i % strlen($key)]);
    return $string;
}

我试过这样称呼它

$decryptedValue = XOR($_POST['postParam1'], "16");

就像这样

$decryptedValue = XOR($_POST['postParam1'], 16);

$decryptedValue中存储的值永远不会与XORed应用程序发送的C++值匹配

例如,如果XOR "test"我的C++应用程序中的密钥为0x10,则返回值为

0x64, 0x75, 0x63, 0x64

但如果我的服务器上有XOR "test",则返回值为

0x45, 0x53, 0x42, 0x42

1 个答案:

答案 0 :(得分:1)

您需要将字符转换为ord的整数,然后将其与$key进行异或(不使用键作为字符串),然后将其转换回chr的字符。否则,XOR是包含"16"的字符串的字符串值,显然不会达到相同的结果。

function encrypt($string, $key)
{
    for($i = 0; $i < strlen($string); $i++) 
            $string[$i] = chr(ord($string[$i]) ^ $key);
    return $string;
}

(我的PHP版本认为XOR是一个关键字,因此我将该函数重命名为加密)。

测试:

encrypt("test", 16);