关于JAVA中AES/CBC/PKCS5Padding加密解密与PHP中openssl方法的对应

方滴云WEB2024-04-28 22:40

首先要申明下,写这个文章,并不是说这个加密解密有多难,主要是我目前是个搞PHP的,而对方的加密解密是通过提供源代码的方式呈现的,没有任何文档说明,但凡有个文档,其实几分钟就可以搞好的了。必竟折腾了这么久,简单的记录下。

对方提供的解密函数如下:

public static String decryptData(String data, String key, String IV) th rows Exception {
try {
byte[] encrypted1 = Base64.decodeBase64(data.getBytes("UTF‐8"));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(charset), "AES");
IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes(charset));  cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
byte[] original = cipher.doFinal(encrypted1); 81 // System.out.println(original); 
String originalString = new String(original, "UTF‐8"); 83 return originalString;
} catch (Exception e) { throw e;  }
}

大概就是上面的样子吧,样子没有人家的美观。必竟没有写过JAVA,所以看着好像理解了,其实并不真的理解,然后就试着来解密它了。

首先,AES/CBC/PKCS5Padding提供了很有价值的信息,通过AES的CBC方式加密的,填充方式为PKCS5Padding,因为本人对这个领域的知识很不了解,所以接下来就是以试为主了。

就我了解到的信息,在PHP中,对应的解密方法AES-128-CBC与AES-256-CBC,这两种也比较好区分,前者的偏移向量为16位,后者为32位。通过对方提供的原代码(未截出)以及给的iv值,不难猜出为AES-128-CBC。

那么接下来解密就很简单的了,一句话的事儿,代码如下:

$data=openssl_decrypt(base64_decode($input),'AES-128-CBC',$key,OPENSSL_RAW_DATA,$iv);

在本例中,密码$key与偏移量$iv,是相同的,当然我也是在这里踩的坑。还是那句话,有个文档,就一会儿的事儿,当然了,如果知识面广一点,也不怕流氓。

当然最应该感谢的是这个工具,http://tool.chacuo.net/cryptaes,没有它,我都准备放弃了的。