2017-04-20 137 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