我正在編寫一個系統,用戶可以在其中寫入某些內容(通過。手機瀏覽器),並且將使用用戶選擇的密碼對「字符串」進行加密。由於經常使用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