偏前端 + rsa加解密 + jsencrypt.min.js--(新增超長字符分段加解密)

 
 
 1 <html>
 2     <head>
 3         <title>JavaScript RSA Encryption</title>
 4         <meta charset="UTF-8">
 5         <script src="js/jquery-1.11.3.min.js"></script>
 6         <script src="js/jsencrypt.min.js"></script>
 7     </head>
 8     <body style="text-align: center;">
 9         <label for="privkey">私鑰</label>
10         <br/>
11         <textarea id="privkey" rows="15" cols="65">MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALwlTWcENnk+BE0DGSxML8yVoFffu+NMfzimnOa4Skft7objdBd3tmh/xqkgnh5+TpSLDb84l+TIwYOwAlO//Nae4qbpR7IFjG2A/kkUa1MwpMFW4bMfxTNhZ0/PJsg4KaPnlCS7edgRnKujfx0aFIUtI9pTd6hjW1uWblkUn7x7AgMBAAECgYEAsoOaK1Jd9S+YmRGFgvhOqgiV+Ip6FTJxy2iamnblU9Y3aZjKf7HASuphrfsay8f/+wTs6DBkPlkU80O/EYOp+r46UIKq5KChW2ErUVaMyxO4f8l0PW2RFHFYWq54SbRa73DepPeC3o9LRinEaJ7/rk13EHiS6RAPkFr/ZyTOYdECQQD0BNI4Wg4gJqZHC1QCHOQUaF2cDWh5cadWT9FOXKdgRUrP+2W67BJP/RjNPT++/cyP3pdNc8vMCkF8IGgJ7Pk/AkEAxWIwCK3prAxupNrlUhPNT+nfG05Bs0SYIQHSiwUykXkcUZAcAveNk2g8XlhAQ4fEZG9BQ0+MlA246FV90NlRxQJAJEm7QWoTA7D7tUD4A0BsoqRKl3Re/wBp1CoWhEK/GU/0qi1GmZ+VsZN/5rWfDzYK/7Ioafo4amV0C5N+JUu6XQJANbDuxf2guYcsNbXBeWEfkSRZ5xCTeJMpGplnTx+b0Mxz8o/Tvs7d+QH6oeM5n+T3fCZzRz8FS2SsLq7KqZvjzQJADLfcfxaYd3V7e0/Op08ifDyCjpLa3rviNFss/msOR3Mzfg7J05wD3oVHut+g+RVF7+Gnia07pV5YnFVd0WA1UA==</textarea>
12         <!--<br/>-->
13         <label for="pubkey">公鑰</label>
14         <!--<br/>-->
15         <textarea id="pubkey" rows="15" cols="65">MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8JU1nBDZ5PgRNAxksTC/MlaBX37vjTH84ppzmuEpH7e6G43QXd7Zof8apIJ4efk6Uiw2/OJfkyMGDsAJTv/zWnuKm6UeyBYxtgP5JFGtTMKTBVuGzH8UzYWdPzybIOCmj55Qku3nYEZyro38dGhSFLSPaU3eoY1tblm5ZFJ+8ewIDAQAB</textarea>
16         <br/>
17         <label for="input">要加密的字符串:</label>
18         <br/>
19         <textarea id="input" name="input" type="text" rows='4' cols='70'>123456789</textarea>
20         <!--<br/>-->
21         <input id="testme" type="button" value="Test Me!!!" />
22         <br/>
23         <label for="input">加密後的字符串:</label>
24         <br/>
25         <textarea id="jiami" name="jiami" type="text" rows='4' cols='70'></textarea>
26         <br/>
27         <label for="pubkey">解密後的密文</label>
28         <br/>
29         <textarea id="jiemi" name="jiemi" type="text" rows='4' cols='70'></textarea>
30     </body>
31 </html>

js部分:javascript

 1 <script type="text/javascript">
 2             $(function() {  3                 $('#testme').click(function() {  4                     // 加密前的原文
 5                     console.log('這是原文' + $('#input').val())  6                     // 進行RSA加密
 7                     var encrypt = new JSEncrypt();  8                     encrypt.setPublicKey($('#pubkey').val());  9                     var encrypted = encrypt.encrypt($('#input').val()); 10                     // 加密後的密文
11                     console.log('這是加密以後的' + encrypted); 12                     $('#jiami').val(encrypted); 13                     
14                     //解密
15                     var decrypt = new JSEncrypt(); 16                     decrypt.setPrivateKey($('#privkey').val()); 17                     var uncrypted = decrypt.decrypt(encrypted); 18                     console.log('這是解密後的密文' + uncrypted); 19                     $('#jiemi').val(uncrypted); 20  }); 21  }); 22         </script>

jsencrypt.min.js下載地址:html

