2017-04-20 143 views
1

我想加密一个消息在JavaScript(使用加密-js库),并在Java解密它。JavaScript的加密-java解密

这是JavaScript代码:

var key = CryptoJS.enc.Utf8.parse(aesPassword); 
var ive = CryptoJS.enc.Utf8.parse(aesIv); 
var encryptedData = CryptoJS.AES.encrypt(dataToEncrypt, key, {mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: ive}); 

这是java代码:

final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     final SecretKeySpec key = new SecretKeySpec(aesPassword().getBytes("UTF-8"), "AES"); 
     cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(aesIv().getBytes("UTF-8"))); 
     byte[] decrypted = cipher.doFinal(DatatypeConverter.parseBase64Binary(message)); 

但是当我试图用Java来解密这个异常被抛出: javax.crypto.BadPaddingException :给定最终块未正确填充

密码:6h2faBePVxpgyFSN iv:NKOzRKrmEMKs1kE4 数据加密:“{token:cMGOIrYlJm9lPhPW}”

任何帮助吗?

在此先感谢

+1

你确定它们兼容吗? – evolutionxbox

+0

是的。在其他情况下,我使用java加密并使用javascript进行解密,并且工作正常 – Giamma

+0

您的代码看起来正确。请[编辑]你的问题,包括你的钥匙和IV。您应该将密钥和IV的字节数组编码为十六进制,以在JavaScript和Java之间进行比较。 –

回答

0

我可能是错的,但我认为BadPaddingException在这种情况下意味着你​​不具备正确的密钥基本上成功地执行decryption.The异常意味着,关键是太短或者太长(我认为)。

Try{ 
    String decrypted = aes.decrypt(...); 
    System.out.println(decryted); 
}catch(Exception e){ 

} 

喜欢的东西上面的代码可以工作,因为System.out的也只能达到当BadPaddingException没有被捕获,这可以在一个循环中试图解密可能的密钥时,例如使用,如果你是试图计算解密所有可能的密钥。

+1

The密钥是正确的,它用于加密java中的消息并使用javascript解密消息。关键始终是一样的 – Giamma