在 javascript 客户端重建异或 UTF-8 编码文本,无节点

Reconstructing a XORed UTF-8 encoded text in javascript, client side, no Node

我正在努力在 JavaScript 中实现这一目标。 首先我会描述场景,然后我会把我的代码,Python 版本,我似乎无法翻译成 JavaScript.

我在服务器上有一个网页 运行ning。我无法访问它,所以我必须实现基本功能的唯一方法是使用 JavaScript。 该网页用于比较信息。信息以 CSV 格式存储,我使用它通过 AJAX 调用动态创建 HTML 表。为了不让用户快速获得这些信息,使他们能够打印源代码和 'stealing it',我遇到了一系列解决方案,比如在 Base64 中编码(我知道这被认为是 'security by obscurity'这是一种不好的做法,但我别无选择。

Base64 在这种情况下非常容易使用,但我丢失了 UTF-8 中的所有特殊字符(如 á é í ó ú ñ 等),它们是我的语言(西班牙语)的一部分。

所以这里出现了首选解决方案,它在 Python 中非常有效:使用按位异或。使用此方法我可以实现什么:

就是在最后一步我无法实现我想要的。

这是我的 Python 脚本: 编码:

b = bytearray(open('file.csv', 'rb').read())

for i in range(len(b)):
    b[i] ^= 0x71

open('file.out', 'wb').write(b)

解码:

b = bytearray(open('file.out', 'rb').read())
for i in range(len(b)):
    b[i] ^= 0x71

我需要在JS中实现那个小小的解码功能。 提前感谢大家的宝贵时间。

Base64

base64 会让您丢失非 ASCII 字符,例如 ñá,这是不正确的。为什么要这样? Base64可以对任何二进制数据进行编码,编码后的文本就是二进制数据。

所以编码包括两个步骤: 文本编码(例如 UTF-8)将您的文本转换为字节,而 base64 编码将其转换为 ASCII 字符串。 解码工作相同,但向后(两个相应解码函数的相反顺序)。

这是 UTF-8 文本编码在 JavaScript 中的工作方式:

function encode_utf8(s) {
  return unescape(encodeURIComponent(s));
}

function decode_utf8(s) {
  return decodeURIComponent(escape(s));
}

我从 here 那里得到了这个。请注意,我根本不是 JS 高手,现在可能还有更方便的方法我找不到。

让我们试试这个:

s = 'Se bañó todo el día.';
b = encode_utf8(s);  # text encoding
a = btoa(b);         # base64 encoding
console.log(a);      # prints U2UgYmHDscOzIHRvZG8gZWwgZMOtYS4=

d = decode_utf8(atob(a));  # decode base64, then UTF-8
console.log(d);      # prints Se bañó todo el día.

这里没有丢失字符。

异或法

如果你还想做异或的事情,你可以解码如下:

  • 将 UTF8 编码的字符串转换为代码点数组 Array.from()
  • 使用 ^ 运算符(或 ^= 赋值)进行异或解码
  • 使用String.fromCodePoint()
  • 将结果转换为字符串
  • decode_utf8()
  • 解码字符串

不过,我没有为此提供代码。 尤其是第三步可能有点麻烦,不知道值不值得。 毕竟,您的用户可以通过检查 JS 代码来了解数据是如何 "encrypted",是 base64 还是 XOR 方法。

备注

如果您来自 Python 背景,请注意没有像 Python 的 strbytes 类型的区别。 {en,de}code_utf8() 函数的输入和输出始终是相同类型的字符串。当你对一个字符串进行编码时,你只会得到另一个字符串,其中每个代码点都低于 256,并且它可能比输入字符串长。