【问题标题】:Garbled output in AES/CBC/NoPadding DecryptionAES/CBC/NoPadding 解密中的乱码输出
【发布时间】: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


【解决方案1】:

除非密码始终为 16 字节,否则您不应该使用没有填充的 AES CBC。它可能会应用某种默认填充,这可能是一个好主意,也可能不是一个好主意。

无论如何:您需要将您的密钥和 iv 作为 WordArray 传递给 CryptoJS;如果你给它一个字符串,它会假设你给它一个密码并从中派生一个不同的密钥。因此,您的 Java 解密代码将使用不同的密钥/iv 对。您可以使用

从字符串创建 WordArray
var key = CryptoJS.enc.Utf8.parse("abcdefghijklmnio")
var iv = ...

【讨论】:

  • 谢谢!在我将它们作为 wordarray 传递后它起作用了,它确实需要我添加填充,否则它会添加额外的字符。我也意识到我在上面包含了一些不必要的代码。
猜你喜欢
  • 2021-03-05
  • 2014-08-15
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 2013-08-11
  • 2018-03-07
  • 1970-01-01
相关资源
最近更新 更多