| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title></title>
- <script src="js/jquery-1.11.3.min.js"></script>
- <script src="js/jsencrypt.min.js"></script>
- </head>
- <body style="text-align: center;">
- <label for="privkey">私钥</label>
- <br/>
- <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>
- <br/>
- <label for="pubkey">公钥</label>
- <br/>
- <textarea id="pubkey" rows="15" cols="65">MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8JU1nBDZ5PgRNAxksTC/MlaBX37vjTH84ppzmuEpH7e6G43QXd7Zof8apIJ4efk6Uiw2/OJfkyMGDsAJTv/zWnuKm6UeyBYxtgP5JFGtTMKTBVuGzH8UzYWdPzybIOCmj55Qku3nYEZyro38dGhSFLSPaU3eoY1tblm5ZFJ+8ewIDAQAB</textarea>
- <br/>
- <label for="input">要加密的字符串:</label>
- <br/>
- <textarea id="input" name="input" type="text" rows='4' cols='70'>123456789</textarea>
- <br/>
- <input id="testme" type="button" value="Test Me!!!" />
- <br/>
- <label for="jiami">加密后的密文:</label>
- <br/>
- <textarea id="jiami" name="jiami" type="text" rows='4' cols='70'></textarea>
- <br/>
- <label for="pubkey">解密后的密文</label>
- <br/>
- <textarea id="jiemi" name="jiemi" type="text" rows='4' cols='70'></textarea>
- <script type="text/javascript">
- $(function() {
- $('#testme').click(function() {
- // 进行RSA加密
- var encrypt = new JSEncrypt();
- //获取公钥
- encrypt.setPublicKey($('#pubkey').val());
- //公钥加密
- var encrypted = encrypt.encryptLong2($('#input').val());
- // 加密后的密文
- $('#jiami').val(encrypted);
-
- //解密
- var decrypt = new JSEncrypt();
- //获取私钥
- decrypt.setPrivateKey($('#privkey').val());
- //解药
- var uncrypted = decrypt.decryptLong2(encrypted);
- $('#jiemi').val(uncrypted);
- });
-
- });
- </script>
-
-
- <script>
- // Convert a hex string to a byte array
- function hexToBytes(hex) {
- for (var bytes = [], c = 0; c < hex.length; c += 2)
- bytes.push(parseInt(hex.substr(c, 2), 16));
- return bytes;
- }
- // Convert a byte array to a hex string
- function bytesToHex(bytes) {
- for (var hex = [], i = 0; i < bytes.length; i++) {
- hex.push((bytes[i] >>> 4).toString(16));
- hex.push((bytes[i] & 0xF).toString(16));
- }
- return hex.join("");
- }
-
- //方法一
- JSEncrypt.prototype.encryptLong=function (d){
- var k = this.key;
- var maxLength = (((k.n.bitLength() + 7) >> 3) - 11);
- try {
- var lt = "";
- var ct = "";
- if (d.length > maxLength) {
- lt = d.match(/.{1,117}/g);
- lt.forEach(function (entry) {
- var t1 = k.encrypt(entry);
- ct += t1;
- });
- return hexToBytes(ct);
- }
- var t = k.encrypt(d);
- var y = hexToBytes(t);
- return y;
- } catch (ex) {
- return false;
- }
- }
- JSEncrypt.prototype.decryptLong = function (string) {
- var k = this.getKey();
- var maxLength = ((k.n.bitLength() + 7) >> 3);
- //var maxLength = 128;
- try {
- var str = bytesToHex(string);
- //var b=hex2Bytes(str);
- var inputLen = str.length;
- var ct = "";
- if (str.length > maxLength) {
- var lt = str.match(/.{1,256}/g);
- lt.forEach(function (entry) {
- var t1 = k.decrypt(entry);
- ct += t1;
- });
- return ct;
- }
- var y = k.decrypt(bytesToHex(string));
- return y;
- } catch (ex) {
- return false;
- }
- };
- //方法2
- JSEncrypt.prototype.encryptLong2 = function (string) {
- var k = this.getKey();
- try {
- var lt = "";
- var ct = "";
- //RSA每次加密117bytes,需要辅助方法判断字符串截取位置
- //1.获取字符串截取点
- var bytes = new Array();
- bytes.push(0);
- var byteNo = 0;
- var len, c;
- len = string.length;
- var temp = 0;
- for (var i = 0; i < len; i++) {
- c = string.charCodeAt(i);
- if (c >= 0x010000 && c <= 0x10FFFF) {
- byteNo += 4;
- } else if (c >= 0x000800 && c <= 0x00FFFF) {
- byteNo += 3;
- } else if (c >= 0x000080 && c <= 0x0007FF) {
- byteNo += 2;
- } else {
- byteNo += 1;
- }
- if ((byteNo % 117) >= 114 || (byteNo % 117) == 0) {
- if (byteNo - temp >= 114) {
- bytes.push(i);
- temp = byteNo;
- }
- }
- }
- //2.截取字符串并分段加密
- if (bytes.length > 1) {
- for (var i = 0; i < bytes.length - 1; i++) {
- var str;
- if (i == 0) {
- str = string.substring(0, bytes[i + 1] + 1);
- } else {
- str = string.substring(bytes[i] + 1, bytes[i + 1] + 1);
- }
- var t1 = k.encrypt(str);
- ct += t1;
- }
- ;
- if (bytes[bytes.length - 1] != string.length - 1) {
- var lastStr = string.substring(bytes[bytes.length - 1] + 1);
- ct += k.encrypt(lastStr);
- }
- return hexToBytes(ct);
- }
- var t = k.encrypt(string);
- var y = hexToBytes(t);
- return y;
- } catch (ex) {
- return false;
- }
- };
- JSEncrypt.prototype.decryptLong2 = function (string) {
- var k = this.getKey();
- // var maxLength = ((k.n.bitLength()+7)>>3);
- var MAX_DECRYPT_BLOCK = 128;
- try {
- var ct = "";
- var t1;
- var bufTmp;
- var hexTmp;
- var str = bytesToHex(string);
- var buf = hexToBytes(str);
- var inputLen = buf.length;
- //开始长度
- var offSet = 0;
- //结束长度
- var endOffSet = MAX_DECRYPT_BLOCK;
- //分段加密
- while (inputLen - offSet > 0) {
- if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
- bufTmp = buf.slice(offSet, endOffSet);
- hexTmp = bytesToHex(bufTmp);
- t1 = k.decrypt(hexTmp);
- ct += t1;
-
- } else {
- bufTmp = buf.slice(offSet, inputLen);
- hexTmp = bytesToHex(bufTmp);
- t1 = k.decrypt(hexTmp);
- ct += t1;
-
- }
- offSet += MAX_DECRYPT_BLOCK;
- endOffSet += MAX_DECRYPT_BLOCK;
- }
- return ct;
- } catch (ex) {
- return false;
- }
- };
- </script>
-
-
- </body>
- </html>
- 作者:Astep
- 链接:https://www.jianshu.com/p/54cb90e6e183
- 來源:简书
- 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
|