当前位置: 首页 > news >正文

JS实现RSA加密

目录

目标

环境

实现RSA加解密

计算RSA加密允许的最大字节长度


目标

  1. 使用JS实现RSA加密解密。
  2. 计算RSA加密允许的最大字节长度。

环境

        node-rsa


实现RSA加解密

const NodeRSA = require('node-rsa');function getKey() {const keyLength=512// 创建 RSA 密钥对const key = new NodeRSA({b: keyLength}); // 512位密钥长度(你可以根据需要增加位数)const publicKey = key.exportKey('public');const privateKey = key.exportKey('private');return {"publicKey": publicKey,"privateKey": privateKey};
}/*** 加密函数* @param plaintext 明文* @param publicKey 公钥* @returns {string|Buffer} 加密后的数据(Base64 编码)*/
function encrypt(plaintext, publicKey) {const key = new NodeRSA(publicKey);// 使用 PKCS#1 v1.5 填充加密,并返回 Base64 编码return key.encrypt(plaintext, 'base64', {encryptionScheme: 'pkcs1'});
}/*** 解密函数* @param encryptedData 密文* @param privateKey 私钥* @returns {string} 解密后的明文*/
function decrypt(encryptedData, privateKey) {const key = new NodeRSA(privateKey);// 使用 PKCS#1 v1.5 填充解密return key.decrypt(encryptedData, 'utf8', {encryptionScheme: 'pkcs1'});
}// 获取公钥和私钥
const keyObject = getKey();// 输出公钥和私钥
console.log("公钥:\n", keyObject.publicKey);
console.log("私钥:\n", keyObject.privateKey);// 要加密的明文
const plaintext = "hello world! 你好";// 加密
const encryptData = encrypt(plaintext, keyObject.publicKey);
console.log("加密结果:", encryptData);// 解密
const decryptData = decrypt(encryptData, keyObject.privateKey);
console.log("解密结果:", decryptData);

计算RSA加密允许的最大字节长度

function getMaxEncryptableBytes(keyLength, paddingType) {// 将密钥长度从位转换为字节,就是除以8。const keyLengthInBytes = keyLength >> 3;// 根据填充类型决定填充长度let paddingLength = 0;switch (paddingType.toUpperCase()) {case 'PKCS1':paddingLength = 11; // PKCS#1 v1.5 填充break;case 'OAEP':paddingLength = 42; // OAEP 填充break;case 'PSS':paddingLength = 42; // PSS 填充(假设)break;case 'NONE':paddingLength = 0;  // 无填充break;default:throw new Error('未知的填充类型');}// 计算最大可加密字节数return keyLengthInBytes - paddingLength;
}console.log(getMaxEncryptableBytes(512,"PKCS1"))

相关文章:

  • 高共模干扰场景下电压检测技术革新——光电隔离方案解析
  • docker占用磁盘100%
  • 富勒 (Fuller) 投影
  • DNS优选 2.6.3 | 解锁专业版,优选最快NDS,访问受限网站
  • 在高数据速度下确保信号完整性的 10 个关键策略
  • Face Swap 1.3.8| 解锁专业版,无限制换脸,视频换脸,释放您的创造力
  • Spring 中的验证、数据绑定和类型转换
  • 信号的传输方式
  • Mybatis--XML映射文件配置和动态SQL
  • linux 学习 1.开始学习
  • Freertos----信号量
  • 【技术派后端篇】Redis分布式锁:原理、实践与应用
  • DS-SLAM 运动一致性检测的源码解读
  • 企业合规风险高、运营不稳定,要怎么解决?
  • AI应用开发之扣子第二课-AI翻译(第1节/共2节)
  • ESP32-idf学习(二)esp32C3作服务端与电脑蓝牙数据交互
  • 【Vue生命周期的演变:从Vue 2到Vue 3的深度剖析】
  • 山东大学软件学院创新项目实训开发日志(17)之中医知识历史问答历史对话查看功能完善
  • Yocto项目实战教程 · 第4章:4.1小节元数据
  • Linux操作系统学习之---进程状态
  • 传奇落幕!波波维奇卸任马刺队主教练,转型全职球队总裁
  • 网红“丢那猩”丢石块闯祸,起哄游客难逃责任
  • 擦亮“世界美食之都”金字招牌,淮安的努力不止于餐桌
  • 2025年度中国青年五四奖章暨新时代青年先锋奖评选揭晓
  • “ChatGPT严选”横空出世了,“DeepSeek严选”还要等多久?
  • 哈莉·贝瑞、洪常秀等出任戛纳主竞赛单元评委