RSA2048签名和加密+OAEP填充方式(前端)

附RSA在线加密/在线解密工具地址:https://the-x.cn/zh-cn/cryptography/rsa.aspx

安装 jsrsasign 插件: npm install jsrsasign jsrsasign-util

import jsrsasign from 'jsrsasign'

// RSA 位数,这里要跟后端对应
// var bits = 1024;
var bits = 2048
// var rsaKeypair = jsrsasign.KEYUTIL.generateKeypair('RSA', bits)
var rsaKeypair = null
var keyPairs = {}

export function generateKeypair() { // 生成密钥对,生成密钥对需要很长时间
  var privateKey = JSON.parse(sessionStorage.getItem('privateKey'))
  var publicKey = JSON.parse(sessionStorage.getItem('publicKey'))
  if (privateKey == null) {
    rsaKeypair = jsrsasign.KEYUTIL.generateKeypair('RSA', bits)
    privateKey = jsrsasign.KEYUTIL.getPEM(rsaKeypair.prvKeyObj, 'PKCS1PRV')
    publicKey = jsrsasign.KEYUTIL.getPEM(rsaKeypair.pubKeyObj)
    sessionStorage.setItem('privateKey', JSON.stringify(privateKey))
    sessionStorage.setItem('publicKey', JSON.stringify(publicKey))
  }
  keyPairs.privateKey = privateKey
  keyPairs.publicKey = publicKey
  keyPairs.publicKeyObj = jsrsasign.KEYUTIL.getKey(publicKey)
  keyPairs.privateKeyObj = jsrsasign.KEYUTIL.getKey(privateKey)
  // 获取公钥对象
}

// 生成密钥对(公钥和私钥)
export function genKeyPairs() {
  if (!keyPairs.privateKey) {
    generateKeypair()
  }
  return keyPairs
}

// 生成密钥对(公钥和私钥)
// export function genKeyPairs() {
//   var genKeyPairs = {}
//   // 获取私钥
//   genKeyPairs.privateKey = jsrsasign.KEYUTIL.getPEM(rsaKeypair.prvKeyObj)
//   // 获取公钥
//   genKeyPairs.publicKey = jsrsasign.KEYUTIL.getPEM(rsaKeypair.pubKeyObj)
//
//   // 获取公钥对象
//   genKeyPairs.publicKeyObj = jsrsasign.KEYUTIL.getKey(rsaKeypair.pubKeyObj)
//   // 获取私钥对象
//   genKeyPairs.privateKeyObj = jsrsasign.KEYUTIL.getKey(rsaKeypair.prvKeyObj)
//
//   return genKeyPairs
// }

// 加密
export function encrypt(encryptData, pubkey) {
  // 转换成pem格式的秘钥, 生成秘钥实例 (RSAKey)
  const publicPemKey = '-----BEGIN PUBLIC KEY-----\n' + pubkey + '\n-----END PUBLIC KEY-----'
  var pub = jsrsasign.KEYUTIL.getKey(publicPemKey)
  var enc = jsrsasign.KJUR.crypto.Cipher.encrypt(encryptData, pub)
  return enc
  // var enc = jsrsasign.KJUR.crypto.Cipher.encrypt(encryptData, pub, 'RSAOAEP256')  //此为添加OAEP填充方式的加密方法
  // return jsrsasign.hextob64(enc)
}

// 解密
export function decrypt(decryptData) {
  var prv = jsrsasign.KEYUTIL.getKey(rsaKeypair.prvKeyObj)
  var dec = jsrsasign.KJUR.crypto.Cipher.decrypt(jsrsasign.b64utohex(decryptData), prv, 'RSAOAEP256')
  // var dec = jsrsasign.KJUR.crypto.Cipher.decrypt(jsrsasign.b64utohex(decryptData), prv)
  console.log('jsrsasign decrypt: ' + dec)
  console.log('jsrsasign b64utohex: ' + jsrsasign.b64utohex(dec))
  return dec
}

// 私钥加签
export function rsasignature(signData, prvKeyObj) {
  // console.log("jsutil:"+jsrsasignUtil.readFileHexByBin("./pri.key"));
  // 创建秘钥实例
  // var key = jsrsasign.KEYUTIL.getKey(prvKeyObj);
  // 指定签名算法 sha1对原文哈希
  const signature = new jsrsasign.KJUR.crypto.Signature({ alg: 'SHA256withRSA' })
  // 传入秘钥实例, 初始化

  signature.init(prvKeyObj)
  //  signature.init(key);
  // 传入待签明文
  signature.updateString(signData)
  // 签名, 得到16进制字符结果
  const signResult = signature.sign()
  // 签名hex转base64
  const signBase64 = jsrsasign.hextob64(signResult)
  // console.log(signBase64);
  return signBase64
}

// 验签
export function verify(signData, data, pubKeyObj) {
  // signData: 加签后的签文
  // data: 原始数据
  try {
    // 验签
    const signatureVf = new jsrsasign.KJUR.crypto.Signature({ alg: 'SHA256withRSA', prvkeypem: pubKeyObj })
    signatureVf.updateString(data)
    const result = signatureVf.verify(jsrsasign.b64tohex(signData))
    console.log('jsrsasign verify: ' + result)
    return result
  } catch (e) {
    console.error(e)
  }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值