在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 });
const key_server = new NodeRSA({ b: 512 });
let STR = "sheyuebuxianyang";
const obj = crypto.createHash("sha256");
obj.update(STR);
let Z = obj.digest("base64");
let S = key_client.encryptPrivate(Z, "base64", "base64");
let M1 = key_server.encrypt(STR, "base64", "utf8");
let M2 = key_server.encrypt(S, "base64", "base64");
let STR_get = key_server.decrypt(M1, "utf8");
let S_get = key_server.decrypt(M2, "base64");
const obj2 = crypto.createHash("sha256");
obj2.update(STR_get);
let Z1 = obj2.digest("base64");
let Z_get = key_client.decryptPublic(S_get, "base64");
console.log("检查签名是否一致:", Z_get === Z1);
c
console.log("得到的数据是 :", STR_get);
为什么要使用摘要算法
这个我也不清楚,希望大佬给我解惑,是为了达成什么目的呢
结尾
具体两个模块的另一些API,比如node-rsa的导出和引入密钥(使用已有的密钥) 等,可以看下npm上的项目官网,虽然是英语,但是多看两遍就差不多懂了。
刚刚学,如有错误请指正,不胜感激
|