Vue 前端RSA加密 (短文本、长文本)

RSA算法简介

● RSA加密算法是一种 非对称加密 算法,RSA算法相比别的算法思路非常清晰,但是想要破解的难度非常大。
● RSA算法基于一个非常简单的数论事实:两个素数相乘得到一个大数很容易,但是由一个大数分解为两个素数相乘却非常难。

1、什么是非对称加密算法

● 和 对称加密 算法使用同一个密钥进行加密解密的方式不同,非对称加密 算法是使用不同密钥进行加密和解密的算法,也称为公私钥加密。
非对称加密算法实现机密信息交换的基本过程:
● 甲方生成 一对密钥 并将其中的一把作为 公钥 向其它方公开,得到该公钥的乙方使用该密钥对机密信息进行加密后再发送给甲方,甲方再用自己保存的另一把 私钥 对加密后的信息进行解密。
图解:

2、RSA 加密原理

了解了非对称加密算法的原理,我们再来说说 RSA 加密算法的基本流程。
如图:

3、RSA加密算法过程详解

先来了解一下什么是 互质数:
两个或多个整数的公因数只有1的非0自然数,则两个非0自然数叫做互质数。例如 2 和 3,公因数只有1,所以为互质数。

1、找出质数

随机找两个质数 p 和 q ,p 与 q 越大,越安全。

2、计算公共模数

n = p * q
假设 p = 65 ,q = 71。计算他们的乘积 n = p * q = 4615 ,转化为二进制为 1001000000111,即该加密算法即为 13 位。位数越长,算法则越难被破解。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。

3、计算欧拉函数 φ(n)

φ(n) = φ(pq) = (p-1)(q-1)
φ(n) 表示:在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。
例:
在 1 到 8 之中,与 8 形成互质关系的是1、3、5、7,所以 φ(n) = 4。
计算公式(即欧拉函数)为:
前提:P 与 Q 均为质数
φ(n) = φ(P
Q)= (P-1)(Q-1)
设:
P = 65 ,Q = 71
φ(n) = 64 * 70 = 4480
即有4480 个数与 n(4615)互质。

4、计算公钥 e

1 < e < φ(n)
要求:
● e 的取值必须是整数
● e 和 φ(n) 必须是互质数

5、计算私钥 d

计算公式:
e * d % m = 1 其中(φ(n) = m)
即找一个整数 d,使得 (e * d ) % m = 1,等价于 e * d - 1 = y * m ( y 为整数)。
得到 d ,实质就是对下面二元一次方程求解:
e * x - m * y = 1 e,m为已知量,求 x,y。
这个方程可以用 扩展欧几里得算法 求解,此处就不详细介绍了,可以看这个了解下: 扩展欧几里得算法
得到:
● 公钥=(e,n)
● 私钥=(d,n)
对外,只暴露公钥。

6、加密生成密文

C = M e M^e Me mod n
C:密文 M:明文

7、解密生成明文

M = C d C^d Cd mod n
C:密文 M:明文
加密操作

在此还想多说两句 encryptlong 加密长文本,秘钥位数不同可能导致加密结果不同,有时可能加密解密失败 生成 false,具体还没做过多研究。本次实验采用 1024位 密钥对。
生成公钥、私钥地址 http://web.chacuo.net/netrsakeypair

安装依赖
npm i jsencrypt -S  --registry=https://registry.npm.taobao.org 
npm i encryptlong -S  --registry=https://registry.npm.taobao.org

import JSEncrypt from 'jsencrypt'
// encryptlong是基于jsencrypt扩展的长文本分段加解密功能。
import Encrypt from "encryptlong"
import { getRsaKeyAndSecret } from '@/api/common'

