我通常在某处找到答案,但我无法从现有问题中找到答案。如果我在其他地方错过了答案,我会道歉..
这是我的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。 我不太确定我哪里出错了,有人能引导我朝正确的方向前进吗?
由于
答案 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
的模数。