我正在编写一个系统,用户可以在其中写入某些内容(通过。手机浏览器),并且将使用用户选择的密码对“字符串”进行加密。由于经常使用unicode emojis,因此它们也必须得到支持。使用CryptoJS破坏unicode表情符号的AES加密
作为加密的lib,我选择CryptoJs - 这样加密可以在设备本地完成。
目前,当我加密一个字符串,并解密相同的刺痛,所有emojis消失/被替换为随机字符。
var key = "123";
var content = "secret text with an emoji, ";
var encrypted = aes_encrypt(key, content); //U2FsdGVkX19IOHIt+eRkaOcmNuZrc1rkU7JepL4iNdUknzhDaLOnSjYBCklTktSe
var decrypted = aes_decrypt(key, encrypted);//secret text with an emoji, Ø<ß®
我用这样的一对辅助功能:
function aes_encrypt(key, content){
var key_string = key + "";
var content_string = ascii_to_hex(content) + "";
var key_sha3 = sha3(key_string);
var encrypted = CryptoJS.AES.encrypt(content_string, key_sha3, {
mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.Iso10126});
return encrypted + "";
};
任何人能告诉我什么,我做错了什么?
你能提供一个链接到你正在使用的加密库吗?这里的根本问题是加密算法对二进制数据进行操作,而JavaScript字符串则不是。 JavaScript字符串中的每个字符都是两个字节。将JavaScript字符串视为二进制数据的加密代码通常会忽略较高字节,并假定较低字节用于存储数据。表情符号要求数据丢失的高位字节。您需要以某种形式将字符串字符数据显式编码为UTF-8。 hacky的解决方案是在解码之前/之后使用encode/decodeURIComponent。 –
@JeremyBanks我从谷歌代码(https://code.google.com/archive/p/crypto-js/)使用原始库的副本。 –
是你写的aes_encrypt吗? – alexandergs