Java AES/ECB/PKCS5Padding加密和PHP解密的实现

起因

群里有个小伙伴提了个关于AES加解密的问题。Java加密,php解密。
参考网上写的代码,发现解密总是失败。

结论

排查发现是因为链接里面代码使用的是16字节的KEY(博主没有说明),也就是AES-128方案,但是小伙伴使用的却是32字节的KEY,所以解密总是不成功。抄了一个32字节KEY的Demo代码来验证一下。

Demo环境

系统:Windows
JDK版本

java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)

PHP版本

PHP 7.4.1 (cli) (built: Dec 17 2019 19:23:59) ( NTS Visual C++ 2017 x64 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

AES-128 Demo

1.将AES-256 Demo中 Key的长度改为16个字节
2.将AES-256 Demo中的AES-256-ECB改为AES-128-ECB

AES-256 Demo

不多说,直接上代码
PHP代码


Java代码

public class TestMain {
    public static void main(String []args) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec("00112233440011223344001122334400".getBytes("utf-8"), "AES"));
        byte[] bytes = cipher.doFinal("helloworld".getBytes("utf-8"));
        System.out.println(new BASE64Encoder().encode(bytes));

        System.out.println(aesDecrypt("61gIBA+wmnHtx76YwLBF0A==","00112233440011223344001122334400"));
    }

    public static String aesDecrypt(String str, String key) throws Exception {
        if (str == null || key == null) return null;
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"));
        byte[] bytes = new BASE64Decoder().decodeBuffer(str);
        bytes = cipher.doFinal(bytes);
        return new String(bytes, "utf-8");
    }
}

上面代码经过测试,可以正常的加解密的,Java加密的数据,PHP可以解密;PHP加密的数据,Java也可以正常解密。

经过对比,如果AES KEY长度为16个字节,那PHP的解密方法要设置成AES-128-ECB;如果是32个字节,那PHP的解密方法需要设置成AES-256-ECB,还有另外一种KEY长度,就让小伙伴去探索了,估计代码差不了多少。

PS:
以上代码很多一部分是从网上百度过来的,原作者看到不要鄙视本人哈。

参考链接

1.Unable to replicate an encryption method from Java to PHP using AES/ECB/PKCS5Padding
2.PHP7 解决 java对应的 AES/ECB/PKCS5Padding 算法
3.一文详解AES最常见的3种方案_AES-128、AES-192和AES-256

你可能感兴趣的:(PHP,php,加密解密,openssl)