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=
GitHub 加速计划 / vu / vue
207.55 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