我正在尝试用 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
循环,以便将每个异或运算的输出附加到 result
变量。
小注2:为了规范化字符集,函数实际上返回了base64_encode($result)
和btoa(result)
分别在 PHP 和 JS 中。然后,为了对其进行解密,decryptXor()
函数必须在遍历它们之前对 result
变量进行解码。尽管如此,由于这与问题无关,所以我稍微简化了功能。在这种情况下,出于测试目的,在 text
变量中仅使用字母数字字符而在 key
变量中仅使用数字(反之亦然)更为安全。
最佳答案
您需要一些其他方法,例如 String#charCodeAt
或 String.fromCharCode
以获得相同的结果。
主要问题是,您需要一个数值而不是字符/字符串。
function encryptXor(text, key) {
var result = '';
for (var i = 0; i < text.length; i++) {
result += String.fromCharCode(text.charCodeAt(i) ^ key.charCodeAt(i % key.length));
}
return result;
}
console.log(encryptXor('someRandomText', '123456789')); // B]^QgWY\V\fVLA
一个更短的版本
function encryptXor(text, key) {
return Array.from(
text,
(c, i) => String.fromCharCode(c.charCodeAt() ^ key.charCodeAt(i % key.length))
).join('');
}
console.log(encryptXor('someRandomText', '123456789')); // B]^QgWY\V\fVLA
关于javascript - 为什么这个简单的 JavaScript XOR 加密算法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52450290/