【发布时间】:2018-09-22 04:29:32
【问题描述】:
我正在尝试在 JavaScript 中开发一个(非常)简单的 XOR 加密算法。
在 PHP 中,以下加密算法按预期工作:
function encryptXor($text, $key) {
$result = '';
for ($i = 0; $i < strlen($text); $i++)
$result[$i] = $text[$i] ^ $key[$i % strlen($key)];
return $result;
}
但是,以下 JavaScript 算法无法正常工作:
function encryptXor(text, key) {
var result = '';
for(var i = 0; i < text.length; i++)
result += text.charAt(i) ^ key.charAt(i % key.length);
return result;
}
一个测试用例如下:
Text: someRandomText
Key: 123456789
PHP output: B]^QgWY\V\fVLA
JS output: 12345678912345
显然,^ 运算符在两种语言之间的行为不同。
我发现了一些关于 PHP 和 JavaScript 的 ^ 运算符的区别的问题,例如 this one、this one 或 this one,但我仍然无法解决这个问题。
为什么这个 JavaScript 算法没有按预期工作?
小注 1: 由于无法在 JavaScript 中遍历字符串的字符并逐个替换它们,因此我在 for 循环中使用了 += 运算符为了将每个 XOR 操作的输出附加到 result 变量。
小注2:为了规范化字符集,函数在PHP和JS中实际上分别返回base64_encode($result)和btoa(result)。然后,为了解密它,decryptXor() 函数必须在迭代它们之前解码result 变量。尽管如此,由于这与问题无关,因此我稍微简化了功能。在这种情况下,出于测试目的,在text 变量中仅使用字母数字字符,在key 变量中仅使用数字(反之亦然)会更安全。
【问题讨论】:
标签: javascript xor