# rsa-test **Repository Path**: is666a/rsa-test ## Basic Information - **Project Name**: rsa-test - **Description**: RSA 是一种非对称加密算法,用原生 HTML+JavaScript+NodeJS 演示加密解密过程。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-09-28 - **Last Updated**: 2023-09-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [TOC] `™author`:[带只拖鞋去流浪](https://www.zhihu.com/people/is666a) `date`:`2021-09-28 8:35:00` # `RSA` 加密算法 1. `RSA` 加密算法:一种非对称加密算法。 2. `RSA` 公开密钥密码体制 是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。 3. 在公开密钥密码体制中,加密密钥(即公开密钥)`PK` 是公开信息,而解密密钥(即秘密密钥)`SK` 是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥 `SK` 是由公开密钥 `PK` 决定的,但却不能根据 `PK` 计算出 `SK`。 # [生成 RSA 密钥对](https://github.com/travist/jsencrypt) ## 生成私钥 ```bash openssl genrsa -out rsa_1024_priv.pem 1024 ``` ![](./images/生成RSA私钥.png) ## 生成公钥 根据 `Private Key` 生成 `Public Key` ```bash openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem ``` ![](./images/生成RSA公钥.png) # 前端使用 [jsencrypt](https://github.com/travist/jsencrypt) 加密 使用 `Public Key` 加密 ## 安装 ``` yarn add jsencrypt ``` ## 使用 ```javascript // 如果你使用的不是原生 HTML+JavaScript import JSEncrypt from 'jsencrypt'; const encrypt = new JSEncrypt(); // 你的 Pubic Key const key = ` -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD3EO65hE1Q5im0z4xIl0ViPEnU GmvUTM63/2Um8HlpYJlyym/xH+7RhvjiuzDxxFcdAeZrqe6hOQRswS4NK46vgX26 EiNSndrtrmFOH5TDRfbUtEpvAb0NCDIHDvmvcfZd0m/gtZ37Zk0WMIExki5RO2XD i+nQmn6oUnzjyXigYQIDAQAB -----END PUBLIC KEY----- `; encrypt.setPublicKey(key); const pwd = encrypt.encrypt(loginForm['pwd'].value); ``` # 后端使用 [node-rsa](https://www.npmjs.com/package/node-rsa) 解密 使用 `Private Key` 解密 ## 安装 ```bash yarn add node-rsa ``` ## 使用 ```javascript const NodeRSA = require('node-rsa'); // 加载你的 Private Key const privateKey = fs.readFileSync(path.resolve(__dirname,'../rsa/rsa_1024_priv.pem')); const nodersa = new NodeRSA(privateKey); // 因为 jsencrypt 自身使用的是 pkcs1 加密方案, nodejs 需要修改成 pkcs1 nodersa.setOptions({encryptionScheme: 'pkcs1'}); // 解密 pwd = nodersa.decrypt(pwd, 'utf-8'); ``` # 关于 `NodeJS` 服务端导入 `JavaSript|CSS` 首先,加载静态资源文件用的都是 `GET` 请求。因此我下面这段代码在 `GET` 请求中进行判断返回。 ```javascript // 加载静态文件 if (/\.(js|css)$/.test(url)) { res.end(fs.readFileSync(path.resolve(__dirname, `../public/${url}`), { encoding: 'utf-8' })); return; } ``` # 关于 `NodeJS` 获取 `POST` 请求数据 ```javascript // 接收 POST 的数据 let postData = ''; req.on('data', chunk => { postData += chunk; }); // 接收完成之后 req.on('end', () => { const data = JSON.parse(postData); // ... 在这里开始你的表演 }); ```