简介
基于node,前后端都可以用
下载
npm install node-forge
npm
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)//输出↓
// å¸
// ç
// 䏿¯
// ↑