首页 > 编程语言 >Java安全架构____RSA加密配置第三方加密库问题_javax.crypto.BadPaddingException: Decryption error

Java安全架构____RSA加密配置第三方加密库问题_javax.crypto.BadPaddingException: Decryption error

时间:2023-09-13 12:35:10浏览次数:49  
标签:Decryption Java java sun RSA crypto Cipher provider 加密


刚要写一个JCE组件是未使用第三方加密库时 bug如下

javax.crypto.BadPaddingException: Decryption error
at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)
at sun.security.rsa.RSAPadding.unpad(Unknown Source)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:358)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:391)
at javax.crypto.Cipher.doFinal(Cipher.java:2189)
at RSAUtil.PubDecode(RSAUtil.java:182)


at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)

at sun.security.rsa.RSAPadding.unpad(Unknown Source)

at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:358)

at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:391)

at javax.crypto.Cipher.doFinal(Cipher.java:2189)

at RSAUtil.PubDecode(RSAUtil.java:182)


at RSAUtil.main(RSAUtil.java:209)


在网上找到大致的原因摘如下:

关于javax.crypto.BadPaddingException: Blocktype异常的几种解决办法

  1.异常描述:最近做项目为了增强数据传输的安全性用到了RSA加密。即客户端将要传送的信息,用私钥通过RSA非对称加密算法加密后,传到服务器端(PC端)。服务器端用对应(密钥)的公钥来解密时解密失败,抛出“javax.crypto.BadPaddingException: Blocktype”异常。

  2.异常原因:SUN标准JDK是有所区别的,其中他们默认的RSA实现就不同。即服务端用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")方法改为Cipher.getInstance("RSA/ECB/NoPadding")。但这种改法有一个缺点就是解密后的明文比加密之前多了很多空格。(空格的长度个数+原来的明文字符数=产生密钥时采用的bit数/8)

  第二种:将Cipher.getInstance("RSA")方法改为Cipher.getInstance("RSA/None/PKCS1Padding")。这种方法解密后的明文和加密前的明文是对应的,不会出现第一种方法中的现象,推荐这种方法。

  第三种:秘钥初始化时加入制定默认的jce算法


Security.addProvider(new com.sun.crypto.provider.SunJCE());


第四总:使用第三方算法加密库 BC


_________以上方法均对自己出现的bug测试 均可用.







标签:Decryption,Java,java,sun,RSA,crypto,Cipher,provider,加密
From: https://blog.51cto.com/ratelcloud/7454320

相关文章

  • 异常:java.lang.ClassNotFoundException: org.apache.commons.collections.map.ListOr
    使用JSON,在SERVLET或者STRUTS的ACTION中取得数据时如果会出现异常:Java.lang.NoClassDefFoundError:net/sf/ezmorph/Morpher原因是少了JAR包,造成类找不到还必须有其它几个依赖包:commons-logging-1.0.4.jarcommons-lang-2.3.jarcommons-collections-3.2.jarcommons-beanutils-1......
  • Java多线程____BlockingQueue阻塞队列使用
    packagecom.frame.base.thread;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.ArrayBlockingQueue;/***并发编程____阻塞队列*/publicclassBlockingQueueTest{ publicstaticvoidmain(String[]args)throwsInterruptedException{......
  • 架构分布式____javaee高可用,负载均衡架构图
    ......
  • Java网路编程____UDP协议Socket客户端服务器聊天室列子
    1.UPD服务端定义数据Socket和注册外放的端口一直做true循环读取数据包Packet里的数据datagramPacket.getData()转换为String字符串读取 packagecom.frame.base.UDP;importjava.net.DatagramPacket;importjava.net.DatagramSocket;/***@authorAdministrator*UDP_So......
  • Java多线程____JUC并发锁机制
    1.同步锁即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁。同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁但是,在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度,从而在CPU上执行;而没有获......
  • Java多线程____wait(), notify(), notifyAll()等方法介绍
    在JDK中,定义了wait(),notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。wait,notify和notif......
  • java安全架构____Hmac秘钥加密自己的摘要数据
    importjavax.crypto.KeyGenerator;importjavax.crypto.Mac;importjavax.crypto.SecretKey;importjavax.crypto.spec.SecretKeySpec;importorg.apache.commons.codec.binary.Base64;/***@authorAdministratorHMACutil*/publicclassHmacUtil{ private......
  • java安全架构____对称加密和非对称加密区别(对称秘钥,非对称秘钥)
    (一)对称加密(SymmetricCryptography)对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secretkey),这种方法在密码学中叫做对称加密算法。对称加密通常使用的是相对较小的密钥,一般小于256bit。因为密钥越大,加密越强.例如AES,DES(二)......
  • Java安全架构____KeyGenerator(对称)秘钥生成工具详解
    packagecom.ryx.frame.security.aes;importjava.security.SecureRandom;importjava.util.Date;importjavax.crypto.KeyGenerator;importjavax.crypto.SecretKey;importorg.apache.commons.codec.binary.Base64;publicclassKeyGeneral{ /** *AES128,256......
  • java安全架构____读取.cer证书文件的信息
    importjava.io.FileInputStream;importjava.security.cert.CertificateFactory;importjava.security.cert.X509Certificate;/***@authorGod*随便找一个.cer文件读取即可*/publicclassCertUtil{ /** *@authorGod *@cerPathJava读取Cer证书信息 *@th......