[英]CryptoJS not decrypting non-Latin characters faithfully
我正在尝试使用CryptoJS AES,如下所示:
var msg = "café";
var key = "something";
var c = CryptoJS.AES.encrypt(msg, key).toString();
CryptoJS.AES.decrypt(c, key).toString(CryptoJS.enc.Latin1);
不幸的是这将返回café
,没有café
。 显然,Latin1不是适合使用的编码,但是我找不到更好的编码。 有解决方案吗?
谢谢。
您只是缺少格式
正确的方法是使用CryptoJS.enc.Utf8
因此,请尝试:
CryptoJS.AES.decrypt(c, key).toString(CryptoJS.enc.Utf8);
https://code.google.com/p/crypto-js/#The_Hasher_Input
哈希算法接受字符串或CryptoJS.lib.WordArray [...]实例的32位单词数组。 传递字符串时,它将自动转换为编码为UTF-8的WordArray 。
因此,当您传递字符串时(不要使用CryptoJS.enc。*生成WordArray
),它将自动将字符串( message
)转换为utf8 WordArray
。
请参阅此处以获取示例往返加密/解密: https : //code.google.com/p/crypto-js/#The_Cipher_Output
这是一个与CryptoJS一起玩的jsfiddle https://jsfiddle.net/8qbf4746/4/
var message = "café";
var key = "something";
var encrypted = CryptoJS.AES.encrypt(message, key);
//equivalent to CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(message), key);
var decrypted = CryptoJS.AES.decrypt(encrypted, key);
$('#1').text("Encrypted: "+encrypted);
$('#2').text("Decrypted: "+decrypted.toString(CryptoJS.enc.Utf8));
在这里强调我的观点是使用Latin1编码的同一件事: https : //jsfiddle.net/3a8tf48f/2/
var message = "café";
var key = "something";
var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Latin1.parse(message), key);
var decrypted = CryptoJS.AES.decrypt(encrypted, key);
$('#1').text("Encrypted: " + encrypted);
$('#2').text("Decrypted: " + decrypted.toString(CryptoJS.enc.Latin1));
附带说明一下,如果仅接受WordArray
并且不重载toString方法(这只是CryptoJS.enc。*。stringify的便捷接口),则该API可能会更好。 字符串转换魔术有点误导。
您试图将数据解密为Latin1字符串,即使您输入的字符串不在Latin1中也是如此。 内部使用的CryptoJS编码与用于写入输入文件的编码不同。
在加密(对于字符串->字节数组转换)和解密(对于字节数组->字符串转换)时,都需要指定相同的编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.