IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 在node环境实现RSA数据加密加签以及解密验签 -> 正文阅读

[网络协议]在node环境实现RSA数据加密加签以及解密验签

在node环境实现数据加密加签以及解密验签

最近上密码学的课要求代码实现RSA算法,语言任选,可以引用包,我使用的是js,下面是内容

首先我们得知道一个客户端与服务端之间数据传输加密的过程,大致如下:

1、A给B发送信息STR
2、A先用SHA256对信息STR计算,得到摘要Z
3、A用A的私钥对Z进行加密,得到签名S(只有发送者的私钥才能代表发送者,只能使用发送方的私钥加密才能达到不可抵赖性)
4、A用B的公钥对信息STR和签名S加密,得到传输数据M

传输M

1、B用B的私钥对M解密,得到信息STR和签名S
2、B用SHA256对信息STR计算,得到摘要Z1
3、B用A的公钥对签名S解密,得到摘要Z(A的公钥可以解签S,证明签名也是A亲自加密的)
4、对比Z和Z1,相等证明信息没有被篡改

原文链接:https://blog.csdn.net/MR_Wxm/article/details/106839255

准备需要的包

我们使用两个包 :
crypto 用于通过摘要算法获取数据摘要

npm i crypto 

node-rsa 用于生成公钥私钥对,以及 加密和解密

npm i node-rsa

代码部分,有详细注释

const crypto = require("crypto");
const NodeRSA = require("node-rsa");
const key_client = new NodeRSA({ b: 512 });//生成一个长度为512的密钥,最大好像可以设为2048,
//为了运行快点只用了512
const key_server = new NodeRSA({ b: 512 });//这是服务端公钥私钥对,上面是客户端的

// 1、A给B发送信息STR
let STR = "sheyuebuxianyang";

// 2、A先用SHA256对信息STR计算,得到摘要Z
const obj = crypto.createHash("sha256");
obj.update(STR);
let Z = obj.digest("base64");

// 3、A用A的私钥对Z进行加密,得到签名S(只有发送者的私钥才能代表发送者,只能使用发送方的私钥加密才能达到不可抵赖性)
 let S = key_client.encryptPrivate(Z, "base64", "base64");
//let S = key_client.sign(Z, "base64", "base64");

// 4、A用B的公钥对信息STR和签名S加密,得到传输数据M
let M1 = key_server.encrypt(STR, "base64", "utf8");
let M2 = key_server.encrypt(S, "base64", "base64");

/*----------------传输M1,M2-------------------- */


// 1、B用B的私钥对M解密,得到信息STR和签名S
let STR_get = key_server.decrypt(M1, "utf8");
let S_get = key_server.decrypt(M2, "base64"); //签名后的结果

// 2、B用SHA256对信息STR计算,得到摘要Z1
const obj2 = crypto.createHash("sha256");
obj2.update(STR_get);
let Z1 = obj2.digest("base64");

// 3、B用A的公钥对签名S解密,得到摘要Z(A的公钥可以解签S,证明签名也是A亲自加密的)
 let Z_get = key_client.decryptPublic(S_get, "base64");
//let flag = key_client.verify(Z1, S_get, "base64", "base64"); //第一个参数签名前的数据,第二个是签名后的数据,然后比较签名是否有效

// 4、对比Z和Z1,相等证明信息没有被篡改
console.log("检查签名是否一致:", Z_get === Z1);
c//onsole.log("检查签名是否一致:", flag);
console.log("得到的数据是 :", STR_get);

// 加密就是公钥加密 ,私钥解密
// 签名就是用私钥加签 ,然后公钥验签
// node rsa 可以直接使用其API进行验签判断

为什么要使用摘要算法

这个我也不清楚,希望大佬给我解惑,是为了达成什么目的呢

结尾

具体两个模块的另一些API,比如node-rsa的导出和引入密钥(使用已有的密钥) 等,可以看下npm上的项目官网,虽然是英语,但是多看两遍就差不多懂了。

刚刚学,如有错误请指正,不胜感激

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:11:52  更:2021-10-24 15:11:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:29:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码