JS-RSA超长加密

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: JS-RSA超长加密

近公司要做个项目要用到RSA加密,所以在网上找了一些博客,并下载了一些demo测试了下,但不太乐观。目前网上的绝大部分博客对超长字符串(117位以上)加密不太支持或者支持的不太好。即使是付费的,也请教不少做前端的朋友都比较少接触,只能自己去探索。

1.我目前是用 jsencrypt.js库来解决这个问题

2.生产公私钥 这一步的话,可以直接 在线生成

3.定义方法 这里需要重新定义两个方法:超长加密(encryptLong2)、超长解密(decryptLong2)

4.完整的demo代码如下:

<!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>
目录
相关文章
|
2月前
|
JavaScript 前端开发 安全
js逆向实战之烯牛数据请求参数加密和返回数据解密
【9月更文挑战第20天】在JavaScript逆向工程中,处理烯牛数据的请求参数加密和返回数据解密颇具挑战。本文详细分析了这一过程,包括网络请求监测、代码分析、加密算法推测及解密逻辑研究,并提供了实战步骤,如确定加密入口点、逆向分析算法及模拟加密解密过程。此外,还强调了法律合规性和安全性的重要性,帮助读者合法且安全地进行逆向工程。
84 11
|
3月前
|
JavaScript 数据安全/隐私保护 Python
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
122 4
|
3月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
243 1
|
3月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
161 1
|
3月前
|
JavaScript 算法 数据安全/隐私保护
烯牛数据JS逆向:MD5数据加密?不存在的!
烯牛数据JS逆向:MD5数据加密?不存在的!
73 1
|
3月前
|
JavaScript 前端开发 数据安全/隐私保护
雪球JS逆向:阿里系加密acw_sc__v2和反debugger
雪球JS逆向:阿里系加密acw_sc__v2和反debugger
168 1
|
3月前
|
JavaScript 前端开发 安全
前程无忧搜索接口 JS 逆向:阿里系acw_sc__v2和Sign加密
前程无忧搜索接口 JS 逆向:阿里系acw_sc__v2和Sign加密
62 0
|
3月前
|
JavaScript 数据安全/隐私保护 Python
东方财富股票数据JS逆向:secids字段和AES加密实战
东方财富股票数据JS逆向:secids字段和AES加密实战
91 0
|
3月前
|
JavaScript 前端开发 数据安全/隐私保护
空气质量在线监测平台JS逆向:请求响应数据加密
空气质量在线监测平台JS逆向:请求响应数据加密
47 0
|
2天前
|
安全 网络安全 数据安全/隐私保护
数字堡垒的裂缝与钥匙——网络安全漏洞、加密技术与安全意识的博弈
【10月更文挑战第28天】在数字化时代的浪潮中,网络世界如同一座座坚固的堡垒,保护着数据的安全和隐私。然而,这些堡垒并非不可攻破。网络安全漏洞的存在,如同隐藏在城墙之下的裂缝,时刻威胁着堡垒的安全。而加密技术,则是守护这些堡垒的金钥匙,它能够将信息转化为只有授权者才能解读的密文,确保通信的安全。但是,即便有了最先进的加密技术,如果缺乏足够的安全意识,这座堡垒也会变得脆弱不堪。因此,了解网络安全漏洞、掌握加密技术,并培养良好的安全意识,是我们在数字世界中保护自己的重要手段。