RSA加密算法
RSA是非对称加密算法,拥有一个公钥一个私钥,公钥用来加密,私钥用来解密,通常来说非对称加密比对称加密要耗时间。
AES对称加密、解密的速度要比RSA快很多。
其余也不过多赘述,想具体了解直接网上搜一下便知,直接进入正题。
后端加密使用RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING规范时,前端要想对应也需要使用对应的加密规范,这里我们需要引入一个插件:node-forge
引入node-forge插件
在项目里打开终端,输入引入插件命令:
npm install node-forge --save
引入如下图:
引入成功后会多出两个文件,如下:此时我们已经把插件引进来了
封装
将代码封装起来,后面好方便引用,找个文件夹新建js文件,我这里是在util里新建文件rsa_ecb.js
rsa_ecb.js文件内容如下:
let forge = require('../node_modules/node-forge/dist/forge.min.js')
//公钥
let publicKeyAll = ``;
//私钥
let privateKeyAll = ``;
//RSA设置公钥
export function rsa_setPublicKey(publicEncryKey) {
publicKeyAll = '-----BEGIN PUBLIC KEY-----\n' + publicEncryKey + '\n-----END PUBLIC KEY-----';
}
//RSA设置私钥
export function rsa_setPrivateKey(privateEncryKey) {
privateKeyAll = '-----BEGIN PRIVATE KEY-----\n' + privateEncryKey + '\n-----END PRIVATE KEY-----';
}
// 公钥加密密钥 的方法
export function rsa_encrypt(proclaimedText) {
var publicKey = forge.pki.publicKeyFromPem(publicKeyAll)
var bytes = forge.util.encodeUtf8(proclaimedText)
var rsaCipherText = forge.util.encode64(publicKey.encrypt(bytes, 'RSA-OAEP', {
md: forge.md.sha256.create(),
mgf1: {
md: forge.md.sha1.create()
}
}))
return rsaCipherText
}
// 私钥解密密钥 的方法
export function rsa_decrypt(rsaCipherText) {
var privateKey = forge.pki.privateKeyFromPem(privateKeyAll)
var rsaCipherTextAll = forge.util.binary.base64.decode(rsaCipherText);
var decrypted = privateKey.decrypt(rsaCipherTextAll, 'RSA-OAEP', {
md: forge.md.sha256.create(),
mgf1: {
md: forge.md.sha1.create()
}
})
console.log(decrypted)
var proclaimedText = forge.util.decodeUtf8(decrypted)
return proclaimedText
}
// 私钥解密密钥循环 的方法
export function rsa_Recycle(rsaCipherText) {
var privateKey = forge.pki.privateKeyFromPem(privateKeyAll)
var rsaCipherTextAll = forge.util.binary.base64.decode(rsaCipherText);
var decrypted = privateKey.decrypt(rsaCipherTextAll, 'RSA-OAEP', {
md: forge.md.sha256.create(),
mgf1: {
md: forge.md.sha1.create()
}
})
return decrypted
}
//拼接解密
export function rsa_getProclaimedText(rsaCipherText) {
var proclaimedText = forge.util.decodeUtf8(rsaCipherText)
return proclaimedText
}
然后在main.js中引入
//调用RSA方法
import {
rsa_setPublicKey,
rsa_setPrivateKey,
rsa_encrypt,
rsa_decrypt,
rsa_Recycle,
rsa_getProclaimedText
} from '@/util/rsa_ecb.js'
Vue.prototype.rsa_setPublicKey = rsa_setPublicKey
Vue.prototype.rsa_setPrivateKey = rsa_setPrivateKey
Vue.prototype.rsa_encrypt = rsa_encrypt
Vue.prototype.rsa_decrypt = rsa_decrypt
Vue.prototype.rsa_Recycle = rsa_Recycle
Vue.prototype.rsa_getProclaimedText = rsa_getProclaimedText
使用
最后在页面内使用RSA加密,注:这里的公钥和秘钥是我早就准备好的,可以用来测试加密代码是否成功
var key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvVrLJUKw9K6rEatuuSfRRc23bQgIP6LLCEpwI/sW5weMfgV6S6lLZwcvAuqWJW8fbLM6YuoQghcIvASVBwEw5f4KHN7TpIgShOR5Je7Ua22rLZz0OcEJ4ZBVqhS7TWT0GHpC2ZZrL2uB/3OEJVX4cUX+ElPIAKawpKG+UO6IMvc0C1AvG5NX+ATGeox5QIl7oF0dt0oa3aXWLR1GZfF1gKW6otuaj53rp1/DgzcWGxYXOPzEfCu/fu3eX3rva22JsCWZlObsmnzMtpd/C0S1YfgY0zldStCt3La1as+i5sPKpJA0uH1Ow163NBg05jvdWIuRHZfCPV4BjosgalhSXQIDAQAB'
this.rsa_setPublicKey(key);
var miyao = this.rsa_encrypt('Hello,中国是世界上第一古老大国');
console.log(miyao)
var decryptText='MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9WsslQrD0rqsRq265J9FFzbdtCAg/ossISnAj+xbnB4x+BXpLqUtnBy8C6pYlbx9sszpi6hCCFwi8BJUHATDl/goc3tOkiBKE5Hkl7tRrbastnPQ5wQnhkFWqFLtNZPQYekLZlmsva4H/c4QlVfhxRf4SU8gAprCkob5Q7ogy9zQLUC8bk1f4BMZ6jHlAiXugXR23ShrdpdYtHUZl8XWApbqi25qPneunX8ODNxYbFhc4/MR8K79+7d5feu9rbYmwJZmU5uyafMy2l38LRLVh+BjTOV1K0K3ctrVqz6Lmw8qkkDS4fU7DXrc0GDTmO91Yi5Edl8I9XgGOiyBqWFJdAgMBAAECggEACAg97cqybu6p2woGnFwQCIH9ceaRUwG40xU1RJF2Gz66uu3IjkUUKb6oQ9tnmxbnoljH9UIwiRQpDrCzEaT/SgJIs4jQOX58Kp72dKF46UWxqTGrOnfxz1usBpbyiwnpQNCO3WQAD/bjgM6JoHvRGhz59hUPutdXTuR9ijlUFbVMCTF0bRrxu+lUNykiiqpsdZSQWiBpZvwkfZ3zLdwbiqPS0LfUl644Vy8gijpQs04R9MleixvULvflXTVR0Ce6shyBpC/1NuIacoHYiui9QdFZq5cFmL9UMkVSW0W6KHWxKUefU281NJVhn8v18eN5QafRYmv4CDUZjGk/WeUkEQKBgQDs69hHy3cPgzG+8lXYuVkhLwoc6ic5x+Njl164clERfHB7VbvktpoWgip6YV2QMjAHbk/q8aLBDzYCC665Z769bLIy/gcfg1Ls4K379Gde1BYxo7cDGypWOYDOkFisb8Lsv52TiE90t0KTlR+zxIktcQSNbDBEBMrTnLvxfUkY9wKBgQDMmlvCnGp6qBxRhj9Pgq4KJJ07Htas1eTAgxoy/Oadl/kSrn3i1LREn+qJd8eSpxP9HIKNP+kye93FBRfP2NAOBx2ZW2xhRaNOSHDIRMorOOxDjb3qOvu2J6zRzZCdfgQIWUXR5Yo/XIoSM0SXbi7l8nqUPxe0Wf14NhBm/lOOSwKBgBiOpZ9jdpbUCW76XW2WYKew4YJ3vtMdZfNnuDi0GLUQSfRuwYgGaVhV66M9vl345cOPapc2rqEGO5ngrh6nozytLJdef0yD5y+IZmBMR/6rSxWgG5Ml2LCRS0md6qMM/o5dmi61nU7CxBLaDSwr/fAI2+jwwtv6BzAB+fUhAFenAoGBAMnUpxoGBH+0oCLHpGKBzb9RuQyd8jUS1pIVgd20XqYtSVVlbec53g4oFku/Lc78JBq2ag5+ckMLr4vv5zpwbWS5Hjiu1+3orRzHFwJn4Wrbvy0wgJyzzKQ25SMdfj/uFHpL3jUdEtBIMCeeDVa4KWlKViMxTefqMcDIzEtdLP2bAoGASTR5I8O7WBDAOb21fya+GqBfi9uHXC+pzDNWZ4jeRTRTwhGvvV5Qn+j2yNkUja5d1P++dZYJEVvfKTdMYsHALNUlkhi4HjjDbvr42lyzg4tJILebHlEHkY3R8yn1d7cB5nzibGS1E6OJOU12f1JFhGRvYpM0VSFT8C4bCmdqZnM='
this.rsa_setPrivateKey(decryptText)
var text = this.rsa_decrypt(miyao)
console.log(text);
使用后浏览器输出如下:
最后注意:公钥是用来对数据加密的,私钥是用来解密的,如果需要解密必须要有私钥