RSA分段解密 - Vue

前言

上一篇文章实现了 Java RSA的分段加解密 ,这里我们介绍在 Vue 项目中如何使用 RSA 分段解密,这里的加解密场景是:

  • 后端私钥分段加密 - 前端公钥分段解密

前端如何使用公钥解密这里不做重复叙述,注重点是分段解密,有需要的参考之前的文章:RSA加密 - Vue



具体实现
  • 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.jssrc/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;
    }

}
console.log("===================")
let encryptStr = 'Guihe55ygtchHRFhGaK/T/y4grsPkC+Xa4DhHUw7MQeIDMc1SUZsV/VJ7D5yDbjIjfZbygTkWhWXLF4fJdgooAClzp5Lbaqn8FrMsBHj2oTFgJ3IFGBfiWvBgT21xKgbRHOBCIlHLHRucZDNW4XdgTN6iFRWpHP5xal47M3TAthsk3rlpPO7QBsv/dznmLfkcvo5gYepOCBzj7tKdxyEhu+1GUUqgIHIC1mGTiCkDoAXocfbpObEMWRhAzpHdpkR5nH00Kn7iVKKdgcKStyBqCW1wTx4lURrd32yGUqmkIWGpFi7lwhitL1d3oSzz2UZFke/HgHVIYBGoiVPizEc8g==';
let decryptLongByPublicKey = RSADECRY.decryptLongByPublicKey(encryptStr);
console.log("decryptLongByPublicKey: ", decryptLongByPublicKey);

  • 结果如下:

在这里插入图片描述


源码

- End -
- 个人学习笔记 -
- 仅供参考 -

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maggieq8324

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值