2016-04-06 29 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