我正在尝试解密使用 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 中公开密钥等。我将在稍后处理这些问题..