1. 出錯描述:服務RSA解密拋出javax.crypto.BadPaddingException: Decryption errorjava
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. 解決方法:Android端的加密算法以下服務器
/** * 公鑰加密 * @param data 待加密數據 * @param key 密鑰 * @return byte[] 加密數據 * */ public static byte[] encryptByPublicKey(byte[] data,String key) throws Exception{ //解密密鑰 byte[] keyBytes = decryptBASE64(key); //實例化密鑰工廠 KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM); //初始化公鑰 //密鑰材料轉換 X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(keyBytes); //產生公鑰 PublicKey pubKey=keyFactory.generatePublic(x509KeySpec); //數據加密 Cipher cipher=Cipher.getInstance("RSA/None/PKCS1Padding");//Android端使用 cipher.init(Cipher.ENCRYPT_MODE, pubKey); return cipher.doFinal(data); }