我正在通过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
答案 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);