繁体   English   中英

CryptoJS不忠实地解密非拉丁字符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM