最近用c开发一个项目里面涉及到AES_CBC加解密算法。其直接调用openssl库中的aes的AES_cbc_encrypt进行加解密。
C开发的客户端与服务端能正常相互加解密。最近公司要求用JAVA开发客户端。
网上找到调用的例子:
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
最后JAVA上送的密文C能解析,而C上送的密文JAVA不能解析。经过多方面的调试最后发现两种使用的填充方式不一样导致。
JAVA使用的PKCS5PADDING填充方式。查询相关网站得知PKCS5PADDING的意义。
算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度
AES/CBC/NoPadding 16 不支持
AES/CBC/PKCS5Padding 32 16
AES/CBC/ISO10126Padding 32 16
AES/CFB/NoPadding 16 原始数据长度
AES/CFB/PKCS5Padding 32 16
AES/CFB/ISO10126Padding 32 16
AES/ECB/NoPadding 16 不支持
AES/ECB/PKCS5Padding 32 16
AES/ECB/ISO10126Padding 32 16
AES/OFB/NoPadding 16 原始数据长度
AES/OFB/PKCS5Padding 32 16
AES/OFB/ISO10126Padding 32 16
AES/PCBC/NoPadding 16 不支持
AES/PCBC/PKCS5Padding 32 16
AES/PCBC/ISO10126Padding 32 16
JAVA使用的方式得出的密文长度为32位。而C调用的接口得出的密文长度为16位。
则需要将JAVA的填充方式设置为NoPadding即可。