附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) } }