关于js私钥加密公钥解密的问题
博客荒廢很久了,最近遇到一個(gè)問題,看網(wǎng)上的說明比較少,所以寫下來給大家一個(gè)參考
一般來說rsa算法都是使用公鑰加密,私鑰解密,或者私鑰簽名,公鑰驗(yàn)簽。但總有特別的時(shí)候會(huì)想要用私鑰加密,公鑰解密,但是js里面的框架沒找到直接提供這種方式的。于是,只能自己來解決一下這個(gè)問題,我選擇的是JSEncrypt這個(gè)框架(主要是寫的比較簡(jiǎn)單好看懂)。一般使用rsa算法都是使用的ECB模式和pkcs1padding填充算法,因此,如果使用了其他算法的本文章不適用。
其實(shí)解決方式很簡(jiǎn)單,公鑰加密就是用公鑰對(duì)原文進(jìn)行運(yùn)算,那私鑰其實(shí)就是用私鑰對(duì)原文進(jìn)行運(yùn)算,解密也是反過來就行。但是JSEncrypt這個(gè)框架,將密鑰對(duì)換之后,用私鑰加密得到的密文自己能解開,放到j(luò)ava里就無法解開,原因在于:JSEncrypt直接將原文進(jìn)行運(yùn)算,而java里是將原文進(jìn)行編碼轉(zhuǎn)換之后才進(jìn)行運(yùn)算,因此,只要修改JSEncrypt,將原文進(jìn)行轉(zhuǎn)換一次編碼就可以和java兼容
?
將JSEncrypt中加密的方法貼出來說明一下,encrypt是原本的公鑰加密的方法,encryptp是我加的私鑰加密的方法(起名比較隨意,見諒)。只要將填充部分和密鑰運(yùn)算修改即可。
?
因?yàn)閞sa是分塊加密的,所以對(duì)于1024位的公鑰加密來說,輸入的明文塊小于117位時(shí),在明文塊前添加一位的0x02字節(jié)(代表公鑰加密)然后后面的52位為隨機(jī)的字節(jié),在補(bǔ)位的最后一位,{即52(117-64-1),從零開始的},添加一位的字節(jié)0x00,在補(bǔ)位的后面添加實(shí)際的明文塊。而對(duì)于1024位的私鑰加密,如果輸入的明文塊小于117位,比如輸入的明文塊長(zhǎng)度為64位,那么對(duì)這個(gè)明文塊進(jìn)行補(bǔ)位,在明文塊千添加一位的0x01字節(jié)(代表私鑰加密),然后在后面的52位為字節(jié)0xff,在最后一位{即52(117-64-1),從零開始),添加一位的字節(jié)0x00,在補(bǔ)位的后面添加時(shí)間的明文塊。
正是由于公鑰加密時(shí)填充的字節(jié)是隨機(jī)的,所以每次加密出來的密文都是不同的,但是私鑰加密時(shí)填充的字節(jié)是固定的,所以密文是相同的。也可以通過填充隨機(jī)字節(jié)使私鑰加密變?yōu)殡S機(jī)密文(沒有意義,公鑰是公開的,這種方式與java不兼容)。
接下來是填充的方法部分,因此要兼容java,所以使用asciitohex方法來對(duì)原文進(jìn)行編碼轉(zhuǎn)換,之后按照填充算法來填充明文。因?yàn)槲沂怯胊scii碼轉(zhuǎn)換的,所以不支持中文,需要支持中文的朋友自行修改編碼轉(zhuǎn)換部分即可。
?
?
?
?結(jié)尾,因?yàn)槲冶容^懶所以只解決了一部分問題,還有其他問題未解決,比如不支持中文,還有沒做循環(huán)加密因此只能加密一個(gè)塊長(zhǎng)度以下的密文,需要的朋友自行修改一下吧
源代碼在csdn上,可以下載,麻煩施舍我一點(diǎn)積分,窮人沒積分下資源啊。如果實(shí)在沒積分可以聯(lián)系我
下載地址:https://download.csdn.net/download/wsss_fan/11736982
?
后記:
其實(shí)JSEncrypt里加密時(shí)有做編碼轉(zhuǎn)換,把標(biāo)紅的這段復(fù)制出來做一個(gè)方法就可以了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wsss/p/11516318.html
總結(jié)
以上是生活随笔為你收集整理的关于js私钥加密公钥解密的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法学习:后缀自动机
- 下一篇: Dart语言--基础内容