new_file.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <script src="js/jquery-1.11.3.min.js"></script>
  7. <script src="js/jsencrypt.min.js"></script>
  8. </head>
  9. <body style="text-align: center;">
  10. <label for="privkey">私钥</label>
  11. <br/>
  12. <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>
  13. <br/>
  14. <label for="pubkey">公钥</label>
  15. <br/>
  16. <textarea id="pubkey" rows="15" cols="65">MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8JU1nBDZ5PgRNAxksTC/MlaBX37vjTH84ppzmuEpH7e6G43QXd7Zof8apIJ4efk6Uiw2/OJfkyMGDsAJTv/zWnuKm6UeyBYxtgP5JFGtTMKTBVuGzH8UzYWdPzybIOCmj55Qku3nYEZyro38dGhSFLSPaU3eoY1tblm5ZFJ+8ewIDAQAB</textarea>
  17. <br/>
  18. <label for="input">要加密的字符串:</label>
  19. <br/>
  20. <textarea id="input" name="input" type="text" rows='4' cols='70'>123456789</textarea>
  21. <br/>
  22. <input id="testme" type="button" value="Test Me!!!" />
  23. <br/>
  24. <label for="jiami">加密后的密文:</label>
  25. <br/>
  26. <textarea id="jiami" name="jiami" type="text" rows='4' cols='70'></textarea>
  27. <br/>
  28. <label for="pubkey">解密后的密文</label>
  29. <br/>
  30. <textarea id="jiemi" name="jiemi" type="text" rows='4' cols='70'></textarea>
  31. <script type="text/javascript">
  32. $(function() {
  33. $('#testme').click(function() {
  34. // 进行RSA加密
  35. var encrypt = new JSEncrypt();
  36. //获取公钥
  37. encrypt.setPublicKey($('#pubkey').val());
  38. //公钥加密
  39. var encrypted = encrypt.encryptLong2($('#input').val());
  40. // 加密后的密文
  41. $('#jiami').val(encrypted);
  42. //解密
  43. var decrypt = new JSEncrypt();
  44. //获取私钥
  45. decrypt.setPrivateKey($('#privkey').val());
  46. //解药
  47. var uncrypted = decrypt.decryptLong2(encrypted);
  48. $('#jiemi').val(uncrypted);
  49. });
  50. });
  51. </script>
  52. <script>
  53. // Convert a hex string to a byte array
  54. function hexToBytes(hex) {
  55. for (var bytes = [], c = 0; c < hex.length; c += 2)
  56. bytes.push(parseInt(hex.substr(c, 2), 16));
  57. return bytes;
  58. }
  59. // Convert a byte array to a hex string
  60. function bytesToHex(bytes) {
  61. for (var hex = [], i = 0; i < bytes.length; i++) {
  62. hex.push((bytes[i] >>> 4).toString(16));
  63. hex.push((bytes[i] & 0xF).toString(16));
  64. }
  65. return hex.join("");
  66. }
  67. //方法一
  68. JSEncrypt.prototype.encryptLong=function (d){
  69. var k = this.key;
  70. var maxLength = (((k.n.bitLength() + 7) >> 3) - 11);
  71. try {
  72. var lt = "";
  73. var ct = "";
  74. if (d.length > maxLength) {
  75. lt = d.match(/.{1,117}/g);
  76. lt.forEach(function (entry) {
  77. var t1 = k.encrypt(entry);
  78. ct += t1;
  79. });
  80. return hexToBytes(ct);
  81. }
  82. var t = k.encrypt(d);
  83. var y = hexToBytes(t);
  84. return y;
  85. } catch (ex) {
  86. return false;
  87. }
  88. }
  89. JSEncrypt.prototype.decryptLong = function (string) {
  90. var k = this.getKey();
  91. var maxLength = ((k.n.bitLength() + 7) >> 3);
  92. //var maxLength = 128;
  93. try {
  94. var str = bytesToHex(string);
  95. //var b=hex2Bytes(str);
  96. var inputLen = str.length;
  97. var ct = "";
  98. if (str.length > maxLength) {
  99. var lt = str.match(/.{1,256}/g);
  100. lt.forEach(function (entry) {
  101. var t1 = k.decrypt(entry);
  102. ct += t1;
  103. });
  104. return ct;
  105. }
  106. var y = k.decrypt(bytesToHex(string));
  107. return y;
  108. } catch (ex) {
  109. return false;
  110. }
  111. };
  112. //方法2
  113. JSEncrypt.prototype.encryptLong2 = function (string) {
  114. var k = this.getKey();
  115. try {
  116. var lt = "";
  117. var ct = "";
  118. //RSA每次加密117bytes,需要辅助方法判断字符串截取位置
  119. //1.获取字符串截取点
  120. var bytes = new Array();
  121. bytes.push(0);
  122. var byteNo = 0;
  123. var len, c;
  124. len = string.length;
  125. var temp = 0;
  126. for (var i = 0; i < len; i++) {
  127. c = string.charCodeAt(i);
  128. if (c >= 0x010000 && c <= 0x10FFFF) {
  129. byteNo += 4;
  130. } else if (c >= 0x000800 && c <= 0x00FFFF) {
  131. byteNo += 3;
  132. } else if (c >= 0x000080 && c <= 0x0007FF) {
  133. byteNo += 2;
  134. } else {
  135. byteNo += 1;
  136. }
  137. if ((byteNo % 117) >= 114 || (byteNo % 117) == 0) {
  138. if (byteNo - temp >= 114) {
  139. bytes.push(i);
  140. temp = byteNo;
  141. }
  142. }
  143. }
  144. //2.截取字符串并分段加密
  145. if (bytes.length > 1) {
  146. for (var i = 0; i < bytes.length - 1; i++) {
  147. var str;
  148. if (i == 0) {
  149. str = string.substring(0, bytes[i + 1] + 1);
  150. } else {
  151. str = string.substring(bytes[i] + 1, bytes[i + 1] + 1);
  152. }
  153. var t1 = k.encrypt(str);
  154. ct += t1;
  155. }
  156. ;
  157. if (bytes[bytes.length - 1] != string.length - 1) {
  158. var lastStr = string.substring(bytes[bytes.length - 1] + 1);
  159. ct += k.encrypt(lastStr);
  160. }
  161. return hexToBytes(ct);
  162. }
  163. var t = k.encrypt(string);
  164. var y = hexToBytes(t);
  165. return y;
  166. } catch (ex) {
  167. return false;
  168. }
  169. };
  170. JSEncrypt.prototype.decryptLong2 = function (string) {
  171. var k = this.getKey();
  172. // var maxLength = ((k.n.bitLength()+7)>>3);
  173. var MAX_DECRYPT_BLOCK = 128;
  174. try {
  175. var ct = "";
  176. var t1;
  177. var bufTmp;
  178. var hexTmp;
  179. var str = bytesToHex(string);
  180. var buf = hexToBytes(str);
  181. var inputLen = buf.length;
  182. //开始长度
  183. var offSet = 0;
  184. //结束长度
  185. var endOffSet = MAX_DECRYPT_BLOCK;
  186. //分段加密
  187. while (inputLen - offSet > 0) {
  188. if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
  189. bufTmp = buf.slice(offSet, endOffSet);
  190. hexTmp = bytesToHex(bufTmp);
  191. t1 = k.decrypt(hexTmp);
  192. ct += t1;
  193. } else {
  194. bufTmp = buf.slice(offSet, inputLen);
  195. hexTmp = bytesToHex(bufTmp);
  196. t1 = k.decrypt(hexTmp);
  197. ct += t1;
  198. }
  199. offSet += MAX_DECRYPT_BLOCK;
  200. endOffSet += MAX_DECRYPT_BLOCK;
  201. }
  202. return ct;
  203. } catch (ex) {
  204. return false;
  205. }
  206. };
  207. </script>
  208. </body>
  209. </html>
  210. 作者:Astep
  211. 链接:https://www.jianshu.com/p/54cb90e6e183
  212. 來源:简书
  213. 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。