【问题标题】:Java can't decrypt string encrypted in PHPJava无法解密用PHP加密的字符串
【发布时间】:2018-05-19 07:21:15
【问题描述】:

大家好,我在 PHP 中使用 openssl_encrypt 使用算法“aes-256-cbc”加密了字符串

密钥: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

谁能告诉我怎么回事?

【问题讨论】:

  • 不是突出显示的问题,但 AKey32Bytes.getBytes() 将字符转换为其字符代码,但您可能希望将十六进制数字转换为二进制:In Java, how do I convert a hex string to a byte? 关于如何处理存在一些歧义5686044872102713.
  • 我已更改为 IvParameterSpec vSpec = new IvParameterSpec(DatatypeConverter.parseHexBinary(AVectorNum16Bytes));现在我有新错误:“IV 长度错误:必须为 16 字节长”
  • 加密的字符串是双Base64编码的,没有理由。
  • 可能 IV 不是十六进制(没有 a-f 字符)并且 AES IV 必须是 16 字节。 IV 应该是每次加密的随机字节,只需在加密数据前加上 IV 以用于解密,它不需要保密。

标签: java encryption aes


【解决方案1】:

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

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

加密字符串:
ak9YSTd6RXU5TENocUxQUGxieVhpZ3VqSlFiQUdndGZrbVJvbEliTGZjZz0=

经过一次 Base64 解码:
jOXI7zEu9LChqLPPlbyXigujJQbAGgtfkmRolIbLfcg=

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

这就是解密函数需要提供的东西。

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

注意:有一个完整的 PKCS#7 填充块(十六进制):10101010101010101010101010101010

尽管这么说让我很痛苦,但从正确的填充来看,我可以假设解密是成功的。

见 Cryptomathic AES CALCULATOR

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多