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

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

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

 

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

 

js原生RSA公钥加密 js rsa加密算法_java

因为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码转换的,所以不支持中文,需要支持中文的朋友自行修改编码转换部分即可。

 

 

 

js原生RSA公钥加密 js rsa加密算法_java_02

不支持中文,还有没做循环加密因此只能加密一个块长度以下的密文,需要的朋友自行修改一下吧

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

下载地址:

 

后记:

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

js原生RSA公钥加密 js rsa加密算法_js原生RSA公钥加密_03