前言
上一篇文章實現了 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 = 'LfQFzBVRelSjnohshZlMvTUPsfdaD9t7FEreaAKop5Pf4X33exYMykBS12XCgnMP+GtO08ir5qmsnwVU5iP/lHMlTBSkWiGX16zFV/pmwQF8OY62HrhzXZn0gSu1rIgPKIowQ2W254uYPHDIIxvWJB/dNmeeqrgc5JxDdLVEuZU=';
let decryptLongByPublicKey = RSADECRY.decryptLongByPublicKey(encryptStr);
console.log("decryptLongByPublicKey: ", decryptLongByPublicKey);
- 結果如下:
源碼
