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

devtools/2024/11/14 22:39:22/

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/devtools/94178.html

相关文章

java实现七牛云内容审核功能,文本、图片和视频的内容审核(鉴黄、鉴暴恐、敏感人物)

目录 1、七牛云内容审核介绍 2、查看内容审核官方文档 2.1、文本内容审核 2.1.1、文本内容审核的请求示例 2.1.2、文本内容审核的返回示例 2.2、图片内容审核 2.2.1、请求参数 2.2.2、返回参数 2.3、视频内容审核 3、代码实现 3.1、前期代码准备 3.2、文本内容审核…

智能合约语言对比:Solidity | Vyper | Move | Rust

当你想要进入Web3领域做开发&#xff0c;可能会想知道应该先学哪门编程语言&#xff0c;或者是哪门语言最适合你。这里有四种现在比较热门的语言&#xff1a;Solidity、Vyper、Move和Rust。下面我会用代码示例解释一下区别&#xff0c;帮你找到学习的方向。 Solidity&#xff1…

Node.js中判断是文件还是文件夹的多种方法

在Node.js中&#xff0c;我们经常需要判断一个路径是文件还是文件夹。Node.js提供了多种方法来实现这一功能&#xff0c;本文将详细介绍这些方法&#xff0c;并给出相应的示例代码。 一、使用fs.Stats对象 在Node.js中&#xff0c;fs模块提供了fs.stat()或fs.statSync()方法&…

【日记】总感觉今天很感性呢(2424 字)

正文 高温橙色预警。我并没有受到影响&#xff0c;因为今天上班…… 今天又和柜面主管吵了起来。两个人观念上的不同。今天装了三本档案&#xff0c;她嫌弃我装得不好&#xff0c;说不好看。当时她反问我信贷档案也是这样装的吗&#xff1f;装得这么随便。当时我跟她说&#xf…

停止项目大小调整,开始搜索层自动缩放!

作者&#xff1a;来自 Elastic Matteo Piergiovanni&#xff0c;John Verwolf 我们新的 serverless 产品的一个关键方面是允许用户部署和使用 Elastic&#xff0c;而无需管理底层项目节点。为了实现这一点&#xff0c;我们开发了搜索层自动扩展&#xff0c;这是一种根据我们将在…

数字取证:解密信息安全的科技利剑

标题&#xff1a;数字取证&#xff1a;解密信息安全的科技利剑 在信息时代&#xff0c;数据成为了一种强大的证据形式&#xff0c;数字取证作为一门科学&#xff0c;专注于电子证据的收集、分析和报告。它不仅在法律领域有着举足轻重的作用&#xff0c;更在企业安全、网络入侵…

JAVA中BigInteger的基础用法

BigInteger 概述 BigInteger 是 Java 中的一个类&#xff0c;位于 java.math 包下。它提供了任意精度的整数运算能力&#xff0c;即它可以处理那些超出 int 和 long 类型表示范围的整数。BigInteger 是不可变的&#xff0c;即一旦一个 BigInteger 对象被创建&#xff0c;它的值…

leetcode300. 最长递增子序列,动态规划附状态转移方程

leetcode300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2…