当前位置:首页 > JavaScript

js实现rsa

2026-03-14 11:39:45JavaScript

RSA 加密算法实现

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

生成 RSA 密钥对

使用 crypto.subtle.generateKey 方法生成 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;
}

解密数据

使用私钥解密数据:

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)));
}

导入公钥:

js实现rsa

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实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js实现选项卡

js实现选项卡

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

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…