2

我打算为我的网络应用程序使用客户端 AES 加密。

现在,我一直在寻找将多字节字符分解为一个字节的方法-“非字符”,加密(具有相同的加密文本长度),

将它们解密,将那些单字节“非字符”转换回多字节字符。

我已经看过 UTF-8(JS 的默认编码?)和 UTF-16 的 wiki,但我不知道如何检测“碎片化”多字节字符以及如何将它们组合回来。

谢谢 : )

4

2 回答 2

7

JavaScript 字符串是 UTF-16 存储在 16 位“字符”中。对于需要超过 16 位的 Unicode 字符(“代码点”)(某些代码点在 UTF-16 中需要 32 位),每个 JavaScript“字符”实际上只是代码点的一半。

因此,要将 JavaScript 字符“分解”为字节,只需获取字符代码并将高字节和低字节分开:

var code = str.charCodeAt(0); // The first character, obviously you'll have a loop
var lowbyte = code & 0xFF;
var highbyte = (code & 0xFF00) >> 8;

(尽管 JavaScript 的数字是浮点数,但位运算符以 32 位整数工作,当然在我们的例子中只有 16 位是相关的。)

您永远不会有奇数个字节,因为这又是 UTF-16。

于 2013-08-05T12:04:20.720 回答
2

您可以简单地转换为 UTF8... 例如通过使用这个技巧

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

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

考虑到您使用的是crypto-js,您可以使用其方法转换为 utf8 并返回字符串。见这里

var words = CryptoJS.enc.Utf8.parse('');
var utf8  = CryptoJS.enc.Utf8.stringify(words);

这可能是 Utf8 字符的拙劣示例。

通过查看其他示例(请参阅 Latin1 示例),我会说parse您将字符串转换为 Utf8(从技术上讲,您将其转换为 Utf8 并放入加密 js 使用的 WordArray 类型的特殊数组)和结果可以传递给 Aes 编码算法,并与stringify您一起将 WordArray(例如通过解码算法获得)转换为 Utf8。

JsFiddle 示例:http: //jsfiddle.net/UpJRm/

于 2013-08-05T12:08:04.273 回答