由於小程序開發的需求,需要在后台對微信接口返回的敏感信息加密數據進行解密,以便開發使用,但是,在解密時出現以下異常:
java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding
1
網上查找原因,是java原生jdk不支持PKCS7Padding填充方式,解決方式有很多,比如有人說PKCS5Padding與PKCS7Padding填充方式差別不大,都可以用。
很遺憾的是在我這並沒有生效。
於是我繼續在知識的海洋中(bei)沉(rou)浮(lin)!
很幸運找到一個博主的博文,但是吧,恕我學識尚淺,我依然沒解決我的問題,但是我感覺,我已經接近真相了,加油!!!
於是我繼續在知識的海洋中(bei)沉(rou)浮(lin)!
<<<<<<<<<<<<<<<<<<<我是沉(rou)浮(lin)的分界線>>>>>>>>>>>>>>>>>>>>>>
終於,在我的不屑努力下,找到了明確的,小白至尊指導,大家請看博文,或者 看 我 下 面 (~ - ^ -)~
解決方式:
在 jdk安裝目錄中(%JAVA_HOME%\jre\lib\ext)添加 jar 包 bcprov-jdk16-1.46.jar。(我添加的是這個,下載的最新的,下載地址來自上面那篇博文,版本與原博文不太一樣,但親測可用)
在 jdk安裝目錄下( %JAVA_HOME%\jre\lib\security )修改 java.security 文件,將第74行(我的是在74行)的
security.provider.7=com.sun.security.sasl.Provider 替換為security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider
注意提醒以下,記得備份這個文件,萬一崩了,就jj了
然后,運行項目,OK,成功解密。
另外有一個地方需要注意以下:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
其中的 "BC"需要加上,不然會報異常:
javax.crypto.BadPaddingException: pad block corrupted
原因:因為BC是一個provider,而org.bouncycastle.jce.provider.BouncyCastleProvider是個第三方的庫。如果jce自帶的就可以不用加BC,但是JCE不支持PKCS7Padding的填充方式。
借鑒博文:
https://www.cnblogs.com/chen-lhx/p/6233954.html
https://my.oschina.net/u/269777/blog/1801356
https://blog.csdn.net/yuanhangLVli/article/details/82152178
————————————————
轉自: https://blog.csdn.net/qq_43225978/article/details/94459412