Ras前端加解密

726 阅读1分钟

1.网上下载jsencrypt.min.js文件,创建encrypt.js文件内容如下

    var k = this.getKey();
    var maxLength = 128;
    function base64ToHex(base64) {
      var raw = atob(base64);
      var HEX = '';
      for ( i = 0; i < raw.length; i++ ) {
        var _hex = raw.charCodeAt(i).toString(16)
        HEX += (_hex.length==2?_hex:'0'+_hex);
      }
      return HEX.toUpperCase();
    }
    try {
    var string = base64ToHex(string);
    var ct = "";
    if (string.length > maxLength * 2) {
    var lt = string.match(/.{1,256}/g); //128 Bit decryption . take 256 position
    lt.forEach(function (entry) {
    var t1 = k.decrypt(entry);
    ct += t1;
    });
    return ct;
    }
    var y = k.decrypt(string);
    return y;
    } catch (ex) {
    console.log(ex);
    return false;
    }
   };
   
JSEncrypt.prototype.encryptLong = function (string) {
    var k = this.getKey();
    function hexToBase64(str) {
        return btoa(String.fromCharCode.apply(null,
            str.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" "))
        );
    }
    try {
        var ct = "";
        //RSA Every time the encryption 117bytes, An auxiliary method is needed to determine the location of the string interception
        //1. Gets the string interception point
        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) {  // Special characters , Such as Ř,Ţ
                byteNo += 4;
            } else if (c >= 0x000800 && c <= 0x00FFFF) { // Chinese and punctuation
                byteNo += 3;
            } else if (c >= 0x000080 && c <= 0x0007FF) { // Special characters , Such as È,Ò
                byteNo += 2;
            } else { //  English and punctuation
                byteNo += 1;
            }
            if ((byteNo % 117) >= 114 || (byteNo % 117) == 0) {
                if (byteNo - temp >= 114) {
                    bytes.push(i);
                    temp = byteNo;
                }
            }
        }
        //2. Intercepts a string and segments it for encryption
        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 hexToBase64(ct);
        }
        var t = k.encrypt(string);
        var y = hexToBase64(t);
        return y;
    } catch (ex) {
        console.log(ex);
        return false;
    }
};
   
   var jsKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCWlaWzBITjy1H3AyRuEsLVcdI3rVW6vT8chSzwrhJufjYpXr8eDGU1u8OpFsQeLLrn0yQVxaQ/C7XxnytTgdfUne98QPUbUf2GgvhDk0EKouxzmW5JrhkfDNwnzQ1Gre9XCTwQGAXUgXNAAEgsnVNBz0CrW4poH10J7/onxTDKhQIDAQAB"
   var encrypt = new JSEncrypt();
   encrypt.setPublicKey(jsKey);

其中jskey是成对出现的公私钥,前端使用公钥加密,后端返回数据使用私钥解密 2.在使用的地方同时引入jsencrypt.min.js文件和encrypt.js,使用 encrypt.encryptLong(content)对字段加密,其中content是需要加密的字段 注意事项:1.在使用get方法传递加密的数据时,接收加密内容加号(+)展示成了''(空格),此时可以使用string.replace(' ','+')替换掉空格即可 2.ras加密分为固定一对公私钥加密和动态公私钥加密,根据项目实际需要选择不同的加密方式