//先查缓存
var publicKey = localStorage.getItem('rsa-publicKey');
var privateKey = localStorage.getItem('rsa-privateKey');
if(publicKey == null || publicKey == undefined || publicKey == ''){
  // 从后端查询获取 publicKey、privateKey 当然也可在前端直接声明
  getRsaKeyAndSecret()
  .then(res=>{
    console.log('res-------',res.data)
    publicKey = res.data.publicKey;
    privateKey = res.data.privateKey;
  })
}

// 加密
export function init() {
  var publicKey = localStorage.getItem('rsa-publicKey');
  var privateKey = localStorage.getItem('rsa-privateKey');
  if(publicKey == null || publicKey == undefined || publicKey == ''){
    //获取
    getRsaKeyAndSecret()
    .then(res=>{
      publicKey = res.data.publicKey;
      privateKey = res.data.privateKey;
      localStorage.setItem('rsa-publicKey',publicKey);
      localStorage.setItem('rsa-privateKey',privateKey);
    })
  }
}

// 加密
export function encrypt(txt) {
  if(!localStorage.getItem('rsa-publicKey')){
    init();
  }
  const encryptor = new JSEncrypt()
  encryptor.setPublicKey(publicKey) // 设置公钥
  return encryptor.encrypt(txt) // 对数据进行加密
}

// 解密
export function decrypt(txt) {
  if(!localStorage.getItem('rsa-privateKey')){
    init();
  }
  const encryptor = new JSEncrypt()
  encryptor.setPrivateKey(privateKey) // 设置私钥
  return encryptor.decrypt(txt) // 对数据进行解密
}


// 加密
export function encryptLong(txt) {
  if(!localStorage.getItem('rsa-publicKey')){
    init();
  }
  const encryptor = new Encrypt()
  encryptor.setPublicKey(publicKey) // 设置公钥
  return encryptor.encryptLong(txt) // 对需要加密的数据进行加密
}

// 解密
export function decryptLong(txt) {
  if(!localStorage.getItem('rsa-privateKey')){
    init();
  }
  const encryptor = new Encrypt()
  encryptor.setPrivateKey(privateKey)
  return encryptor.decryptLong(txt)
}

测试 Cookie加密,利用js-cookie

Cookies.set('test', json串 , { expires: 1, domain: ['localhost', '127.0.0.1'].includes(document.domain) ? document.domain :".test.com" } )


