1. 出错描述:服务RSA解密抛出javax.crypto.BadPaddingException: Decryption error
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); }