如何在Java中模拟Javascript加密AES-256-CBC解密

时间:2017-09-26 20:50:58

标签: javascript java encryption aes

我在网页上有以下Javascript代码:

  var decrypt = function (text, password){
    var decipher = crypto.createDecipher('aes-256-cbc',password);
    var dec = decipher.update(text,'hex','utf8');
    dec += decipher.final('utf8');
    return dec;
  }

,我尝试使用Java重现它,使用以下内容:

static MessageDigest MD5 = null;

static {
    try {
        MD5 = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }
}


public static String decrypt(String cipherText, String password)
        throws GeneralSecurityException, UnsupportedEncodingException {
    byte[] passwordBytes = hexStringToByteArray(password);
    byte[] keyBytes = MD5.digest(passwordBytes);
    byte[] keyAndPassword = new byte[keyBytes.length + passwordBytes.length];
    System.arraycopy(keyBytes, 0, keyAndPassword, 0, keyBytes.length);
    System.arraycopy(passwordBytes, 0, keyAndPassword, keyBytes.length, passwordBytes.length);
    byte[] ivBytes = MD5.digest(keyAndPassword);
    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec iv = new IvParameterSpec(ivBytes);

    byte[] encrypted = hexStringToByteArray(cipherText);
    Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding");
    aesCBC.init(Cipher.DECRYPT_MODE, key, iv);
    byte[] decryptedData = aesCBC.doFinal(encrypted);
    return new String(decryptedData, StandardCharsets.UTF_8);
}

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
    }
    return data;
}

来自:

的碎片

,但我得到&#34; javax.crypto.BadPaddingException:给定最终块未正确填充&#34;,在JS函数正确解码的参数上。

请注意,Given final block not properly padded没有回答这个问题 - 因为很明显这是一个填充问题,但解决方案是复制JS加密lib所做的任何事情,但没有详细记录。

0 个答案:

没有答案