首页 > 其他分享 >前端RSA加密解密

前端RSA加密解密

时间:2022-11-18 16:56:54浏览次数:77  
标签:加密 string bytes RSA 解密 let var return

1、以下仅适用于数据长度短,长的话会报错
import { JSEncrypt } from 'jsencrypt' // 公钥 const key = `xxxx` // 私钥 const privateKey = `xxxxsss` // 加密 export function encrypt (msg) { const jsencrypt = new JSEncrypt() jsencrypt.setPublicKey(key) return jsencrypt.encrypt(msg) } // 解密 export function decrypt (msg) { let decrypt = new JSEncrypt() decrypt.setPrivateKey(privateKey) var decryptMsg = decrypt.decrypt(msg) return decryptMsg } export default { encrypt , decrypt }

2、数据长度太长,要分段加密解密
import JSEncrypt from 'jsencrypt' 

// 公钥key
const publicKey = 'xxx'
// // 私钥key
const privateKey = 'xxxsss'

// 加密
export function encrypt(txt) {
  const encryptor = new JSEncrypt()
  encryptor.setPublicKey(publicKey) // 设置公钥
  return arrayBufferToBase64(encryptor.encryptLong(txt)) // 对数据进行加密
}

// 解密
export function decrypt(txt) {
  const encryptor = new JSEncrypt()
  encryptor.setPrivateKey(privateKey) // 设置私钥
  return encryptor.decryptLong(base64ToArrayBuffer(txt))// 对数据进行解密
}

// btye数组转base64
function arrayBufferToBase64(buffer) {
  var binary = '';
  var bytes = new Uint8Array(buffer);
  var len = bytes.byteLength;
  for (var i = 0; i < len; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  return window.btoa(binary);
}
//加密方法
JSEncrypt.prototype.encryptLong = function (string) {
  var k = this.getKey(); 
  try {
    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;
  }
};

/**
 * 分段解密
 * @param string
 * @returns {string|boolean}
 */
 JSEncrypt.prototype.decryptLong = function (string) {
 //第一种解密方式
  var k = this.getKey();
  //解密长度=key size.hex2b64结果是每字节每两字符,所以直接*2
  var maxLength = ((k.n.bitLength()+7)>>3)*2;
  try {
    var hexString = bytesToHex(string);
    var decryptedString = "";
    var rexStr=".{1," + maxLength  + "}";
    var rex =new RegExp(rexStr, 'g'); 
    var subStrArray = hexString.match(rex);
    if(subStrArray){
      subStrArray.forEach(function (entry) {
        decryptedString += k.decrypt(entry);
      });
      return decryptedString;
    }
  } catch (ex) {
    console.log("RSA分段解密失败", ex)
    return false;
  }
  //第二种解密方式
//   let k = this.getKey();
//  let MAX_DECRYPT_BLOCK = 128;//分段解密最大长度限制为128字节
//     //  ## 标题
//   try {
//       let ct = "";
//       let t1;
//       let bufTmp;
//       let hexTmp;
//       let str = bytesToHex(string);
//       let buf = hexToBytes(str);
//       let inputLen = buf.length;

//       //开始长度
//       let offSet = 0;
//       //结束长度
//       let 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) {
//       console.log("RSA分段解密失败", ex)
//       return false;
//   }
};


/**
* RSA 分段解密辅助
* @param hex
* @returns {[]}
*/

/**
* 16进制转byte数组
*/
function hexToBytes(hex) {
  let bytes = [];
  for (let c = 0; c < hex.length; c += 2)
      bytes.push(parseInt(hex.substr(c, 2), 16));
  return bytes;
}

/**
* byte数组转16进制
* @param bytes
* @returns {string}
*/
function bytesToHex(bytes) {
  let hex = [];
  for (let i = 0; i < bytes.length; i++) {
      hex.push((bytes[i] >>> 4).toString(16));
      hex.push((bytes[i] & 0xF).toString(16));
  }
  return hex.join("");
}

/**
* base64转btye数组
* @param base64
* @returns {Uint8Array}
*/
function base64ToArrayBuffer(base64) {
  let binary_string = window.atob(base64);
  let len = binary_string.length;
  let bytes = new Uint8Array(len);
  for (let i = 0; i < len; i++) {
      bytes[i] = binary_string.charCodeAt(i);
  }

  return bytes;
}

export default {encrypt,decrypt}

我查阅信息的时候有看到一个方法是下载安装encryptlong,来实现长文本加密解密,但我用的时候报错,没整明白再加上时间紧,故而选择这种方式;

有兴趣的朋友可以研究一下,encryptlong

标签:加密,string,bytes,RSA,解密,let,var,return
From: https://www.cnblogs.com/C-target/p/16903786.html

相关文章

  • 加密狗逻辑:判断权限,延时加载遮罩层
    之前新人做的加密狗显示水印遮罩的功能,一直有问题,逻辑还找不出来哪有问题,自己简单写了个demo,照着套:<!doctypehtml><htmllang="en"translate="no"><head><met......
  • 前端base64加密解密
    今天发现一个神奇的问题,用户反馈自己账号密码登不了,但是只有他一个人,然后自己区摸排,发现账号和密码输入的都一样就是登录不了,想到了base64的原因,因为我们的密码在进......
  • php openssl 实现非对称加密(RSA)
    需非对称加密实现类类似jwttoken令牌可能需要PHP需要安装openssl拓展才能实现代码:if(!function_exists('rsa')){/**rsa非对称算法生成*@returnarr......
  • 发送邮件加密附件
    发送邮件加密附件最近家里有事,所以只能暂时用着笔记本(现在就是,不好用),还有接下来忙着复习考试,等考完试再慢慢补博客吧~~加班比较多,工作上也发生挺多事的,自己搞的生产故......
  • JS登录密码基于token和CryptoJS加密处理方法
    1.登录前先请求,获取一个token,也可以在本地写死暂且叫登录token,用来给登录时密码的加密asyncgetToken(){const{data:token}=awaitgetToken()//t......
  • jar包加密启动
    jar包加密启动参考文档:https://gitee.com/roseboy/classfinaljava-jarclassfinal-fatjar-1.2.1.jar-fileD:\xxx.jar-libjarsxxx.jar-packagescom.xxx-pwd#-Y......
  • Python 对称加密
    转载:https://www.cnblogs.com/pywen/p/15831353.htmlfrompyDesimportdes,CBC,PAD_PKCS5importbinasciidefKEY_8(KEY):iflen(KEY)>8:KEY=KE......
  • python rsa加解密
    pythonrsa加解密代码:只适用python3:importbase64fromCrypto.CipherimportPKCS1_v1_5fromCryptoimportRandomfromCrypto.PublicKeyimportRSA#-------......
  • 常规web流量分析总结及例题(普通http流量,http传输文件流量,https加密流量,视频流)
    web流量分析基本套路流量分析传输了数据:ziprarpngjpgtxtmp3,特别是流量包比较大时需要注意binwalk分离文件,grep或者wireshark内ctrl+f搜索分情况使用导出对象,导出分组字......
  • Forest请求前置操作RSA签名加密
    前言在很多时候为了安全需要将请求的参数签名签名加密,使用非对称加密-RSA,非对称加密有供钥和私钥两个概念,私钥自己拥有,不能给别人,公钥公开,根据应用的不同,我们可以选择不同......