我打算为我的网络应用程序使用客户端 AES 加密。
现在,我一直在寻找将多字节字符分解为一个字节的方法-“非字符”,加密(具有相同的加密文本长度),
将它们解密,将那些单字节“非字符”转换回多字节字符。
我已经看过 UTF-8(JS 的默认编码?)和 UTF-16 的 wiki,但我不知道如何检测“碎片化”多字节字符以及如何将它们组合回来。
谢谢 : )
我打算为我的网络应用程序使用客户端 AES 加密。
现在,我一直在寻找将多字节字符分解为一个字节的方法-“非字符”,加密(具有相同的加密文本长度),
将它们解密,将那些单字节“非字符”转换回多字节字符。
我已经看过 UTF-8(JS 的默认编码?)和 UTF-16 的 wiki,但我不知道如何检测“碎片化”多字节字符以及如何将它们组合回来。
谢谢 : )
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。
您可以简单地转换为 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/