RSA 加密解密 關於javax.crypto.BadPaddingException: Blocktype錯誤的幾種解決方法

關於javax.crypto.BadPaddingException: Blocktype錯誤的幾種解決方法


關於javax.crypto.BadPaddingException: Blocktype異常的幾種解決辦法

轉載請註明出處

1.異常描述:最近做項目爲了增強數據傳輸的安全性用到了RSA加密。即android客戶端將要傳送的信息,用私鑰通過RSA非對稱加密算法加密後,傳到服務器端(PC端)。服務器端用對應(密鑰)的公鑰來解密時解密失敗,拋出“javax.crypto.BadPaddingException: Blocktype”異常。


2.異常原因:Android系統使用的虛擬機(dalvik)跟SUN標準JDK是有所區別的,其中他們默認的RSA實現就不同。即Android端用Cipher.getInstance("RSA")方法進行加密時,使用的provider是Bouncycastle Security provider,Bouncycastle Security provider默認實現的是“RSA/None/NoPadding”算法,而服務器(PC)端用Cipher.getInstance("RSA")進行解密時,使用的是Sun的security provider,實現的是“RSA/None/PKCS1Padding”算法,所以,解密時會失敗。


3.解決辦法:我這裏提供三種解決辦法:

第一種:將服務器(pc)端的Cipher.getInstance("RSA")方法改爲Cipher.getInstance("RSA/ECB/NoPadding")。但這種改法有一個缺點就是解密後的明文比加密之前多了很多空格。(空格的長度個數+原來的明文字符數=產生密鑰時採用的bit數/8)


第二種:將Android端的Cipher.getInstance("RSA")方法改爲Cipher.getInstance("RSA/None/PKCS1Padding")。這種方法解密後的明文和加密前的明文是對應的,不會出現第一種方法中的現象,推薦這種方法。


第三種:在服務器(pc)端的jdk中加入Bouncycastle Security provider,關於Bouncycastle JCE的安裝配置及驗證請參看 http://blog.csdn.net/caoshichao520326/article/details/8732670, 配置好Bouncycastle Security provider後,將服務器(pc)端的Cipher.getInstance("RSA")方法改爲Cipher.getInstance("RSA","BC")。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章