解决Message too long for RSA报错

在这里我们有两种选择方案,jsencrypt和  encryptlong

使用后者的原因是因为jsencrypt的加密长度有限制,不过encryptlong本身也是有bug,有事又会问题,加密后解析不出来,可能是我的个人原因

这次我主要就说明jsencrypt如果能加密比较长的数据

1、先下载 encrypt

npm i encrypt / yarn add encrypt

2、复制代码

用来给他重新定义一方法使用

加密

const b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const b64pad = "=";
JSEncrypt.prototype.encryptLong2 = function (string) {const k = this.getKey();try {const lt = "";let ct = "";//RSA每次加密117bytes,需要辅助方法判断字符串截取位置//1.获取字符串截取点const bytes = new Array();bytes.push(0);let byteNo = 0;let len, c;// eslint-disable-next-line prefer-constlen = string.length;let temp = 0;// eslint-disable-next-line no-varfor (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) {// eslint-disable-next-line no-varfor (var i = 0; i < bytes.length - 1; i++) {// eslint-disable-next-line no-varvar str;if (i == 0) {str = string.substring(0, bytes[i + 1] + 1);} else {str = string.substring(bytes[i] + 1, bytes[i + 1] + 1);}const t1 = k.encrypt(str);ct += addPreZero(t1, 256);};if (bytes[bytes.length - 1] != string.length - 1) {const lastStr = string.substring(bytes[bytes.length - 1] + 1);const rsaStr = k.encrypt(lastStr)ct += addPreZero(rsaStr, 256);}//console.log("加密完的数据:"+ct);return hex2b64(ct);}const t = k.encrypt(string);const y = hex2b64(t);return y;} catch (ex) {return false;}
}

解密,(注:前端基本用不着就不用引了)

JSEncrypt.prototype.decryptLong2 = function (string) {const k = this.getKey();// var maxLength = ((k.n.bitLength()+7)>>3);const MAX_DECRYPT_BLOCK = 128;try {let ct = "";let t1;let bufTmp;let hexTmp;const str = b64tohex(string);const buf = hexToBytes(str);const inputLen = buf.length;//开始长度let offSet = 0;//结束长度let endOffSet = MAX_DECRYPT_BLOCK;//分段解密console.log(inputLen + "----" + offSet)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;}
}

3、需要引入的方法

这些都是编码过程中需要使用的一些方法

//  在JsEncrypt原型上写了分段加密方法 encryptLong 使用时替换encrypt方法即可
function hex2b64(h) {let i;let c;let ret = "";for (i = 0; i + 3 <= h.length; i += 3) {c = parseInt(h.substring(i, i + 3), 16);ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);}if (i + 1 == h.length) {c = parseInt(h.substring(i, i + 1), 16);ret += b64map.charAt(c << 2);}else if (i + 2 == h.length) {c = parseInt(h.substring(i, i + 2), 16);ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);}while ((ret.length & 3) > 0) ret += b64pad;return ret;
}
function hexToBytes(hex: string) {for (var bytes = [], c = 0; c < hex.length; c += 2)bytes.push(parseInt(hex.substr(c, 2), 16));return bytes;
}
function bytesToHex(bytes: string | any[]) {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("");
}
function b64tohex(str: string) {for (var i = 0, bin = atob(str.replace(/[ \r\n]+$/, "")), hex = []; i < bin.length; ++i) {var tmp = bin.charCodeAt(i).toString(16);if (tmp.length === 1) tmp = "0" + tmp;hex[hex.length] = tmp;}return hex.join("");
}
function addPreZero(num, length) {var t = (num + '').length,s = '';for (var i = 0; i < length - t; i++) {s += '0';}return s + num;
}

三、代码中使用

尽可能两个都设置,这个是我封装的方法

const encryptLong = (Encstr: string) => {const encrypt = new JSEncrypt();encrypt.setPublicKey(PUBLIC_KEY);       // 你的公钥encrypt.setPrivateKey(PRIVATE_KEY)      // 你的私钥const data = encrypt.encryptLong2(Encstr);return data;
}

使用过程

const data = {"id": "7ca6a4981a28cf3734343434242710c2c","name": "admin","userName": "admin","phone": "13211222222222","sex": 0,"roleId": "32423asdsad4234234","isDriver": 0,"department": "体育部","status": 0,"reset": 1,"remark": "你好呀你是哪里人呢","companyId": "060b8b4fd3ef48f589727db415571427"
}
const strJSON= JSON.stringify(data);   // 将jso转为字符串
const result = encryptLong(strJSON);    // 调用封装的方法//加密结果 后端也要使用分段解密ZHOd7cj0zc0Iaw1hqOH4TFGLxhWGpaqPqWQ+jTVUnosAPr85LAuFXRxZpD6czT0eh96XhRxWgZIQxsqkXEaOPKk1LKWHahrkf1IvtyBO1Uf8GEVkGMPcqj27Qx/HfrsZaUoV0awXVP7dcu/4HDLyF50Is1H7VmUULWmCHd1xxJpvTS5B8yptitanEqDL8pf0qx1dF7AHLNojYw9xusBfWCp21BOyrzjprKtW2ZRQeRmmxURRpPtqoJdOU0PwI/ZbPTtwK26nlLwlzIOkqz5wx9qyjm7ub38sulZP2BGZfv+3EjatVS7XqzxmvcQLPwIU/adoUVFg74XZbg6UGpYi0EXZkqVz03JaG190PxwdjN6ds0gU9WTvSPZAxd7ce7M+LjE/SwP6czAePgG9kHmD3KXJTJ8Ja8PtZUPDnw2Ar8LJL7oyDrTAVLO+IbozO6YMXkVgeZytJ4TwZBfHcSDECfpp+ge1atHtukgKz3Q2O3IO2AN6Cm6zQHTRv...

