gpt4 book ai didi

javascript - 为什么这个简单的 JavaScript XOR 加密算法不起作用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:10:48 25 4
gpt4 key购买 nike

我正在尝试用 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 onethis onethis one ,但我仍然无法解决这个问题。

为什么这个 JavaScript 算法没有按预期工作?


注意事项 1: 由于在 JavaScript 中无法遍历字符串的字符并逐个替换它们,因此我在内部使用了 += 运算符for 循环,以便将每个异或运算的输出附加到 result 变量。

小注2:为了规范化字符集,函数实际上返回了base64_encode($result)btoa(result)分别在 PHP 和 JS 中。然后,为了对其进行解密,decryptXor() 函数必须在遍历它们之前对 result 变量进行解码。尽管如此,由于这与问题无关,所以我稍微简化了功能。在这种情况下,出于测试目的,在 text 变量中仅使用字母数字字符而在 key 变量中仅使用数字(反之亦然)更为安全。

最佳答案

您需要一些其他方法,例如 String#charCodeAtString.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com