在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上的项目官网,虽然是英语,但是多看两遍就差不多懂了。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值