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

标签 javascript xor

我正在尝试用 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/

相关文章:

math - XOR 在数学上有什么作用?

javascript - 如何查看HTML5视频时间更新前后?

javascript - 我无法从输入框中获取值

javascript - pdfMake.js中的表格和分页符,如何删除底部空行

c - 与字符执行 XOR 字节比较

java - 使用 Java 过滤器流通过 XOR 加密字符串

machine-learning - 在 Weka 中为 XOR 情况训练多层感知器的分步指南?

c++ - 转换 XOR 函数以返回 char* 而不是 string

javascript - 如何在 R Shiny 中查询元素

javascript - 幻灯片中的图像淡入淡出?