nodejs之JSEncrypt模块,浏览器端非对称加密RSA算法库

本文介绍了JSEncrypt,一个在浏览器中实现RSA加密和解密的JavaScript库,涉及密钥对生成、加密解密过程、安装方法以及相关函数的详细说明。

夸克资源分享:
表情包:https://pan.quark.cn/s/5b9ddeb237fe
工具箱:https://pan.quark.cn/s/aa2d6a730482,图吧、美蛋、路遥、入梦等
Fiddler Everywhere抓包:https://pan.quark.cn/s/6b1e2fbae019
Adobe:https://pan.quark.cn/s/13e39cfeaadb,先看安装教程
JetBranis开发者工具:https://pan.quark.cn/s/16e94dcff1f7,先看安装教程下的jetbra教程
逆向工具:https://pan.quark.cn/s/50e93c8ca54c
前端项目搭建集锦:https://blog.youkuaiyun.com/randy521520/article/details/146998467

一、简介

JSEncrypt 是一个用于在浏览器中进行RSA加密和解密的 JavaScript 库。它提供了一种简单的方式来生成 RSA 密钥对、加密数据并使用私钥解密数据。
以下是 JSEncrypt 模块的一些主要功能和用法:

  1. 生成密钥对:使用 JSEncrypt,你可以轻松地生成 RSA 密钥对。你可以通过调用 new JSEncrypt() 创建一个 JSEncrypt 实例,然后使用 getKey() 方法生成密钥对。生成的密钥对包括公钥和私钥。
  2. 加密数据:一旦你有了密钥对,你可以使用公钥对数据进行加密。使用 JSEncrypt 的 setPublicKey() 方法设置公钥,然后使用 encrypt() 方法对数据进行加密。加密后的数据可以通过网络传输或存储在数据库中。
  3. 解密数据:使用私钥可以对加密的数据进行解密。使用 JSEncrypt 的 setPrivateKey() 方法设置私钥,然后使用 decrypt() 方法对加密的数据进行解密。解密后的数据将恢复为原始的明文数据。
  4. 密钥格式:JSEncrypt 支持多种密钥格式,包括 PEM 和 DER。你可以使用 getKey() 方法获取生成的密钥对,并使用 getPrivateKey() 和 getPublicKey() 方法获取私钥和公钥的字符串表示。
  5. 密钥长度和算法:JSEncrypt 支持不同长度的密钥,包括 1024 位、2048 位和 4096 位。你可以根据需要选择适当的密钥长度。JSEncrypt 使用 RSA 算法进行加密和解密。
  6. 兼容性:JSEncrypt 在大多数现代浏览器中都能正常工作,包括 Chrome、Firefox、Safari 和 Edge。它不需要任何其他依赖项,只需引入 JSEncrypt 库即可开始使用。
二、安装
npm install jsencrypt
三、使用方法
window = {}
const JSEncrypt = require('jsencrypt');
const { generateKeyPairSync } = require('crypto');

// 生成 RSA 密钥对
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
  modulusLength: 2048, // 密钥长度
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem'
  }
});

console.log('公钥:', publicKey);
console.log('私钥:', privateKey);

// 使用生成的密钥对进行加密和解密操作
const encryptor = new JSEncrypt();
encryptor.setPublicKey(publicKey);

const plaintext = 'Hello, World!';
const encrypted = encryptor.encrypt(plaintext);
console.log('加密结果:', encrypted);

const decryptor = new JSEncrypt();
decryptor.setPrivateKey(privateKey);

const decrypted = decryptor.decrypt(encrypted);
console.log('解密结果:', decrypted);

