2016-04-06 31 views
0

我試圖創建一個使用java的AES 256 cbc加密,我需要模擬這個javascript代碼(我知道iv是相同的密鑰(被轉化爲16字節),這就是它是從網站我試圖登錄到使用Java)不同的輸出爲JAVA vs javascript AES 256 cbc

var recievedStr = "MDk4NTY1MDAyMjg2MTU1OA=="; //some 
var key = CryptoJS.enc.Base64.parse(recievedStr); 
var iv = CryptoJS.enc.Base64.parse(recievedStr); 
var pw = "PASSWORD"; 

var encres = CryptoJS.AES.encrypt(pw, key, {iv:iv, keySize: 256, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7}); 
var finalStr = encres.toString(); 

finalStr將是:Su92ZXLm/MdOyruRnWDRqQ ==

我需要一個Java代碼,將輸出完全一樣從javascript輸出爲finalStr。 即時通訊使用充氣城堡。

 String recievedStr = "MDk4NTY1MDAyMjg2MTU1OA=="; 
     String pw = "PASSWORD"; 
     AESEngine blockCipher = new AESEngine(); 
      CBCBlockCipher cbcCipher = new CBCBlockCipher(blockCipher); 
    BufferedBlockCipher cipher = new PaddedBufferedBlockCipher (cbcCipher); 
    byte[] key = encodeBase64(recievedStr); 
    byte [] iv = java.util.Arrays.copyOf(key,16); 
    byte[] input = pw.getBytes(); 
    ParametersWithIV pwIV= new ParametersWithIV(new KeyParameter(key),iv); 
    cipher.init(true, pwIV); 
    byte[] cipherText = new byte[cipher.getOutputSize(input.length)]; 
    int outputLen = cipher.processBytes(input, 0, input.length, cipherText, 0); 
    try 
    { 
     cipher.doFinal(cipherText, outputLen); 
    } 
    catch (CryptoException ce) 
    { 
     System.err.println(ce); 
     } 
     System.out.println(new String(Base64.encodeBase64(cipherText))); 

這將輸出:qEGQ1PC/QKxfAxGBIbLKpQ ==

,而我可以把它解密到原來的輸入,這不是我想要的。 我需要我的java代碼來輸出JavaScript所做的。 我對如何解決這個問題留下了0個想法。

謝謝。

編輯:問題解決了,我不得不將接收到的字符串解碼爲base64,而不是編碼它。

+1

不應該是decodeBase64(recievedStr)而不是encodeBase64(recievedStr)? – AdrianEddy

+0

這就是它! thx – user1827217

+0

解碼時,「MDk4NTY1MDAyMjg2MTU1OA ==」的長度爲16個字節,這意味着它是AES-128而不是AES-256。當提供實際密鑰時,'keySize'屬性被忽略。不過,這將是錯誤的,因爲'keySize:256/32'將是定義密鑰大小的正確方式。 –

回答

0

我認爲你是在正確的軌道上。但我認爲你正在使用AES-128而不是AES-256。如果你看看Java 256-bit AES Password-Based Encryption我想也許你可以找到一些有用的東西。

+0

im在代碼示例中運行aes-256(默認填充是pkc7,cbc模式)。 – user1827217