当前位置:首页 > JavaScript

js实现rsa加密

2026-04-04 09:15:22JavaScript

RSA加密的基本原理

RSA是一种非对称加密算法,基于大整数分解的数学难题。它使用公钥加密数据,私钥解密数据,常用于数据传输加密和数字签名。

生成RSA密钥对

使用JavaScript生成RSA密钥对通常需要借助Web Crypto API:

async function generateKeyPair() {
  return await window.crypto.subtle.generateKey(
    {
      name: "RSA-OAEP",
      modulusLength: 2048,
      publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
      hash: "SHA-256"
    },
    true,
    ["encrypt", "decrypt"]
  );
}

公钥加密数据

使用公钥加密字符串数据:

async function encryptData(publicKey, data) {
  const encoded = new TextEncoder().encode(data);
  return await window.crypto.subtle.encrypt(
    {
      name: "RSA-OAEP"
    },
    publicKey,
    encoded
  );
}

私钥解密数据

使用私钥解密加密后的数据:

async function decryptData(privateKey, encryptedData) {
  const decrypted = await window.crypto.subtle.decrypt(
    {
      name: "RSA-OAEP"
    },
    privateKey,
    encryptedData
  );
  return new TextDecoder().decode(decrypted);
}

完整示例流程

async function rsaExample() {
  // 生成密钥对
  const keyPair = await generateKeyPair();

  // 原始数据
  const originalData = "Secret message";

  // 加密
  const encrypted = await encryptData(keyPair.publicKey, originalData);
  console.log("Encrypted:", new Uint8Array(encrypted));

  // 解密
  const decrypted = await decryptData(keyPair.privateKey, encrypted);
  console.log("Decrypted:", decrypted);
}

注意事项

Web Crypto API只能在安全上下文(HTTPS或localhost)中使用。对于Node.js环境,可以使用crypto模块:

const crypto = require('crypto');

function nodeRsaEncrypt(publicKey, data) {
  return crypto.publicEncrypt(
    {
      key: publicKey,
      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
      oaepHash: 'sha256'
    },
    Buffer.from(data)
  );
}

密钥格式处理

实际应用中可能需要处理PEM格式的密钥:

js实现rsa加密

// 从PEM字符串导入公钥
async function importPublicKey(pem) {
  const pemHeader = "-----BEGIN PUBLIC KEY-----";
  const pemFooter = "-----END PUBLIC KEY-----";
  const pemContents = pem.substring(
    pemHeader.length,
    pem.length - pemFooter.length
  );
  const binaryDer = atob(pemContents);
  return await window.crypto.subtle.importKey(
    "spki",
    str2ab(binaryDer),
    { name: "RSA-OAEP", hash: "SHA-256" },
    true,
    ["encrypt"]
  );
}

// 字符串转ArrayBuffer
function str2ab(str) {
  const buf = new ArrayBuffer(str.length);
  const bufView = new Uint8Array(buf);
  for (let i = 0; i < str.length; i++) {
    bufView[i] = str.charCodeAt(i);
  }
  return buf;
}

性能考虑

RSA加密适合加密少量数据(如加密对称密钥)。对于大量数据,建议使用RSA加密对称密钥,再用对称密钥加密数据。

标签: jsrsa
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <htm…