我打算为我的网络应用程序使用客户端AES加密。
现在,我一直在寻找方法将多字节字符分成一个字节 - '非字符',加密(具有相同的加密文本长度),
将它们解密,将这些单字节“非字符”转换回多字节字符。
我看过wiki的UTF-8(JS的默认编码?)和UTF-16,但是我无法弄清楚如何检测“碎片”多字节字符以及如何将它们组合起来
谢谢:)
答案 0 :(得分:7)
JavaScript strings是以16位“字符”存储的UTF-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。
答案 1 :(得分:0)
您只需转换为UTF8 ...例如,使用此trick
function encode_utf8(s) {
return unescape(encodeURIComponent(s));
}
function decode_utf8(s) {
return decodeURIComponent(escape(s));
}
考虑到您正在使用crypto-js,您可以使用其方法转换为utf8并返回到字符串。见here:
var words = CryptoJS.enc.Utf8.parse('');
var utf8 = CryptoJS.enc.Utf8.stringify(words);
这可能是Utf8角色的一个拙劣的例子。
通过查看其他示例(请参阅Latin1示例),我会说使用parse
将字符串转换为Utf8(从技术上讲,您将其转换为Utf8并放入crypto使用的特殊数组中 - 可以将结果传递给Aes编码算法,并使用stringify
将WordArray(例如通过解码算法获得)转换为Utf8。
JsFiddle示例:http://jsfiddle.net/UpJRm/