【发布时间】:2014-03-04 21:30:00
【问题描述】:
我正在尝试解密使用 CryptoJS 加密的 java 中的文本。我在其他帖子上读过它们使用不同的默认模式和填充,所以我将它们(java/cryptojs)都设置为使用 aes/cbc/nopadding。我在 java 中不再出现异常,但在解密过程中出现乱码输出
加密(JS):
var parsedLogin = JSON.parse(login);
var publicKey = "abcdefghijklmnio";
var publiciv = "abcdefghijklmnio";
var key = CryptoJS.enc.Hex.parse(publicKey);
var iv = CryptoJS.enc.Hex.parse(publiciv);
var encrypted = CryptoJS.AES.encrypt(parsedLogin.password, publicKey, {iv: publiciv}, { padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.CBC});
// send encrypted to POST request
解密(Java)
String PUBLIC_KEY = "abcdefghijklmnio";
String PUBLIC_IV = "abcdefghijklmnio";
byte[] byteArr = PUBLIC_KEY.getBytes();
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
final SecretKeySpec secretKey = new SecretKeySpec(byteArr, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(PUBLIC_IV.getBytes()));
byte[] parsed = Base64.decodeBase64(encrypted.getBytes());
//byte[] parsed = DatatypeConverter.parseBase64Binary(encrypted);
byte[] fin = cipher.doFinal(parsed);
String decryptedString = new String(fin);
我得到的结果是这样的:вÛ!aå{'`@"Ûîñ?Œr~krÆ
我已经尝试将 getBytes() 中的 CHARSET 更改为 US-ASCII、UTF-8 和 UTF-16,但所做的只是更改乱码文本
我也尝试过使用其他阻塞模式和填充,但它们在 js 级别失败了。我现在只需要一个简单的加密方法。
注意: 忽略安全问题...比如在 js 中暴露密钥等。我将在以后处理这些问题..
【问题讨论】:
-
var key = CryptoJS.enc.Hex.parse(publicKey);好的,但我认为您的publicKey(不应该是secretKey?)实际上是 32 个十六进制字符/16 个字节。否则代码没有意义。 -
对不起,我忘了删除那行(密钥 = CryptoKs.enc.Hex ...)。这是我之前尝试过的解决方案之一。
标签: java javascript encryption aes cryptojs