痛惨的经历 javax.crypto.BadPaddingException: pad block corrupted踩的坑

简单的前言描述

由于公司即将需要对接香港永隆银行的生活商城平台(公司业务场景: 将嵌入永隆银行APP里拉起相对应的接口功能),对方已经直接发交互文档API,但是在阅读过程中,发现在调起对方的支付接口时,发现对方要求请求参数中(订单明细参数使用的是ASE256(加密的数据)算法进行加密传输,签名数据参数使用的是RSA2048和SHA256算法进行双重加密传输)。具体请求参数如下图:

痛惨的经历 javax.crypto.BadPaddingException: pad block corrupted踩的坑_第1张图片

重点

老规矩直接上代码,了解了人家上述接口交互需要加密数据传输后,接下来就得写相对应的加密算法工具类(坑来了。。。),先准备AES256Util算法工具类(具体的代码,可以直接下载附件)

痛惨的经历 javax.crypto.BadPaddingException: pad block corrupted踩的坑_第2张图片
本以为完全ok,结果运行结果GG了直接报错,具体错误信息如下图:

javax.crypto.BadPaddingException: pad block corrupted
	at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher.doFinal(Unknown Source)
	at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
	at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2202)
	at com.usys.common.core.util.AES256Util.decrypt(AES256Util.java:66)
	at com.usys.common.core.util.AES256Util.main(AES256Util.java:121)

尴尬,直接报类似并发问题,以为是自己本身代码出问题了排查了很久,经过一番度娘和Google上查阅之后,网上的说法挺多的,有的说是公钥或者私钥配置错了,有的说是并发问题导致(但我这是单实例测试工具类,直接可以排除),最后在Stack Overflow上看到了提示(Stack Overflow 问题剖析)

解决方案

阅读Stack Overflow之后,明白我们需要进行JAVA中JCE策略文件替换了(因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制。比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件),在JAVA中,默认支持AES128,如果要使用AES256,还需要替换一下以下两个文件(local_policy.jar 和 US_export_policy.jar)即可,这两个文件附件中都有,可以无需再重新下载。
替换方法:
   **直接在您安装的JDK路径下  %JDK_HOME%\jre\lib\security 替换掉这两个jar包。**

替换之后重新运行就ok了,结果如图:
痛惨的经历 javax.crypto.BadPaddingException: pad block corrupted踩的坑_第3张图片

总结

以上代码和jar包,请点击这里进行下载(https://download.csdn.net/download/weixin_37838171/12074652)。自己工作中不小心踩得坑总结一下,需要可以帮助到各位小伙伴,一起避坑,上面不足的,也希望大家一起指出,一起学习嘻嘻。

你可能感兴趣的:(Springboot,springcloud,微服务)