• 偏前端 + 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部分:

     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下载地址:

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

     
    jq库:

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

    最终效果:

    ----新增超长字符分段加解密----
    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种方法供选择,建议使用方法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       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 };

      方法二:

     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

        

  • 相关阅读:
    C/C++ 库函数 是否调用 WinAPI
    获得图形的实际坐标值
    电影
    adobe flash player 下载地址
    加速软件
    电影_排行榜
    transform
    MyEclipse
    Android
    AAA
  • 原文地址:https://www.cnblogs.com/Lrn14616/p/10154529.html
Copyright © 2020-2023  润新知