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.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 = 'LfQFzBVRelSjnohshZlMvTUPsfdaD9t7FEreaAKop5Pf4X33exYMykBS12XCgnMP+GtO08ir5qmsnwVU5iP/lHMlTBSkWiGX16zFV/pmwQF8OY62HrhzXZn0gSu1rIgPKIowQ2W254uYPHDIIxvWJB/dNmeeqrgc5JxDdLVEuZU=';
let decryptLongByPublicKey = RSADECRY.decryptLongByPublicKey(encryptStr);
console.log("decryptLongByPublicKey: ", decryptLongByPublicKey);

  • 結果如下:
    在這里插入圖片描述

源碼

- End -
一個努力中的公眾號
關注一下吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM