關於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里加密時有做編碼轉換,把標紅的這段復制出來做一個方法就可以了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM