1.异常描述:最近做项目为了增强数据传输的安全性用到了RSA加密。即android客户端将要传送的信息,用公钥通过RSA非对称加密算法加密后,传到服务器端(PC端)。服务器端用对应(密钥)的私钥来解密时解密失败,抛出“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.解决办法:这里提供三种解决办法:

第一种:将服务器(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")。

 

更多相关文章

  1. Android搜索过滤
  2. Android(安卓)kotlin之对象和类(2)
  3. 五、android中解析xml
  4. Android(安卓)Scroll 详解
  5. android launcher开发之图标背景以及默认配置
  6. Android(安卓)沉浸状态栏
  7. Android(安卓)APK文件拆解方法
  8. Android(安卓)小项目之--解析如何获取SDCard 内存
  9. Android(安卓)Activity——activity详细说明书

随机推荐

  1. android开机动画制作与播放原理简介
  2. Android的系统架构
  3. Android系列教程之Android项目的目录结构
  4. android Widget添加过程和android添加wid
  5. Android核心分析(17) ------电话系统之rilD
  6. android蓝牙遥控车
  7. Android中级进阶 FAQ
  8. android资源
  9. 使用Maven管理Android项目(一)
  10. Android使用TextView实现无下划线超链接