使用node-forge pki进行RSA加密

先放npm官方文档:www.npmjs.com/package/node-forge

在知道RSA加密的大致原理后,再往下看

使用例子

简单写个方法:

// 引入依赖
import forge from 'node-forge';
// base64转换(一般公钥私钥生成都是经过base64转换处理)
const encode64 = str => forge.util.encode64(str);

// 加密的方法,入参是:待加密文本,公钥,是否需要转化为Pem格式
const encrypted = (text: string, publicKey: string, needFormatPem: boolean) => {
  if (!publicKey) return text;
  let curPublicKey = publicKey;
  if (needFormatPem) {
    // 后端无法读取文件时返回的公钥是非Pem格式
    curPublicKey = `-----BEGIN PUBLIC KEY-----\n${publicKey}\n-----END PUBLIC KEY-----`;
  }
  // 生成公钥对象(公钥是Pem格式)
  const publicKeyObj = forge.pki.publicKeyFromPem(curPublicKey);
  // encrypt加密并转换为base64编码格式
  return encode64(publicKeyObj.encrypt(text));
};

export default encrypted;

内容梳理:

1.初始化公钥、私钥对象

需要根据公钥的格式使用对应的生成方法

const pki = forge.pki;

// pem格式
var publicKey = pki.publicKeyFromPem(pem);
// 可以将公钥对象转换回原格式
var pem = pki.publicKeyToPem(publicKey);
// ASN.1编码格式
var publicKey = pki.publicKeyFromAsn1(subjectPublicKeyInfo);
// 可以将公钥对象转换回原格式
var subjectPublicKeyInfo = pki.publicKeyToAsn1(publicKey);

同理,生成私钥需要对应的方法

// convert a PEM-formatted private key to a Forge private key
var privateKey = pki.privateKeyFromPem(pem);

// convert a Forge private key to PEM-format
var pem = pki.privateKeyToPem(privateKey);

// convert an ASN.1 PrivateKeyInfo or RSAPrivateKey to a Forge private key
var privateKey = pki.privateKeyFromAsn1(rsaPrivateKey);

// convert a Forge private key to an ASN.1 RSAPrivateKey
var rsaPrivateKey = pki.privateKeyToAsn1(privateKey);

2.使用公钥/私钥对象进行加密/解密

// 加密
var encrypted = publicKey.encrypt(bytes);

// 解密
var decrypted = privateKey.decrypt(encrypted);

加密解密的方法不仅只是一个入参,还有拓展功能,第二个参数用于指定RSA加密的标准

第二个参数为空时默认为 RSAES PKCS#1 v1.5标准

// 使用RSAES PKCS#1 v1.5标准加密
var encrypted = publicKey.encrypt(bytes, 'RSAES-PKCS1-V1_5');

// 使用RSAES PKCS#1 v1.5标准解密
var decrypted = privateKey.decrypt(encrypted, 'RSAES-PKCS1-V1_5');

// 使用RSAES-OAEP标准加密
var encrypted = publicKey.encrypt(bytes, 'RSA-OAEP');

// 使用RSAES-OAEP标准解密
var decrypted = privateKey.decrypt(encrypted, 'RSA-OAEP');

还有别的参数,可以去文档查看,链接见顶部。

你可能感兴趣的:(前端库的坑,javascript,前端,开发语言,非对称加密)