当前位置:首页 > JavaScript

js rsa 实现

2026-04-06 18:30:25JavaScript

RSA 加密算法实现

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

生成 RSA 密钥对

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

js rsa 实现

async function generateRSAKeyPair() {
  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;
}
  • modulusLength: 密钥长度,通常为 2048 或 4096。
  • publicExponent: 公钥指数,默认使用 [0x01, 0x00, 0x01](即 65537)。
  • hash: 哈希算法,支持 SHA-1、SHA-256、SHA-384 或 SHA-512。

加密数据

使用公钥加密数据:

js rsa 实现

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;
}
  • data: 需要加密的字符串或二进制数据。
  • 返回的 encryptedDataArrayBuffer 类型。

解密数据

使用私钥解密数据:

async function decryptData(privateKey, encryptedData) {
  const decryptedData = await window.crypto.subtle.decrypt(
    {
      name: "RSA-OAEP",
    },
    privateKey,
    encryptedData
  );
  return new TextDecoder().decode(decryptedData);
}
  • encryptedData: 加密后的 ArrayBuffer 数据。
  • 返回解密后的原始字符串。

导出和导入密钥

导出公钥

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

导入公钥

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

导出私钥

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

导入私钥

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

示例代码

以下是一个完整的 RSA 加密解密示例:

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

  // 导出公钥和私钥
  const publicKeyBase64 = await exportPublicKey(keyPair.publicKey);
  const privateKeyBase64 = await exportPrivateKey(keyPair.privateKey);

  console.log("Public Key:", publicKeyBase64);
  console.log("Private Key:", privateKeyBase64);

  // 加密数据
  const originalData = "Hello, RSA!";
  const encryptedData = await encryptData(keyPair.publicKey, originalData);

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

runRSADemo();

注意事项

  1. 密钥长度:RSA 密钥长度至少为 2048 位以确保安全性。
  2. 性能:RSA 加密和解密操作较慢,不适合加密大量数据。
  3. 浏览器支持crypto.subtle API 在现代浏览器中支持较好,但在某些旧版本中可能不可用。
  4. 密钥存储:私钥必须安全存储,避免泄露。

如果需要更高级的功能(如签名和验证),可以使用 signverify 方法。

标签: jsrsa
分享给朋友:

相关文章

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js实现弹框

js实现弹框

使用 alert 实现简单弹框 JavaScript 的 alert 方法可以直接显示一个简单的弹框,内容为纯文本: alert("这是一个简单的弹框"); 使用 confirm 实现确认弹框…

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…

js实现同步

js实现同步

同步与异步的概念 在JavaScript中,同步代码会按照顺序执行,每一行代码必须等待上一行代码执行完成后才能运行。异步代码则允许在等待某些操作(如网络请求)完成的同时继续执行其他代码。 实现同步的…