JAVA与javascript AES 256 cbc的不同输出

时间:2016-04-06 06:13:39

标签: javascript java aes bouncycastle cryptojs

我尝试使用java创建AES 256 cbc加密,我需要完全模拟这个javascript代码(我知道iv与密钥相同(关于16字节),它是如何来自我尝试使用java登录的网站

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所做的。 关于如何处理这个问题我还有一些想法。

感谢。

编辑:问题解决了,我不得不将收到的字符串解码为base64而不是编码。

1 个答案:

答案 0 :(得分:0)

我认为你走在正确的轨道上。但我认为你使用的是AES-128而不是AES-256。如果您看一下Java 256-bit AES Password-Based Encryption,我想也许您可以找到有用的东西。