jsencrypt加密,并解决Message too long for RSA
解决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相关推荐
- jsencrypt 加密^3.0.0-rc.1版本new JSEncrypt报错问题
起因: jsencrypt加密这个逻辑一直是有的,最近同事拉代码npm install的时候竟然报错了,我本地没问题,奇怪了,我删除node_module后我这也报错了,然后看了有package-lo ...
- 计算机硬盘中了病毒处理方式,电脑硬盘被病毒加密如何解决 电脑硬盘被病毒加密的解决方法...
今天给大家带来电脑硬盘被病毒加密如何解决,电脑硬盘被病毒加密的解决方法,让您轻松解决问题. 电脑硬盘被病毒加密了怎么办 解决电脑硬盘被病毒加密的教程 现在出现了一种非常可恶的病毒,要是电脑出现后,会直 ...
- C#.Net中的加密解密(AES、DES、RSA、MD5)、数字证书、HTTPS
一.信息安全的基本概念,以及为什么要使用加密? 1.信息安全的定义 保密性(Confidentiality) 只有你自己和你允许的人能看到相关的信息. 完整性(Integrity) 信息收发过程中 ...
- python使用密钥加密的表述_python 利用Crypto进行RSA解密加密文件
背景:工作需要,部分数据进行了加密传输,对方使用了RSA对密码进行了加密,需要获取到解密的数据. 目标:在已知公钥,私钥的情况下,使用python对其进行解密. RSA加密 一.遇到的问题 收到加密的 ...
- 使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据(转)
转自:http://www.cnblogs.com/chnking/archive/2007/08/30/875947.html 使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数 ...
- xiaogui9527 使用X.509数字证书加密解密实务(三)-- 使用RSA证书结合对称加密技术加密长数据
一. 使用证书结合对称加密算法加.解密长数据 上一章节讨论了如何使用RSA证书加密数据,文中提到:"Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字 ...
- jsencrypt加密
1.安装jsencrypt包: npm i jsencrypt --save 2.新建加密工具类encryption.js: import {JSEncrypt} from 'jsencrypt' e ...
- jsencrypt加密同一值返回不同密文_密码学原语如何应用?解析密文同态性的妙用...
免责声明:本文旨在传递更多市场信息,不构成任何投资建议.文章仅代表作者观点,不代表火星财经官方立场. 小编:记得关注哦 来源:微众银行区块链 隐私数据在密文形式下是否依旧可以加减乘除?其背后的同态性原 ...
- RSA加密-解密以及解决超长内容加密失败解决
加解密(没有使用到证书):https://blog.csdn.net/qy20115549/article/details/83105736 生成证书网站:https://blog.csdn.net/ ...
- vue 、前端rsa加密遇到的问题,message too long for RSA
需求:对登录密码,修改密码过程进行加密,如RSA,3DES等,后台要求,最终选择了RSA加密 RSA加密:公钥和私钥(非对称性加密) 3DES加密:密钥加密 (对成型加密) 第一步:安装jsencry ...
最新文章
- Android中的常量 DEFAULT_KEYS_SHORTCUT
- idea导入项目无法通过tomcat插件无法运行记录
- 聊聊Socket、TCP/IP、HTTP、FTP及网络编程
- 线性插值改变图像尺寸_【图像分割模型】实例分割模型—DeepMask
- 微商团队长的五条管理心法
- http android下载工具,安卓抓包工具httpcanary
- 微软MIX10开幕 支持在线观看
- 将CSDN文章下载为markdown文档
- Backordered even the inventory is sufficient在库存量满足的情况下PICK却BACKORDER
- 怎样设置路由器禁用其他设备
- 我所遇见的bug 系列1 win7在生成的程序里,播放音频时没声音
- 网关如何快速接入移动OneNET云平台指南
- 下一代局域网 专家考虑改变企业网络环境
- 吹筒仔海钓纪实,来自陆丰陆丰公众号
- 【WebGIS】leaflet入门-自定义MarkerIcon
- Python-实战:基于白鲸BWO算法的VMD超参数优化
- Python基础学习笔记:匿名函数
- 前端性能优化:1.什么是前端性能优化
- pta 哥尼斯堡的“七桥问题”
- 基于python的国内外研究现状怎么写_如何写国内外研究现状-国内外研究