四、相关函数
  1. rsaEncrypt = new JSEncrypt():创建RSA加密对象
  2. rsaEncrypt.setPrivateKey(privkey):设置私钥。
  3. rsaEncrypt.setPublicKey(pubkey):设置公钥。
  4. rsaEncrypt.sign(str, digestMethod, digestName):使用私钥对字符串 str 进行签名,并返回签名结果。
  • str:加密字符串
  • digestMethod:是签名算法的名称,例如 “sha256”,
  • digestName:是摘要算法的名称,例如 “RSA-SHA256”。
  1. rsaEncrypt.verify(str, signature, digestMethod):使用公钥验证字符串 str 的签名是否与给定的 signature 匹配。digestMethod 是签名算法的名称。
  • str:加密字符串
  • digestMethod:是签名算法的名称,例如 “sha256”,
  • digestName:是摘要算法的名称,例如 “RSA-SHA256”。
  1. rsaEncrypt.decrypt(str):使用私钥解密字符串 str,并返回解密后的结果。
  2. rsaEncrypt.encrypt(str):使用公钥对字符串 str 进行加密,并返回加密后的结果。
  3. rsaEncrypt.setKey(key):设置密钥对(公钥和私钥),key 是包含公钥和私钥的对象。
  4. rsaEncrypt.getKey(cb):异步获取密钥对(公钥和私钥),并通过回调函数 cb 返回结果。
  5. rsaEncrypt.getPrivateKey():获取私钥。
  6. rsaEncrypt.getPrivateKeyB64():获取私钥的 Base64 编码字符串。
  7. rsaEncrypt.getPublicKey():获取公钥。
  8. rsaEncrypt.getPublicKeyB64():获取公钥的 Base64 编码字符串。
### Node.js 中对称加密与非对称加密实现 #### 非对称加密Node.js中,`crypto`模块提供了用于执行非对称加密操作的功能。非对称加密涉及一对密钥——公钥和私钥。通常情况下,消息使用接收者的公钥进行加密,并且只有拥有对应私钥的人才能解密该消息。 ##### 使用 `crypto.publicEncrypt()` 和 `crypto.privateDecrypt()` 为了展示如何利用这些函数来完成非对称加密过程: ```javascript const crypto = require('crypto'); // 加载密钥材料 (这里假设已经有了PEM编码的公钥和私钥字符串) let publicKey = '...'; // PEM encoded public key string let privateKey = '...'; // PEM encoded private key string function encrypt(data) { const buffer = Buffer.from(data); let encrypted = crypto.publicEncrypt({ key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING, oaepHash: "sha256" }, buffer); return encrypted.toString('base64'); // 将Buffer转换为Base64编码字符串以便于传输或存储 } function decrypt(encryptedData) { const buffer = Buffer.from(encryptedData, 'base64'); let decrypted = crypto.privateDecrypt({ key: privateKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING, oaepHash: "sha256" }, buffer); return decrypted.toString(); // 返回原始数据作为字符串 } ``` 上述代码片段展示了如何创建两个辅助函数:一个是用来加密给定的数据串,另一个是用来解密已加密的内容[^1]。 #### 对称加密 相比之下,在对称加密方案里只存在一把共享的秘密钥匙,既可用于加密也可用于解码相同的信息。下面是一个基于AES算法的例子,它也是通过内置的`crypto`库提供的支持。 ##### AES-CTR模式下的简单示例 ```javascript const crypto = require('crypto'); // 定义一个长度为32字节(即256位)的密钥以及初始化向量IV const secretKey = crypto.randomBytes(32); // 密钥 const iv = crypto.randomBytes(16); // IV function aesEncrypt(text) { var cipher = crypto.createCipheriv('aes-256-ctr', secretKey, iv); var crypted = cipher.update(text,'utf8','hex') crypted += cipher.final('hex'); return crypted; } function aesDecrypt(encryptedText){ var decipher = crypto.createDecipheriv('aes-256-ctr',secretKey, iv) var decrpyted = decipher.update(encryptedText,'hex','utf8') decrpyted += decipher.final('utf8'); return decrpyted; } ``` 这段脚本定义了一组新的工具函数,它们接受纯文本输入并返回经过AES CTR模式处理后的输出,反之亦然。请注意,实际应用中应该妥善保管好密钥和IV值[^5]。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

局外人LZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值