vue RSA加密解密(解决加密过长,解密过长返回为null的问题)

embedded/2024/9/24 13:23:49/

1安装

javascript">npm i jsencrypt

2.rsa.js

javascript">/* 引入jsencrypt实现数据RSA加密 */
import JSEncrypt from 'jsencrypt' // 处理长文本数据时报错 jsencrypt.js Message too long for RSA
/* 引入encryptlong实现数据RSA加密 */
//import Encrypt from 'encryptlong' // encryptlong是基于jsencrypt扩展的长文本分段加解密功能。//公钥key
const publicKey= "****";
//私钥key
const privateKey= "****"
import JsEncrypt from 'jsencrypt';
//import Encrypt from 'encryptlong' // encryptlong是基于jsencrypt扩展的长文本分段加解密功能。
class JsEncryptNew extends JsEncrypt {constructor() {super();this.b64map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';this.b64pad = '=';this.BI_RM = '0123456789abcdefghijklmnopqrstuvwxyz';}int2char = function (n) {return this.BI_RM.charAt(n);};b64tohex = function (s) {var ret = '';var i;var k = 0; // b64 state, 0-3var slop = 0;for (i = 0; i < s.length; ++i) {if (s.charAt(i) === this.b64pad) {break;}var v = this.b64map.indexOf(s.charAt(i));if (v < 0) {continue;}if (k === 0) {ret += this.int2char(v >> 2);slop = v & 3;k = 1;} else if (k === 1) {ret += this.int2char((slop << 2) | (v >> 4));slop = v & 0xf;k = 2;} else if (k === 2) {ret += this.int2char(slop);ret += this.int2char(v >> 2);slop = v & 3;k = 3;} else {ret += this.int2char((slop << 2) | (v >> 4));ret += this.int2char(v & 0xf);k = 0;}}if (k === 1) {ret += this.int2char(slop << 2);}return ret;};hex2b64 = function (h) {var i;var c;var ret = '';for (i = 0; i + 3 <= h.length; i += 3) {c = parseInt(h.substring(i, i + 3), 16);ret += this.b64map.charAt(c >> 6) + this.b64map.charAt(c & 63);}if (i + 1 === h.length) {c = parseInt(h.substring(i, i + 1), 16);ret += this.b64map.charAt(c << 2);} else if (i + 2 === h.length) {c = parseInt(h.substring(i, i + 2), 16);ret += this.b64map.charAt(c >> 2) + this.b64map.charAt((c & 3) << 4);}while ((ret.length & 3) > 0) {ret += this.b64pad;}return ret;};// 分段加密encryptLong = function (string) {var k = this.getKey();// var maxLength = (((k.n.bitLength() + 7) >> 3) - 11);//117try {// var lt = '';var ct = '';// RSA每次加密117bytes,需要辅助方法判断字符串截取位置// 1.获取字符串截取点var bytes = [];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 (let 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);// debugger;}return this.hex2b64(ct);}var t = k.encrypt(string);var y = this.hex2b64(t);return y;} catch (ex) {return false;}};// 分段解密长字符串decryptLong = function (text) {// Return the decrypted string.// console.log(this);var k = this.getKey();var maxLength = ((k.n.bitLength() + 7) >> 3);try {var str = this.b64tohex(text);// var b=hex2Bytes(str);var inputLen = str.length;var ct = '';if (inputLen > 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(this.b64tohex(text));return y;} catch (ex) {return false;}};
}/* JSEncrypt加密 */
//长文本
export const encrypt = (str, key = publicKey) => {const encrypt = new JsEncryptNew();encrypt.setPublicKey(key);return encrypt.encryptLong(str.toString());
};
//短文本
export const encryptCode = (str, key = publicKey) => {//console.log('rsa文件中的publicKey', encryptKey)let encrypt = new JsEncrypt();//设置公钥 公钥是由后端返回的encrypt.setPublicKey(key);// 如果是对象/数组的话,需要先JSON.stringify转换成字符串let result = encrypt.encrypt(JSON.stringify(str));return result
}
// JSEncrypt解密
//长文本
export const decrypt = (str, key = privateKey) => {const decrypt = new JsEncryptNew();decrypt.setPrivateKey(key);return decrypt.decryptLong(str.toString());
};
//短文本
export const decryptCode = (str, key = privateKey) => {let decrypt = new JSEncrypt();//设置私钥  私钥也是从后端拿的decrypt.setPrivateKey(key);let result = decrypt.decrypt(str);return result
}

3.在页面使用

javascript"><script setup>
import { ref, getCurrentInstance, rective} from "vue";
import { encryptCode,decryptCode,encrypt,decrypt} from "@/utils/rsa"
const info = ref({
username:"name",
password:"123456"
})
let logins = {username: info.value.username,password: info.value.password,};let login1 = that.$utils.encryptCode(JSON.stringify(logins)); //加密let login = that.$utils.decryptCode(login1); //解密// 如果解密字段过长,返回null,用encryptlong进行解密let login = that.$utils.decrypt(login1); //解密
//接口
</script 

http://www.ppmy.cn/embedded/94911.html

相关文章

计算机视觉入门:OpenCV 人脸检测技术简介

计算机视觉入门&#xff1a;OpenCV 人脸检测技术简介 计算机视觉是让计算机“看”并理解图像或视频内容的技术领域。它在许多应用中扮演着重要角色&#xff0c;如自动驾驶、医疗影像分析和视频监控等。在计算机视觉中&#xff0c;人脸检测是一项基础而关键的技术&#xff0c;其…

【Kubernetes】Service 概念与实战

Service 概念与实战 1.通过 Service 向外部暴露 Pod2.Service 的多端口设置3.集群内部的 DNS 服务4.无头 Service 在 Kubernetes 中部署的应用可能对应一个或者多个 Pod&#xff0c;而每个 Pod 又具有独立的 IP 地址。Service&#xff08;服务&#xff09;能够为一组功能相同的…

DIfy中集成magic-pdf实现文档解析agent与多模态大模型图文问答

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 swift与Internvl下的多模态大模型分布式微调指南&#xff08;附代码和数据&#xff…

rustrover打开会报Error: Invalid toolchain

如果 cargo --version 正常输出&#xff0c;但在使用 RustRover 时出现“Invalid toolchain”错误&#xff0c;可能是由于 RustRover 工具链配置有问题或路径指向错误。 解决步骤&#xff1a; 1. 检查 RustRover 的工具链配置 打开 RustRover&#xff0c;进入 Preferences 或…

代码随想录算法训练营第十一天

力扣题部分: 150. 逆波兰表达式求值 题目链接:. - 力扣&#xff08;LeetCode&#xff09; 题面: 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 …

力扣面试经典100题

进阶&#xff0c;其他解法 数组 88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; 1、按非递减顺序合并两个数组 从末尾开始&#xff0c;用while分没到两个数组头&#xff0c;到第一个数组头&#xff0c;到第二个数组头三种情况 class Solution { public:voi…

有趣的的rce漏洞复现分析

目录 无字母数字绕过正则表达式 解读代码 解题思路 异或 或 取反 无字母数字绕过正则表达式 首先我们依然是搭建环境&#xff08;环境依然是Ubuntu下部署&#xff0c;和之前的漏洞环境一样&#xff09; <?php error_reporting(0); highlight_file(__FILE__); $code…

ECharts数据可视化 数据集与事件 入门基础知识【2】

echarts一个基于 JavaScript 的开源可视化图表库。其有丰富的图表类型、强大的渲染引擎、专业多维度的数据分析、灵活配置的可视化设计。关于echarts的下载安装以及在项目中使用的基础知识我们前面已经回顾过了&#xff1a; ECharts 数据可视化 入门基本知识 下载安装常用的图表…