RSA分段解密 - Vue
前言
上一篇文章实现了 Java RSA的分段加解密 ,这里我们介绍在 Vue 项目中如何使用 RSA 分段解密,这里的加解密场景是:
- 后端私钥分段加密 - 前端公钥分段解密
前端如何使用公钥解密这里不做重复叙述,注重点是分段解密,有需要的参考之前的文章:RSA加密 - Vue
附上其他链接:
RSA加密 - Java
RSA分段加密 - Java
具体实现
src/libs/jsencrypt/lib/JSEncrypt.js
中添加新的解密方法decryptLong
/** * 分段解密
* @param string
* @returns {string|boolean}
*/
JSEncrypt.prototype.decryptLong = function (string) {
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;
}
};
- 添加
JSEncryptRSAassist.js
到src/libs/jsencrypt/lib/
目录下
/** * 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 {
hexToBytes,
bytesToHex,
base64ToArrayBuffer
}
- 公钥分段解密
RSADecryption.js
/** * 非对称加密 - RSA
* 后端私钥分段加密 - 前端公钥分段解密
*/
import { JSEncrypt } from '../libs/jsencrypt/lib/JSEncrypt'
import { base64ToArrayBuffer } from '../libs/jsencrypt/lib/JSEncryptRSAassist';
const PUBLICKEY = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaaI4MBywkCjIppZnraqN3pbrcZTq/t0+aMBo8K3pK9BDD6XkM6N2Yfcva7BSFbUWuAcI7piXak0UKn9CElDuhNzUSgQn4IXKxIt3Iva5cV83qYumj+0yRjjLT8Muu1Y1rgBZjY9oBwhVoV+Twg25+UJ+6Q6HM4xTwQQJDoyy4jwIDAQAB';
export const RSADECRY = {
/**
* 公钥分段解密
* @returns {string}
* @param val
*/
decryptLongByPublicKey: function (val = '') {
if(val === ''){
return '';
}
let encrypt = new JSEncrypt()
encrypt.setPublicKey(PUBLICKEY) // 设置公钥
// 后端使用 URLEncoder 进行编码,前端解密后使用 decodeURIComponent 解码解决中文乱码问题
let decryptStr = decodeURIComponent(encrypt.decryptLong(base64ToArrayBuffer(val)));
return decryptStr ? decryptStr : val;
}
}
- 前端公钥分段解密调用,这里的
encryptStr
是 RSA分段加密 - Java 中加密的密文
console.log("===================")let encryptStr = 'Guihe55ygtchHRFhGaK/T/y4grsPkC+Xa4DhHUw7MQeIDMc1SUZsV/VJ7D5yDbjIjfZbygTkWhWXLF4fJdgooAClzp5Lbaqn8FrMsBHj2oTFgJ3IFGBfiWvBgT21xKgbRHOBCIlHLHRucZDNW4XdgTN6iFRWpHP5xal47M3TAthsk3rlpPO7QBsv/dznmLfkcvo5gYepOCBzj7tKdxyEhu+1GUUqgIHIC1mGTiCkDoAXocfbpObEMWRhAzpHdpkR5nH00Kn7iVKKdgcKStyBqCW1wTx4lURrd32yGUqmkIWGpFi7lwhitL1d3oSzz2UZFke/HgHVIYBGoiVPizEc8g==';
let decryptLongByPublicKey = RSADECRY.decryptLongByPublicKey(encryptStr);
console.log("decryptLongByPublicKey: ", decryptLongByPublicKey);
- 结果如下:
源码
- GitHub: https://github.com/Maggieq8324/coisini-rsa
- Gitee:https://gitee.com/maggieq8324/coisini-rsa
以上是 RSA分段解密 - Vue 的全部内容, 来源链接: utcz.com/z/378853.html