2014-03-04 272 views
1

我試圖解密使用CryptoJS加密的java中的文本。我讀過其他職位,他們使用不同的默認模式和填充,所以我將它們都設置(java/cryptojs)都使用aes/cbc/nopadding。我不再獲得Java中的異常,但是解密過程中我得到一個亂碼輸出AES/CBC/NoPadding解密中的亂碼輸出

加密(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 

DECRYPT(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); 

我」結果我已經嘗試將getBytes()中的CHARSET更改爲US-ASCII,UTF-8和UTF-16,但所有這些確實是改變了亂碼文本

我也嘗試使用其他阻塞模式和填充,但他們在js級失敗。我現在只需要一個簡單的加密方法。

注: 忽略安全問題......就像在JS暴露的鑰匙,等我會處理那些後來..

+0

'VAR鍵= CryptoJS.enc.Hex.parse(公鑰)從串的WordArray;'OK,但我相信,你的'publicKey'(應該不就是'secretKey' ?)實際上是32個十六進制字符/ 16個字節。否則,代碼沒有意義。 –

+0

對不起,我忘了刪除該行(key = CryptoKs.enc.Hex ...)。這是我以前試過的解決方案之一。 – gogogadgetroy

回答

1

你不應該能夠使用AES CBC沒有填充除非密碼總是16個字節。它可能會應用某種默認填充,這可能是也可能不是一個好主意。

無論如何:您需要將您的密鑰和iv作爲WordArray傳遞給CryptoJS;如果你給它一個字符串,它會假設你給它一個密碼並從中得到一個不同的密鑰。因此,您的Java解密代碼將使用不同的密鑰/ iv對。您可以使用

var key = CryptoJS.enc.Utf8.parse("abcdefghijklmnio") 
var iv = ... 
+0

謝謝!它在我將它們作爲wordarray傳遞之後起作用,它確實需要我添加填充,否則會添加額外的字符。我也意識到我在上面包含了一些不必要的代碼。 – gogogadgetroy