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

摘要:
----˃15MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8JU1nBDZ5PgRNAxksTC/MlaBX37vjTH84ppzmuEpH7e6G43QXd7Zof8apIJ4efk6Uiw2/OJfkyMGDsAJTv/zWnuKm6UeyBYxtgP5JFGtTMKTBVuGzH8UzYWdPzybIOCmj55Qku3nYEZyro38dGhSFLSPaU3eoY1tblm5ZFJ+8ewIDAQAB1617要加密的字符串:181912345678920˂!jquery-2.0以上版本不再支持IE6/7/8)并不是最新的版本就最好的
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部分:

1 <script type="text/javascript">
2             $(function() {
3                 $('#testme').click(function() {
4                     //加密前的原文
5                     console.log('这是原文' + $('#input').val())
6                     //进行RSA加密
7                     var encrypt = newJSEncrypt();
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 = newJSEncrypt();
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下载地址:

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

[官方网站](http://travistidwell.com/jsencrypt/ )
jq库:
<scriptsrc="http://code.jquery.com/jquery-1.8.3.min.js"></script>

(注!jquery-2.0以上版本不再支持IE 6/7/8) 并不是最新的版本就最好的,而是根据您项目需求所适合的版本!

最终效果:

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

----新增超长字符分段加解密----
1.首先引入一段转换的js
1 //十六进制转字节
2     functionhexToBytes(hex) {
3         for (var bytes = [], c = 0; c < hex.length; c += 2)
4             bytes.push(parseInt(hex.substr(c, 2), 16));
5         returnbytes;
6 }
7 
8 //字节转十六进制
9     functionbytesToHex(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种方法供选择,建议使用方法2

*:如果与JAVA后台数据交互。某些中文字符可能因为编码原因会乱码,可以加密前先进行encodeURIComponent(s)。然后解密后在decode回来。

(方法一):

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       returnhexToBytes(ct);
17 }
18     var t =k.encrypt(d);
19     var y =hexToBytes(t);
20     returny;
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             returnct;
46 }
47         var y =k.decrypt(bytesToHex(string));
48         returny;
49     } catch(ex) {
50         return false;
51 }
52 };

方法二:

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 = newArray();
10         bytes.push(0);
11         var byteNo = 0;
12         varlen, 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                 varstr;
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             returnhexToBytes(ct);
51 }
52         var t =k.encrypt(string);
53         var y =hexToBytes(t);
54         returny;
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         vart1;
67         varbufTmp;
68         varhexTmp;
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         returnct;
96     } catch(ex) {
97         return false;
98 }
99 };

3.再配上前面的html 和 js调用部分,就可以加解密任意长度的字符串啦,这里就不重复写了。

希望大家能够用的上哈,其实这个不推荐分段的,太长的话比较慢!!!一般就是用文章顶部的就足够了,做下登录密码的加解密就行了.

不想粘贴的童鞋到这里下载一个demo看看吧:https://download.csdn.net/download/xfyc002/10872854

免责声明:文章转载自《偏前端 + rsa加解密 + jsencrypt.min.js--(新增超长字符分段加解密)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇LMAX Disruptor—多生产者多消费者中,消息复制分发的高性能实现(转)svn检出的时候报 Unable to connect to a repository at URL错误下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

解决无/var/log/messages 问题

转载于:https://blog.csdn.net/C_Major/article/details/51321684 1 内核编程insmod后,Ubuntu查看日志无/var/log/messages 写好简单内核模块如hellomod.ko后,执行命令 insmod hellomod.ko 后,查看内核打印的printk信息, tail /var/...

Vbscript Property let,Property Get,Property Set

Class properties in VBScript are used to assign values to private variable and handle the process of data validation. Property Let: Which is used by the outside code to store a v...

startUML破解方式

StarUML官方下载地址:http://staruml.io/download StarUML是一个非常好用的画UML图的工具,但是它是收费软件​,以下是破解方法: ​1.使用Editplus或者Notepad++等特殊的文本编辑器打开%StarUML_HOME%/www/license/node/LicenseManagerDomain.js文件 2....

前端请求参数MD5加密发送后台

最近在项目开发中遇到前端发送参数加密的问题,网上查找半天也是很乱,小编自己在项目开发中总结了一下,写到博客中,希望能够帮助大家。 贴上html,javascript代码 1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UT...

OpenCvSharp 图片人脸检测 总结

。 public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArg...

NodeJs实现下载Excel文件

nodejs作为一门新的语言,报表功能也不是十分完善。 (1).js-xlsx: 目前 Github 上 star 数量最多的处理 Excel 的库,支持解析多种格式表格XLSX / XLSM / XLSB / XLS / CSV,解析采用纯js实现,写入需要依赖nodejs或者FileSaver.js实现生成写入Excel,可以生成子表Excel,功能强...