//加密结果如下
JHa5HPkvcTOO10IzJxBt912WRk4EbEfgrja1fxjIsjvXBbUKY+XGEpIMWQvulkL+F5pYT3j9mXyWwMVbkEepz65tKttlGMNRCJD4YB6mFb5OLytRkYa7FaDA4bXSnkgwTHD+yg7TYcelaVQkImxb354d/FOmvF6mI9VzQtOD2icB7K5I4DGPZyZJYc9q6Zrje86NAXwOzxoU3Svio+wQUo5HAcdLOqtwc4seQE87Lq1Oa0G4q4AeALuEDSIGiPDxYzGezTwaZsi9t00w7vmll3yzXeOzU8uaXxMJQy0rXAFgjkGacxwUDN3KrEY/K4lNBotUeGdiofSs6ILj997kaFuuLWCxY3gC9jMQQYLBv7QqixCCjuwDQK+4+zBsb03V2vdRwP1rM/ZIrfXTbi1mrHuLqF6Jr7iEYCCL8OaN+QvHAoAVJYwpM25fUPlgDJaKh73gUsMOAheu/UoEdmcqtH5BK48x7aTFpDoK2e4usA5o5A8hJa7FhJ/fx11i/cgja6LYDsaaHi5zPt3ZYluXg8l4omHaTNWINH2Phpg/ooLwKW/r3jHEGSVJaUS4c/1MPwGn/nY/0JW+m29/u4KpUiRzOjihW6LmUsz1cma1+WbcSkkBaopsrO013y7WQrQqgPDjm8GBXCJvwx/MgCFFEZytLgy67V0JOUYOvF3En5CqjHkqHSQtH4yhpN8KDTueKqscTRDUXeSkRdqE0QtGTbFfx/eEzxsLdgNqheypEL61oeVRAl/VQD0lN6vjlXldPYMDXF6Etq6ZRg5qFxHnYaF6EKUCbi+u/WB7/baaTGtoUnnmxhU3+cfeHwS0j57k7gSDQfmbcQdMVo3pI3tTyUjDAXwoSapjRZ6s831xjxXaQi1rM0I1AlrA/ZYroLLKTwj4YynkJO3W8zCGLROJuDhvIOXZhVrySOrd+PQHbVnfsbO89pjFgiVg7oEtNGAawnYoBA/NVFFo6f2EzCFHRL5MrVFqAFvpmjugsSehy3O0HwoXt2QYk5jA5V8XyyqjlkLUfFNpGKabbjCEVt2o9kkPxW6mWPXSIza8ZUy78mmzPlKpitybTmien1zPkZrdBeYlJoRImqExpVcCywbBz+2LT8FCnkvggtwTn5Kq09NQ25bS3wiJleVP4yffOIMuNg2t1xPDienQ3rntzXMCVdDNYTdRfvdb67B559psJhpsghR+MRveAfmHxYphGeZirrlH8BSBID0NC9QwtG3HTT+R1mdarMXW5UnAaWLaSP4dKPzIVhxPwB3FUc3aYliiBAL4O8Q09Gp4lHVdkLcbMp4jZ/ph5NjN4RZ744bpL7zDxt2QNXQblIaGq83ArFfHrRIJMJMiEBZzWFXEnZJh8H0ekp7hS27Ik+Cl+4M+ZUcV4eWQJBZmNS/LhixRb8rL2bZHP8CPTpFfpQxUhzVKsTmoiZl1IKbEWVw0smbYBTqSaZIbm+c5Sx8yZ2Tr65Z3MVInKKa3Vo2AlswG2C4VP+m3+ekzinqgfuFnAO2qL5rFufoPJgJ0XGkcy8wWCqDosZ5R4YMWcDJ8DHzIhh/zyWDWV2cuwu8NYqPmvhZjwMbiQ4r4laOjb8u/zDvc+HmCHYH13CQ9G5CUJ1kEh6vwMwzsOAeLZYDcA5kgBe8J2VUALied2ndy1ujXWIT9uKJUfWhehi7pFYu0H7PnRc3T+flZkaM3zoisrmQIObnR98s=
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中安装RSA加密可以按照以下步骤进行操作: 1. 首先,使用npm安装jsencrypt库,可以在终端中运行以下命令进行安装: ``` npm install jsencrypt ``` 2. 在Vue项目的main.js文件中引入jsencrypt库,可以在文件的顶部添加以下代码: ```javascript import JSEncrypt from "jsencrypt"; ``` 3. 将JSEncrypt对象配置为Vue的全局变量,可以在main.js文件中添加以下代码: ```javascript Vue.prototype.$jsEncrypt = JSEncrypt; ``` 4. 在需要使用RSA加密的地方,可以通过调用后台接口获取公钥,并使用JSEncrypt对象对密码进行加密。以下是一个示例代码: ```javascript // 获取公钥的方法 export function getPubKey() { // 调用后台接口获取公钥的逻辑 } // 在需要加密的地方调用getPubKey方法获取公钥,并使用JSEncrypt对象对密码进行加密 getPubKey().then(publicKey => { let encryptor = new JSEncrypt(); encryptor.setPublicKey(publicKey); let rsaPassWord = encryptor.encrypt(password); // 对加密后的密码进行后续操作 }); ``` 请注意,以上代码仅为示例,具体的实现方式可能会根据你的项目需求而有所不同。你需要根据实际情况修改代码中的接口地址和逻辑。 #### 引用[.reference_title] - *1* *3* [Vue项目中rsa加密](https://blog.csdn.net/weixin_62946736/article/details/122886177)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vuersa加密](https://blog.csdn.net/weixin_44271874/article/details/123586752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值