当前位置:首页 > JavaScript

js实现rsa

2026-03-14 11:39:45JavaScript

RSA 加密算法实现

RSA 是一种非对称加密算法,广泛用于数据加密和数字签名。以下是 JavaScript 实现 RSA 加密和解密的方法。

生成 RSA 密钥对

使用 crypto.subtle.generateKey 方法生成 RSA 密钥对:

js实现rsa

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

加密数据

使用公钥加密数据:

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

解密数据

使用私钥解密数据:

js实现rsa

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

导出和导入密钥

导出公钥:

async function exportPublicKey(publicKey) {
  const exported = await window.crypto.subtle.exportKey("spki", publicKey);
  return window.btoa(String.fromCharCode(...new Uint8Array(exported)));
}

导入公钥:

async function importPublicKey(keyBase64) {
  const binaryKey = Uint8Array.from(atob(keyBase64), c => c.charCodeAt(0));
  const publicKey = await window.crypto.subtle.importKey(
    "spki",
    binaryKey,
    {
      name: "RSA-OAEP",
      hash: "SHA-256",
    },
    true,
    ["encrypt"]
  );
  return publicKey;
}

完整示例

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

  // 导出公钥
  const publicKeyBase64 = await exportPublicKey(keyPair.publicKey);
  console.log("Public Key:", publicKeyBase64);

  // 加密数据
  const encrypted = await encryptData(keyPair.publicKey, "Hello RSA!");
  console.log("Encrypted Data:", encrypted);

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

runExample();

注意事项

  • RSA 加密有长度限制,通常不超过密钥长度减去填充字节数
  • 对于大数据加密,建议使用对称加密算法如 AES,再用 RSA 加密对称密钥
  • 实际应用中应妥善保管私钥,避免泄露
  • Web Crypto API 仅在安全上下文(HTTPS 或 localhost)中可用

以上代码使用了现代浏览器支持的 Web Crypto API,无需额外库即可实现 RSA 加密功能。

标签: jsrsa
分享给朋友:

相关文章

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js树实现

js树实现

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

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…