将XOR加密代码移植到PHP

时间:2013-12-06 01:29:58

标签: c++ xor

我通常在某处找到答案,但我无法从现有问题中找到答案。如果我在其他地方错过了答案,我会道歉..

这是我的C ++代码:

    char key[4] = "abc";

for (int temp = 0; temp < original.size(); temp++){
    encrypted += original[temp] ^ (int(key) + temp) % 255;
}
cout << int(key) << endl;
cout << "Encrypted data = " << encrypted << endl;

for (int temp = 0; temp < original.size(); temp++){
    unencrypted += encrypted[temp] ^ (int(key) + temp) % 255;
}

cout << "Unencrypted data = " << unencrypted << endl;

返回一长串随机字符(例如♧)。

我尝试将XOR加密转换为PHP:

<?php
$input = "ONEWORD";
$encrypted = "";
$unencrypted = "";

$key = "abc";

$ascii = NULL;

for ($i = 0; $i < strlen($string); $i++) 
{ 
$ascii += ord($string[$i]); 
}


for($i = 0; $i < sizeof($input); $i++)
{
    $encrypted+= $input[$i] ^ ($ascii + $i) % 255;
}
echo($encrypted);
echo(ord($key));

    for($i = 0; $i < sizeof($input); $i++)
{
    $unencrypted+= $encrypted[$i] ^ ($ascii + $i) % 255;
}

echo($unencrypted);
?>

虽然这会返回一个简单的0970。 我不太确定我哪里出错了,有人能引导我朝正确的方向前进吗?

由于

2 个答案:

答案 0 :(得分:2)

C ++代码中的这一行是假的:

    encrypted += original[temp] ^ (int(key) + temp) % 255;

这不符合你的想法。 int(key)key投射到int。在这种情况下,key将衰减为一个指针,所以你根本没有得到密钥,你得到一个指向密钥的指针的整数表示。

你可能想要的是:

    encrypted += char(original[temp] ^ key[temp % 3]);

这将使用键的第一个字符对字符串的第一个字符进行异或,使用键的第二个字符对字符串的第二个字符进行异或,并使用键的第三个字符对字符串的第三个字符进行异或。此后,它将循环显示键中的三个字符,然后将它们应用于输入的每个字符。

您需要对解密代码进行类似的更改:

    unencrypted += char(encrypted[temp] ^ key[temp % 3]);

在PHP中,要使用单个字符值,您需要使用ord运算符将字符转换为整数,并使用chr运算符将整数转换回字符。

    $encrypted += chr( ord( $input[$i] ) ^ ord( $key[$i % 3] ) );

同样对于解密:

    $decrypted += chr( ord( $encrypted[$i] ) ^ ord( $key[$i % 3] ) );

答案 1 :(得分:1)

首先,您的C ++代码....

int(key)可能没有达到您的预期。它将key数组降级为指针并将指针值转换为整数。也许你打算做int(*(int*)key)

如果您确实希望它像您在PHP中编写的代码一样工作,那么您将不得不修改key计算:

int keyval = 0;
for( unsigned char *p = key; *p; p++ ) keyval += *p;
然而,这不是一个非常强大的关键。无论密钥字符的出现顺序如何,它都是相同的值。

现在到PHP。

您应该使用ord获取字符值,然后进行计算,然后在追加到字符串之前使用chr转换回字符:

$encrypted += chr( ord($input[$i]) ^ ($ascii + $i) % 255 );

最后一个观察......在你的两个代码示例中,我想知道你的意思是256而不是255的模数。