Java无法解密PHP中加密的字符串

时间:2017-12-05 15:12:27

标签: java encryption aes

大家好我在openssl_encrypt使用算法' aes-256-cbc'

在PHP中加密了字符串

键:C4E30455853D4949A8E91B2C366BE9DE

矢量:5686044872102713

加密字符串:ak9YSTd6RXU5TENocUxQUGxieVhpZ3VqSlFiQUdndGZrbVJvbEliTGZjZz0=

这是我用于解密的Java函数:

public static String Decrypt_AES_FromBase64(String AEncryptedText, String AKey32Bytes, String AVectorNum16Bytes) {
        try { 
            byte[] vEncryptedBytes = Base64.getDecoder().decode(AEncryptedText);

            Key SecretKey = new SecretKeySpec(AKey32Bytes.getBytes(), "AES");
            IvParameterSpec vSpec = new IvParameterSpec(AVectorNum16Bytes.getBytes());

            Cipher vCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            vCipher.init(Cipher.DECRYPT_MODE, SecretKey, vSpec);

            return new String(vCipher.doFinal(vEncryptedBytes));
        } catch (Exception e) {
                Common.mContext.getLogger().log(e.toString());
            return "";
        }
    }

当我尝试解密时,我有错误:

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher

有人可以说出错了吗?

1 个答案:

答案 0 :(得分:2)

加密字符串AKey32Bytes是双Base64编码。

而不是AKey32Bytes.getBytes(),您需要将Base64的两倍加密解码为二进制。

加密字符串:
ak9YSTd6RXU5TENocUxQUGxieVhpZ3VqSlFiQUdndGZrbVJvbEliTGZjZz0=

一次Base64解码后:
jOXI7zEu9LChqLPPlbyXigujJQbAGgtfkmRolIbLfcg=

经过第二次Base64解码(以十六进制显示,因为它不是二进制):
8CE5C8EF312EF4B0A1A8B3CF95BC978A0BA32506C01A0B5F9264689486CB7DC8

这就是需要提供给解密功能的东西。

解密结果是:
(十六进制)257531362A2179704B40577255516272
(ASCII格式):"%u16 *!ypK @ WrUQbr" (所有有效的ASCII字符)

注意:有一整套PKCS#7填充(十六进制):10101010101010101010101010101010

尽管说到这一点很痛苦,但从正确的填充中我可以认为解密是成功的。

请参阅Cryptomathic AES CALCULATOR