1.場景
在做微信支付退款通知接口時,微信對通知的內容做了加密,並且指定用 AES256 解密,官方指定的解密方式如下:
2.導包
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.60</version> </dependency> <!-- https://mvnrepository.com/artifact/org.jasypt/jasypt --> <dependency> <groupId>org.jasypt</groupId> <artifactId>jasypt</artifactId> <version>1.9.3</version> </dependency>
3.解密
說明:方法中參數 reqInfo 就是退款結果通知接口中的 req_info 字段值
private String descrypt(String reqInfo) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { byte[] reqInfoB = Base64.decodeBase64(reqInfo); String key_ = DigestUtils.md5Hex(WXPayConfig.getInstance().getKey()).toLowerCase(); if (Security.getProvider("BC") == null){ Security.addProvider(new BouncyCastleProvider()); } Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC"); SecretKeySpec secretKeySpec = new SecretKeySpec(key_.getBytes(), "AES"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); return new String(cipher.doFinal(reqInfoB)); }
4.結果
5.上述過程之后在win本地運行沒問題了,但是放到 linux 之后報錯如下:
java.security.InvalidKeyException: Illegal key size or default parameters
最終還是按網友的方法解決:替換jre包:local_policy.jar,US_export_policy.jar
5.1.下載
需要注意的是:替換的jar包版本需要與jre版本一致,各個版本包連接
jdk8:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
jdk7:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
jdk6:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
jdk5:http://download.csdn.net/detail/scs2043/4237335
5.2.替換路徑
%JAVE_HOME%\jre\lib\security
6.參考
解密方式:https://blog.csdn.net/qq_25958497/article/details/87937020
報錯解決(報錯內容“No such provider: BC”):https://www.cnblogs.com/wswang/p/7718150.html
替換包參考:https://blog.csdn.net/tomatocc/article/details/85096911