当前位置: 首页 > 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"))
http://www.xdnf.cn/news/5527.html

相关文章:

  • Redis面试——日志
  • 《Java 泛型的作用与常见用法详解》
  • 【Linux】第九章 控制服务和守护进程
  • iptables 防火墙
  • JUC学习(1) 线程和进程
  • Springboot 自动装配原理是什么?SPI 原理又是什么?
  • 《AI大模型应知应会100篇》第23篇:角色扮演技巧:让AI成为你需要的专家
  • 【英语语法】基本句型
  • Redis面试——常用命令
  • webgl入门实例-09索引缓冲区示例
  • BH1750光照传感器---附代码
  • java + spring boot + mybatis 通过时间段进行查询
  • 【JavaScript】二十四、JS的执行机制事件循环 + location + navigator + history
  • 基于尚硅谷FreeRTOS视频笔记——13—HAL库和RTOS时钟源问题
  • UE学习记录part18
  • Java锁的分类与解析
  • LeetCode算法题(Go语言实现)_51
  • Vue3如何选择传参方式
  • C++面试
  • 【HDFS入门】HDFS核心配置与优化指南概述
  • 【Python学习笔记】Pandas实现Excel质检记录表初审、复核及质检统计
  • webgl入门实例-08索引缓冲区的基本概念
  • 杂记-LeetCode中部分题思路详解与笔记-HOT100篇-其三
  • 二分查找-LeetCode
  • 代码学习总结(三)
  • 算法5-16 对二进制字符串解码
  • 多 Agent 协作怎么整:从谷歌A2A到多Agent交互方案实现
  • STL简介(了解)
  • 【无标题】
  • Qt核心知识总结