javax.crypto.BadPaddingException : Decryption error

上一篇 提到移植 commmon-codec 包来解决加密前后端加密算法同步的问题。

接着做 android 端和服务端联调 RSA 加密算法里还是出问题了。情况是这样:

  1. 两端自己单独加解密,没问题。
  2. 两端单元测试产生的加密字符串对方都可以解密。
  3. 真实环境调试,android 端发送的加密字符串,服务端无法解密。

报错:

javax.crypto.BadPaddingException : Decryption error

查询,应该是两端的填充模式不同,导致服务端解密失败。

这篇文章提到

服务端用 Cipher.getInstance("RSA") 方法进行加密时,使用的 provider 是Bouncycastle Security provider,Bouncycastle Security provider 默认实现的是 “RSA/None/NoPadding” 算法,而客户端用 Cipher.getInstance("RSA") 进行解密时,使用的是 Sun 的 security provider,实现的是 “RSA/None/PKCS1Padding” 算法,所以,解密时会失败。

于是在服务端改为:

Cipher.getInstance("RSA/None/PKCS1Padding")

测试报错并不支持该算法。改为“RSA/None/NoPadding”,仍然不支持。然后在 android 模拟器调试时也发现,android 端对同样的字符串加密获得是相同的密文,这更符合 “RSA/None/NoPadding” 的效果。于是改为在 android 端获取 Cipher 时,指定算法 “RSA/None/PKCS1Padding”,联调加解密成功。

证明 android 端使用的默认填充方式是“RSA/None/NoPadding”,而服务端使用的是“RSA/None/PKCS1Padding”。和上文引用的说明正好相反

值得注意的是:

android 端在跑 java 代码的单元测试时,每次对同样的字符串加密获得是不同的密文,而模拟器和真机调试时却一直是相同的。这里很误导人,也很费解, android 端 RSA 这里使用的完全是 java sdk,不懂为什么单元测试和模拟器运行时效果不同。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,234评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,297评论 25 709
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光剑书架上的书阅读 4,002评论 2 8
  • 文昌,在海南岛所处的位置有“雄鸡翘首”之尊,在这里更深刻地植入了东方农耕文化的传统,“文明昌盛”名符其实。同时因为...
    萧烟阅读 1,273评论 0 1
  • 前期:浮生若梦(4) 王爷回来了。 “雪儿,我去摘取了天山雪莲。”他紧紧握...
    西西酒馆阅读 472评论 11 8