【node-forge】加解密(RSA),代替node-rsa

简介

基于node,前后端都可以用

下载

npm install node-forge

npm

node-forge 点我进入

https://www.npmjs.com/package/node-forge

按需加载(适合前端)

rsa.js

/**
 * rsa加密、解密
 * @param {String} txt 加、解密的文本
 * @param {String} key 公、私钥
 * @param {Boolean} [encTxt=true] 默认true,true加密  、 false解密
 * @returns {Promise.<String>} 
 */
export const forge = async (txt, key, encTxt = true) => {
    const { pki, util } = await import('node-forge'),
        { publicKeyFromPem, privateKeyFromPem } = pki,
        { createBuffer, encode64, decode64 } = util;

    // 加密
    if (encTxt) {
        const byts = publicKeyFromPem(key),
            buff = createBuffer(txt, 'utf8'),
            bytsText = buff.getBytes(),
            encrypted = byts.encrypt(bytsText, 'RSA-OAEP');
        return encode64(encrypted)
    }

    // 解密
    const jieMa = decode64(txt),
        priObj = privateKeyFromPem(key);
    return priObj.decrypt(jieMa, 'RSA-OAEP')
};


/**
 * 生成rsa公、私钥
 * @returns {Promise.<{publicKey:String,privateKey:String}>} 返回公、私钥
 */
export const createForageKey = async () => {
    const { pki } = await import('node-forge');
    const { rsa, publicKeyToRSAPublicKeyPem, privateKeyToPem } = pki
    const { publicKey, privateKey } = rsa.generateKeyPair({ bits: 512, workers: 2 })
    return {
        publicKey: publicKeyToRSAPublicKeyPem(publicKey, 72),
        privateKey: privateKeyToPem(privateKey, 72)
    }
}

使用按需加载

import {forge,createForageKey } from './rsa.js'

const {privateKey,publicKey}= await createForageKey();

const bar = '帅的一比'

//加密
const dec = forge(bar, publicKey)
console.log(dec)//MNfKfb6J/L/kBfjqgYaW5XsUfeKWGW7nETgRUbPidQXTtPAgg4EXhF7EAFRM/lK1qcohXHjPRc3vT6tCnidaFw==

//解密
const enc = nodeForge(dec, privateKey, false)
console.log(enc)//输出↓
// å¸

后端用

server/utils/forge.js

import forge from 'node-forge'

const pb = '-----BEGIN RSA PUBLIC KEY-----\r\n' +
    'MEgCQQDMsiKVNVODGST6SWw23H8mUEQva6pLRKZfN6+LwIMokDPt9dwfYu7yopcNKEcrP4xj\r\n' +
    'vBV4BJvhW/Vi7876Nox/AgMBAAE=\r\n' +
    '-----END RSA PUBLIC KEY-----\r\n';

const pr = '-----BEGIN RSA PRIVATE KEY-----\r\n' +
    'MIIBOwIBAAJBAMyyIpU1U4MZJPpJbDbcfyZQRC9rqktEpl83r4vAgyiQM+313B9i7vKilw0o\r\n' +
    'Rys/jGO8FXgEm+Fb9WLvzvo2jH8CAwEAAQJAYC5LhaSa6vzDnT8ms9iDfjM09rs2N0u4iQEX\r\n' +
    'YSlB96qDOdnXLueHV3bSZ3MaqxXqLbE9otEs/CKzt81EYHcGYQIhAOb6wO70WpXijEBmlsLb\r\n' +
    'HU4ixDoLJg/kCm6DW5r2EXZpAiEA4t6DrZktkqYw5Gxt4pFWqAkbix5EwJXSBL/QW1ciHqcC\r\n' +
    'ICksFWwCvortIRbxsnn1WNnutI+sIRLAEWP1okSTDDXRAiEAgLWW5R07MrDgmic97EVicXDB\r\n' +
    'VJr2jIAzJ4ifL8LuU48CIQDZMy6/0QZbv6OSlBinKRtlXYpBZpNPlZCP1nM4KY9BqQ==\r\n' +
    '-----END RSA PRIVATE KEY-----\r\n';

/**
* rsa加密、解密
* @param {String} txt 加、解密的文本
* @param {String} key 公、私钥
* @param {Boolean} [encTxt=true] 默认true,true加密  、 false解密
* @returns {Promise.<String>} 
*/
const nodeForge = (txt, key, encTxt = true) => {
    const { pki, util } = forge,
        { publicKeyFromPem, privateKeyFromPem } = pki,
        { createBuffer, encode64, decode64 } = util;

    if (encTxt) {
        // 加密
        const byts = publicKeyFromPem(key),
            buff = createBuffer(txt, 'utf8'),
            bytsText = buff.getBytes(),
            encrypted = byts.encrypt(bytsText, 'RSA-OAEP');
        return encode64(encrypted);
    }


    // 解密
    const priObj = privateKeyFromPem(pr);
    const toBase = decode64(txt)
    return priObj.decrypt(toBase, 'RSA-OAEP')
}

const bar = '帅的一比'
const dec = nodeForge(bar, pb)
console.log(dec)//MNfKfb6J/L/kBfjqgYaW5XsUfeKWGW7nETgRUbPidQXTtPAgg4EXhF7EAFRM/lK1qcohXHjPRc3vT6tCnidaFw==

const enc = nodeForge(dec, pr, false)

console.log(enc)//输出↓
// å¸
// ç
//  䏿¯

// ↑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值