RSA解密报 Decryption error

最近在使用RSA加密密码,后台test类测试没问题,但js前端传过来却解析失败,报Decryption error.纠结了一晚上,终于发现了问题的所在


简单介绍一下:


RSA可以实现非对称加密。一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。
阮一峰曾介绍过:“这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。
也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。”;


(1)私钥是用来解密的,自己用(永久保密)
(2)公钥是用来加密的,别人用(公开透明)
(3)甲方用乙方提供的公钥对合同加密,甲方把密文发送给乙方,乙收到密文使用自己的私钥对其解密。


在解密时,需要将 request.getParameter接收到的String转为char[] ;
Java-text 方法测试时char[] 的长度为128;
js前端    方法测试时char[] 的长度为127;
  这个就是解密失败的关键(^_^惊不惊喜 ?高不高兴?)

只是为什么呢?  因为我们前台调后台逻辑时,特殊字符是转译后传送过来的。我这加密后的字符串 +号  变成了 空格,所以导致解密失败;
加密密文包含以下字符串,都会导致解密失败。切记!!
1. + URL 中+号表示空格 %2B  
2. 空格URL中的空格可以用+号或者编码 %20  
3. / 分隔目录和子目录 %2F   
4. ? 分隔实际的 URL 和参数 %3F   
5. % 指定特殊字符 %25   
6. # 表示书签 %23   
7. & URL 中指定的参数间的分隔符 %26   
8. = URL 中指定参数的值 %3D 

知道了8个特殊符号号,我们就要避开;

String password = request.getParameter("login_password").trim();  //取值
password= password.replaceAll(" ","+");//将空格转为+号
String decryptPassword = RSAUtil.decrypt(password, PrivateKey);//解密后的

这样就成功解密了

============================分割线======================================


因为我是干java的,写的是webapp;但领导让打包成app;前端加密用的是jsencrypt.min.js; 用的ajax调用的,一点问题没有;
但是搞Android和IOS的他们用的是HTTP的post请求方式,搞的我很纠结,每次都导致解密失败;
后来IOS的调没问题了,但是安卓的依然有问题。这让人百思不得其小姐姐;


Android解决方案如下:
JAVA后台RSAUtil工具类中:
Cipher cipher = Cipher.getInstance("RSA");
Android后台中:
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
这样就完美解决Android解密失败了


原文:https://blog.csdn.net/q840202933/article/details/71627949 
 

你可能感兴趣的:(笔记)