【问题标题】:Reconstructing a XORed UTF-8 encoded text in javascript, client side, no Node在 javascript、客户端、无节点中重建 XORed UTF-8 编码文本
【发布时间】:2017-11-12 03:43:05
【问题描述】:

我正在疯狂地尝试在 JavaScript 中实现这一点。 首先我会描述场景,然后我会放上我的代码,Python 版本,我似乎无法翻译成 JavaScript。

我有一个在服务器上运行的网页。我无法访问它,所以实现基本功能的唯一方法是使用 JavaScript。 该网页用于比较信息。信息以 CSV 格式存储,我使用该格式通过 AJAX 调用即时创建 HTML 表格。为了不让用户快速获得这些信息,使他们能够打印源代码并“窃取”,我遇到了一系列解决方案,例如 Base64 编码(我知道这被认为是“默默无闻的安全性”和这是一个不好的做法,但我在这里别无选择)。

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

所以这里出现了首选的解决方案,它就像 Python 中的一个魅力:使用按位异或。使用这种方法我能达到什么目的:

  • 如果有人知道 CSV 文件的 url,那么如果没有基本的编程知识来对其进行解码,阅读文本就不会那么容易了。
  • 我可以轻松地对源数据库进行编程以导出数据,然后运行 ​​XORing 函数,将这些文件上传到服务器,然后也可以即时对它们进行解码。

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

这是我的 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中实现那个小解码功能。 提前感谢大家的时间。

【问题讨论】:

    标签: javascript python encoding utf-8 client-side


    【解决方案1】:

    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.
    

    这里没有丢失任何字符。

    异或法

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

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

    不过,我没有为此提供代码。 特别是第三步可能有点麻烦,我不确定是否值得痛苦。 毕竟,您的用户只需检查 JS 代码即可了解数据是如何“加密”的,无论是 base64 还是 XOR 方法。

    注意

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

    【讨论】:

    • 非常感谢您的时间和解释。我将编辑我的原始帖子,添加我在 Base64 和字符编码方面的经验(Python 和 Javascript 之间的差异)。再次感谢!
    猜你喜欢
    • 2021-04-27
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多