[github主頁](https://github.com/travist/jsencrypt  )    java

 
jq庫:

(注!jquery-2.0以上版本再也不支持IE 6/7/8) 並非最新的版本就最好的,而是根據您項目需求所適合的版本!

 

最終效果:jquery

 

----新增超長字符分段加解密----
1.首先引入一段轉換的js
 1 //十六進制轉字節
 2     function hexToBytes(hex) {  3         for (var bytes = [], c = 0; c < hex.length; c += 2)  4             bytes.push(parseInt(hex.substr(c, 2), 16));  5         return bytes;  6  }  7 
 8 // 字節轉十六進制
 9     function bytesToHex(bytes) { 10         for (var hex = [], i = 0; i < bytes.length; i++) { 11             hex.push((bytes[i] >>> 4).toString(16)); 12             hex.push((bytes[i] & 0xF).toString(16)); 13  } 14         return hex.join(""); 15     }

2.在引入分段加解密js(這裏有2種方法供選擇,建議使用方法2git

*:若是與JAVA後臺數據交互。某些中文字符可能由於編碼緣由會亂碼,能夠加密前先進行  encodeURIComponent(s)。而後解密後在decode回來。github

  (方法一):網站

  

 1 //方法一
 2 JSEncrypt.prototype.encryptLong=function (d){  3   var k = this.key;  4   var maxLength = (((k.n.bitLength() + 7) >> 3) - 11);  5 
 6   try {  7     var lt = "";  8     var ct = "";  9 
10     if (d.length > maxLength) { 11       lt = d.match(/.{1,117}/g); 12       lt.forEach(function (entry) { 13         var t1 = k.encrypt(entry); 14         ct += t1; 15  }); 16       return hexToBytes(ct); 17  } 18     var t = k.encrypt(d); 19     var y = hexToBytes(t); 20     return y; 21   } catch (ex) { 22     return false; 23  } 24 } 25 
26 JSEncrypt.prototype.decryptLong = function (string) { 27     var k = this.getKey(); 28     var maxLength = ((k.n.bitLength() + 7) >> 3); 29     //var maxLength = 128;
30     try { 31 
32         var str = bytesToHex(string); 33         //var b=hex2Bytes(str);
34 
35         var inputLen = str.length; 36 
37         var ct = ""; 38         if (str.length > maxLength) { 39 
40             var lt = str.match(/.{1,256}/g); 41             lt.forEach(function (entry) { 42                 var t1 = k.decrypt(entry); 43                 ct += t1; 44  }); 45             return ct; 46  } 47         var y = k.decrypt(bytesToHex(string)); 48         return y; 49     } catch (ex) { 50         return false; 51  } 52 };

  方法二:this

 1 //方法2
 2 JSEncrypt.prototype.encryptLong2 = function (string) {  3     var k = this.getKey();  4     try {  5         var lt = "";  6         var ct = "";  7         //RSA每次加密117bytes,須要輔助方法判斷字符串截取位置
 8         //1.獲取字符串截取點
 9         var bytes = new Array(); 10         bytes.push(0); 11         var byteNo = 0; 12         var len, c; 13         len = string.length; 14         var temp = 0; 15         for (var i = 0; i < len; i++) { 16             c = string.charCodeAt(i); 17             if (c >= 0x010000 && c <= 0x10FFFF) { 18                 byteNo += 4; 19             } else if (c >= 0x000800 && c <= 0x00FFFF) { 20                 byteNo += 3; 21             } else if (c >= 0x000080 && c <= 0x0007FF) { 22                 byteNo += 2; 23             } else { 24                 byteNo += 1; 25  } 26             if ((byteNo % 117) >= 114 || (byteNo % 117) == 0) { 27                 if (byteNo - temp >= 114) { 28  bytes.push(i); 29                     temp = byteNo; 30  } 31  } 32  } 33         //2.截取字符串並分段加密
34         if (bytes.length > 1) { 35             for (var i = 0; i < bytes.length - 1; i++) { 36                 var str; 37                 if (i == 0) { 38                     str = string.substring(0, bytes[i + 1] + 1); 39                 } else { 40                     str = string.substring(bytes[i] + 1, bytes[i + 1] + 1); 41  } 42                 var t1 = k.encrypt(str); 43                 ct += t1; 44  } 45  ; 46             if (bytes[bytes.length - 1] != string.length - 1) { 47                 var lastStr = string.substring(bytes[bytes.length - 1] + 1); 48                 ct += k.encrypt(lastStr); 49  } 50             return hexToBytes(ct); 51  } 52         var t = k.encrypt(string); 53         var y = hexToBytes(t); 54         return y; 55     } catch (ex) { 56         return false; 57  } 58 }; 59 
60 JSEncrypt.prototype.decryptLong2 = function (string) { 61     var k = this.getKey(); 62     // var maxLength = ((k.n.bitLength()+7)>>3);
63     var MAX_DECRYPT_BLOCK = 128; 64     try { 65         var ct = ""; 66         var t1; 67         var bufTmp; 68         var hexTmp; 69         var str = bytesToHex(string); 70         var buf = hexToBytes(str); 71         var inputLen = buf.length; 72         //開始長度
73         var offSet = 0; 74         //結束長度
75         var endOffSet = MAX_DECRYPT_BLOCK; 76 
77         //分段加密
78         while (inputLen - offSet > 0) { 79             if (inputLen - offSet > MAX_DECRYPT_BLOCK) { 80                 bufTmp = buf.slice(offSet, endOffSet); 81                 hexTmp = bytesToHex(bufTmp); 82                 t1 = k.decrypt(hexTmp); 83                 ct += t1; 84                 
85             } else { 86                 bufTmp = buf.slice(offSet, inputLen); 87                 hexTmp = bytesToHex(bufTmp); 88                 t1 = k.decrypt(hexTmp); 89                 ct += t1; 90              
91  } 92             offSet += MAX_DECRYPT_BLOCK; 93             endOffSet += MAX_DECRYPT_BLOCK; 94  } 95         return ct; 96     } catch (ex) { 97         return false; 98  } 99 };

3.再配上前面的html 和 js調用部分,就能夠加解密任意長度的字符串啦,這裏就不重複寫了。編碼

但願你們可以用的上哈,其實這個不推薦分段的,太長的話比較慢!!!通常就是用文章頂部的就足夠了,作下登陸密碼的加解密就好了.加密

不想粘貼的童鞋到這裏下載一個demo看看吧:https://download.csdn.net/download/xfyc002/10872854

    

原文出處:https://www.cnblogs.com/Lrn14616/p/10154529.html

相關文章
相關標籤/搜索