RSA算法(非对称加密)
1. 安装依赖
npm install --save jsencrypt
2. 方法调用
import { JSEncrypt } from 'jsencrypt'
const rsaUtil = {
// RSA 位数,这里要跟后端对应
bits: 2048,
// 当前JSEncrypted对象
thisKeyPair: {},
// 生成密钥对(公钥和私钥)
genKeyPair: function (bits = rsaUtil.bits) {
let genKeyPair = {}
rsaUtil.thisKeyPair = new JSEncrypt({ default_key_size: bits })
// 获取私钥
genKeyPair.privateKey = rsaUtil.thisKeyPair.getPrivateKey().replace(/\n/g, '').replace('-----BEGIN RSA PRIVATE KEY-----', '').replace('-----END RSA PRIVATE KEY-----', '')
// 获取公钥
genKeyPair.publicKey = rsaUtil.thisKeyPair.getPublicKey().replace(/\n/g, '').replace('-----BEGIN PUBLIC KEY-----', '').replace('-----END PUBLIC KEY-----', '')
return genKeyPair
},
/**
* 加密方法
* @param plaintext 加密文本
* @param publicKey 公钥
* @returns {CipherParams|PromiseLike<ArrayBuffer>}
* @constructor
*/
Encrypt (plaintext, publicKey) {
let encrypt = new JSEncrypt()
encrypt.setPublicKey(publicKey)
return encrypt.encrypt(plaintext)
},
/**
* 解密方法
* @param ciphertext 解密文本
* @param privateKey 私钥
* @returns {WordArray|PromiseLike<ArrayBuffer>}
* @constructor
*/
Decrypt (ciphertext, privateKey) {
let decrypt = new JSEncrypt()
decrypt.setPrivateKey(privateKey)
return decrypt.decrypt(ciphertext)
}
}
export default rsaUtil
AES算法(对称加密)
1. 安装依赖
npm install --save crypto-js
2. 方法调用
import CryptoJS from 'crypto-js'
/**
* 加密方法
* @param plaintext 加密文本
* @param publicKey 公钥
* @returns {CipherParams|PromiseLike<ArrayBuffer>}
* @constructor
*/
export function Encrypt(plaintext, key) {
if (plaintext instanceof Object) {
// JSON.stringify
plaintext = JSON.stringify(plaintext)
}
let encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(plaintext), CryptoJS.enc.Utf8.parse(key), {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.toString()
}
/**
* 解密方法
* @param ciphertext 解密文本
* @param privateKey 私钥
* @returns {WordArray|PromiseLike<ArrayBuffer>}
* @constructor
*/
export function Decrypt(ciphertext, key) {
let decrypt = CryptoJS.AES.decrypt(ciphertext, CryptoJS.enc.Utf8.parse(key), {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
let decString = CryptoJS.enc.Utf8.stringify(decrypt).toString()
if (decString.charAt(0) === '{' || decString.charAt(0) === '[') {
// JSON.parse
decString = JSON.parse(decString)
}
return decString
}
/**
* 生成16位秘钥
* @returns {string}
* @constructor
*/
export function GetKey() {
/**
* @return {string}
*/
function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
}
return (S4() + S4() + S4() + S4())
}