基本上就是如此使用

完美使用,完结撒花

jsencrypt加密,并解决Message too long for RSA相关推荐

  1. jsencrypt 加密^3.0.0-rc.1版本new JSEncrypt报错问题

    起因: jsencrypt加密这个逻辑一直是有的,最近同事拉代码npm install的时候竟然报错了,我本地没问题,奇怪了,我删除node_module后我这也报错了,然后看了有package-lo ...

  2. 计算机硬盘中了病毒处理方式,电脑硬盘被病毒加密如何解决 电脑硬盘被病毒加密的解决方法...

    今天给大家带来电脑硬盘被病毒加密如何解决,电脑硬盘被病毒加密的解决方法,让您轻松解决问题. 电脑硬盘被病毒加密了怎么办 解决电脑硬盘被病毒加密的教程 现在出现了一种非常可恶的病毒,要是电脑出现后,会直 ...

  3. C#.Net中的加密解密(AES、DES、RSA、MD5)、数字证书、HTTPS

    一.信息安全的基本概念,以及为什么要使用加密? 1.信息安全的定义 保密性(Confidentiality)  只有你自己和你允许的人能看到相关的信息. 完整性(Integrity)  信息收发过程中 ...

  4. python使用密钥加密的表述_python 利用Crypto进行RSA解密加密文件

    背景:工作需要,部分数据进行了加密传输,对方使用了RSA对密码进行了加密,需要获取到解密的数据. 目标:在已知公钥,私钥的情况下,使用python对其进行解密. RSA加密 一.遇到的问题 收到加密的 ...

  5. 使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据(转)

    转自:http://www.cnblogs.com/chnking/archive/2007/08/30/875947.html 使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数 ...

  6. xiaogui9527 使用X.509数字证书加密解密实务(三)-- 使用RSA证书结合对称加密技术加密长数据

    一.  使用证书结合对称加密算法加.解密长数据 上一章节讨论了如何使用RSA证书加密数据,文中提到:"Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字 ...

  7. jsencrypt加密

    1.安装jsencrypt包: npm i jsencrypt --save 2.新建加密工具类encryption.js: import {JSEncrypt} from 'jsencrypt' e ...

  8. jsencrypt加密同一值返回不同密文_密码学原语如何应用?解析密文同态性的妙用...

    免责声明:本文旨在传递更多市场信息,不构成任何投资建议.文章仅代表作者观点,不代表火星财经官方立场. 小编:记得关注哦 来源:微众银行区块链 隐私数据在密文形式下是否依旧可以加减乘除?其背后的同态性原 ...

  9. RSA加密-解密以及解决超长内容加密失败解决

    加解密(没有使用到证书):https://blog.csdn.net/qy20115549/article/details/83105736 生成证书网站:https://blog.csdn.net/ ...

  10. vue 、前端rsa加密遇到的问题,message too long for RSA

    需求:对登录密码,修改密码过程进行加密,如RSA,3DES等,后台要求,最终选择了RSA加密 RSA加密:公钥和私钥(非对称性加密) 3DES加密:密钥加密 (对成型加密) 第一步:安装jsencry ...

最新文章

  1. Android中的常量 DEFAULT_KEYS_SHORTCUT
  2. idea导入项目无法通过tomcat插件无法运行记录
  3. 聊聊Socket、TCP/IP、HTTP、FTP及网络编程
  4. 线性插值改变图像尺寸_【图像分割模型】实例分割模型—DeepMask
  5. 微商团队长的五条管理心法
  6. http android下载工具,安卓抓包工具httpcanary
  7. 微软MIX10开幕 支持在线观看
  8. 将CSDN文章下载为markdown文档
  9. Backordered even the inventory is sufficient在库存量满足的情况下PICK却BACKORDER
  10. 怎样设置路由器禁用其他设备
  11. 我所遇见的bug 系列1 win7在生成的程序里,播放音频时没声音
  12. 网关如何快速接入移动OneNET云平台指南
  13. 下一代局域网 专家考虑改变企业网络环境
  14. 吹筒仔海钓纪实,来自陆丰陆丰公众号
  15. 【WebGIS】leaflet入门-自定义MarkerIcon
  16. Python-实战:基于白鲸BWO算法的VMD超参数优化
  17. Python基础学习笔记:匿名函数
  18. 前端性能优化:1.什么是前端性能优化
  19. pta 哥尼斯堡的“七桥问题”
  20. 基于python的国内外研究现状怎么写_如何写国内外研究现状-国内外研究

热门文章

  1. 马尔可夫毯/马尔科夫链/因果图/贝叶斯网络
  2. jQuery项目:京东商品详情页
  3. MacBook使用HHKB键盘设置
  4. 图嵌入中节点如何映射到向量
  5. SMILES Enumeration
  6. 有关LaaS、PaaS、SaaS概念认识
  7. 如何创建Vue脚手架以及关闭语法检查
  8. uniapp猫眼电影小程序(附带猫眼电影api接口)
  9. 初级系列11.个人所得税问题
  10. 金蝶kis修改服务器,金蝶kis 修改服务器地址