关于js私钥加密公钥解密的问题

博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考

一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签。但总有特别的时候会想要用私钥加密,公钥解密,但是js里面的框架没找到直接提供这种方式的。于是,只能自己来解决一下这个问题,我选择的是JSEncrypt这个框架(主要是写的比较简单好看懂)。一般使用rsa算法都是使用的ECB模式和pkcs1padding填充算法,因此,如果使用了其他算法的本文章不适用。

其实解决方式很简单,公钥加密就是用公钥对原文进行运算,那私钥其实就是用私钥对原文进行运算,解密也是反过来就行。但是JSEncrypt这个框架,将密钥对换之后,用私钥加密得到的密文自己能解开,放到java里就无法解开,原因在于:JSEncrypt直接将原文进行运算,而java里是将原文进行编码转换之后才进行运算,因此,只要修改JSEncrypt,将原文进行转换一次编码就可以和java兼容

将JSEncrypt中加密的方法贴出来说明一下,encrypt是原本的公钥加密的方法,encryptp是我加的私钥加密的方法(起名比较随意,见谅)。只要将填充部分和密钥运算修改即可。

因为rsa是分块加密的,所以对于1024位的公钥加密来说,每一个数据块的大小为128位

数据块=0x00+BT+PS+0x00+(明文) = 128字节,因为PS字段最少8个字节所以,明文最大长度为117位(128-1-1-8-1)
BT(1字节)在私钥加密时取0x01,公钥加密取0x02。PS(最少8个字节)在私钥加密时取0xFF,公钥加密时取随机值。
举例:1024位公钥加密:abc,0x00+0x02+随机字节(114字节)+0x00+abc=128字节

正是由于公钥加密时填充的字节是随机的,所以每次加密出来的密文都是不同的,但是私钥加密时填充的字节是固定的,所以密文是相同的。也可以通过填充随机字节使私钥加密变为随机密文(没有意义,公钥是公开的,这种方式与java不兼容)。

接下来是填充的方法部分,因此要兼容java,所以使用asciitohex方法来对原文进行编码转换,之后按照填充算法来填充明文。因为我是用ascii码转换的,所以不支持中文,需要支持中文的朋友自行修改编码转换部分即可。

 

 结尾,因为我比较懒所以只解决了一部分问题,还有其他问题未解决,比如不支持中文,还有没做循环加密因此只能加密一个块长度以下的密文,需要的朋友自行修改一下吧

源代码在csdn上,可以下载,麻烦施舍我一点积分,穷人没积分下资源啊。如果实在没积分可以联系我

下载地址:https://download.csdn.net/download/wsss_fan/11736982

后记:

其实JSEncrypt里加密时有做编码转换,把标红的这段复制出来做一个方法就可以了。

原文地址:https://www.cnblogs.com/wsss/p/11516318.html