如何解密用PHP方法openssl_encryp aes-256-cbc加密的Java数据?

时间:2017-07-31 14:13:15

标签: java encryption aes

public static void main(String[] args) throws Exception {
    String iv = "0102030405060708";
    String key = "1882051051AgVfZUKJLInUbWvOPsAP6LM6nBwLn14140722186";

    byte[] aaa = AES_cbc_decrypt("hv208Otx0FZL32GUuErHDLlZzC3zVEGRt56f8lviQpk=", key, iv);
    System.out.println(new String(aaa));
}

private static final String ALGORITHM = "AES/CBC/PKCS5Padding";

public static byte[] AES_cbc_decrypt(String content,String key,String iv) throws Exception 
{
    byte[] contentBytes = Base64.decode(content);
    byte[] keyBytes = key.substring(0, 16).getBytes();
    byte[] ivBytes = iv.getBytes();

    SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
    Cipher cipher = Cipher.getInstance(ALGORITHM);
    cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(ivBytes));
    byte[] decbbdt = cipher.doFinal(contentBytes);
    return decbbdt;
}

使用此代码运行,我得到以下异常:

  

线程中的异常" main" javax.crypto.BadPaddingException:给定最终块未正确填充

它可以通过php方法解密

openssl_decrypt(base64_decode($encryptData), 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);

1 个答案:

答案 0 :(得分:1)

您尝试使用16字节或128位的密钥进行解密。但是,您一直在使用AES-256,其中256表示密钥大小:当然是32个字节。

现在,C和C库(如OpenSSL)通常使用指针算法来确定字节数。指定密钥时,它们通常采用指针地址和字节数(或者用于较低级别的库,32位字等)

因此,当指定一个大于32个字符/字节的密钥时,这个密钥最有可能减少到32个字节(或C中的char s,其中字节和字符总是混淆不清)。但是,在Java代码中,您将密钥减少到16个字节。这将导致在C中使用AES-256,在Java中使用AES-128。

故事的道德:不要混淆密码/字符串和密钥。