在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上的项目官网,虽然是英语,但是多看两遍就差不多懂了。
刚刚学,如有错误请指正,不胜感激