关于js私钥加密公钥解密的问题
博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考
一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签。但总有特别的时候会想要用私钥加密,公钥解密,但是js里面的框架没找到直接提供这种方式的。于是,只能自己来解决一下这个问题,我选择的是JSEncrypt这个框架(主要是写的比较简单好看懂)。一般使用rsa算法都是使用的ECB模式和pkcs1padding填充算法,因此,如果使用了其他算法的本文章不适用。
其实解决方式很简单,公钥加密就是用公钥对原文进行运算,那私钥其实就是用私钥对原文进行运算,解密也是反过来就行。但是JSEncrypt这个框架,将密钥对换之后,用私钥加密得到的密文自己能解开,放到java里就无法解开,原因在于:JSEncrypt直接将原文进行运算,而java里是将原文进行编码转换之后才进行运算,因此,只要修改JSEncrypt,将原文进行转换一次编码就可以和java兼容
将JSEncrypt中加密的方法贴出来说明一下,encrypt是原本的公钥加密的方法,encryptp是我加的私钥加密的方法(起名比较随意,见谅)。只要将填充部分和密钥运算修改即可。

因为rsa是分块加密的,所以对于1024位的公钥加密来说,输入的明文块小于117位时,在明文块前添加一位的0x02字节(代表公钥加密)然后后面的52位为随机的字节,在补位的最后一位,{即52(117-64-1),从零开始的},添加一位的字节0x00,在补位的后面添加实际的明文块。而对于1024位的私钥加密,如果输入的明文块小于117位,比如输入的明文块长度为64位,那么对这个明文块进行补位,在明文块千添加一位的0x01字节(代表私钥加密),然后在后面的52位为字节0xff,在最后一位{即52(117-64-1),从零开始),添加一位的字节0x00,在补位的后面添加时间的明文块。
正是由于公钥加密时填充的字节是随机的,所以每次加密出来的密文都是不同的,但是私钥加密时填充的字节是固定的,所以密文是相同的。也可以通过填充随机字节使私钥加密变为随机密文(没有意义,公钥是公开的,这种方式与java不兼容)。
接下来是填充的方法部分,因此要兼容java,所以使用asciitohex方法来对原文进行编码转换,之后按照填充算法来填充明文。因为我是用ascii码转换的,所以不支持中文,需要支持中文的朋友自行修改编码转换部分即可。

结尾,因为我比较懒所以只解决了一部分问题,还有其他问题未解决,比如不支持中文,还有没做循环加密因此只能加密一个块长度以下的密文,需要的朋友自行修改一下吧
源代码在csdn上,可以下载,麻烦施舍我一点积分,穷人没积分下资源啊。如果实在没积分可以联系我
下载地址:https://download.csdn.net/download/wsss_fan/11736982
后记:
其实JSEncrypt里加密时有做编码转换,把标红的这段复制出来做一个方法就可以了。

关于js私钥加密公钥解密的问题的更多相关文章
- 基于私钥加密公钥解密的RSA算法C#实现
		
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...
 - 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#
		
前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...
 - RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密
		
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...
 - golang 私钥"加密"公钥"解密"
		
---恢复内容开始--- 之前工作主要使用C/C++与银行/第三方支付对接,但C/C++无法满足客户"当天给协议明天实盘上载"的开发速度以及现公司一些特殊情况,所以决定用go来 ...
 - RSA 加密算法 Java  公钥加密私钥解密  和  私钥加密公钥解密 的特点
		
package com.smt.cipher.unsymmetry; import org.apache.commons.codec.binary.Base64; import org.apache. ...
 - 求求你们不要再用 RSA 私钥加密公钥解密了,这非常不安全!
		
最近经常在网上看到有人说巨硬的 CNG(Cryptography Next Generation 即下一代加密技术) 只提供 RSA 公钥加密私钥解密,没有提供 RSA 私钥加密公钥解密,他们要自己封 ...
 - NetCore 生成RSA公私钥对,公钥加密私钥解密,私钥加密公钥解密
		
using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using ...
 - RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例
		
前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密 私加 ===================== ...
 - C# 基于大整数类的RSA算法实现(公钥加密私钥解密,私钥加密公钥解密)
		
但是C#自带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实现是基于网上提供的一个大整 ...
 
随机推荐
- 使用Jedis操作Redis-使用Java语言在客户端操作---set类型
			
原文地址:http://www.cnblogs.com/lixianyuan-org/p/9509696.html 1 //测试set数据类型 2 /** 3 * 在Redis中,我们可以将Set类型 ...
 - python调用tushare获取A股周线行情
			
接口:weekly 描述:获取A股周线行情 限量:单次最大3700,总量不限制 积分:用户需要至少300积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare模块下载和安装教程,请查阅我 ...
 - 【牛客提高训练营5A】同余方程
			
题目 吉老师的题做不动啊 首先\([l_1,r_1],[l_2,r_2]\)并不是非常好做,我们考虑将其拆成前缀信息 设\(solve(n,m)=\sum_{i=0}^n\sum_{j=0}^m[m| ...
 - 如果手工启动chromedriver
			
使用selenium模拟登陆网站时,有些网站会识别chrome driver里的json信息,从而判断是不是爬虫程序,做到反爬效果.(比如知乎) 下面说明下怎么手动启动chromedriver 1). ...
 - JS window对象 计时器setTimeout() setTimeout()计时器,在载入后延迟指定时间后,去执行一次表达式,仅执行一次。  语法:  setTimeout(代码,延迟时间);
			
计时器setTimeout() setTimeout()计时器,在载入后延迟指定时间后,去执行一次表达式,仅执行一次. 语法: setTimeout(代码,延迟时间); 参数说明: 1. 要调用的函数 ...
 - margin与padding
			
1.不加内边距的div: <div style="width:150px; height:150px; "> <div style="width: ...
 - idea 在新建一个class的时候可以选择继承的父类
			
1.把光标放在父类名称上按alt+enter可以生成子类 2. 选中implement abstract class
 - jq-demo-点击改变图片
			
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
 - 49. ArrayList   LinkedList中特有的方法
			
集合的体系:--------------| Collection 单列集合的根接口 ----------| List 如果实现了List接口的集合类,该类具备的特点是:有序,可重复 ------|A ...
 - Python 分解质因数
			
def zys(n, value=[]): for i in range(2, int(n / 2 + 1)): if n % i == 0: value.append(i) zys(n / i, v ...