当前位置:首页 > JavaScript

js rsa 实现

2026-03-15 00:48:45JavaScript

RSA 加密算法实现

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

生成密钥对

使用 crypto 模块生成 RSA 密钥对(适用于 Node.js 环境):

js rsa 实现

const crypto = require('crypto');

const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
  modulusLength: 2048,
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem'
  }
});

console.log('Public Key:', publicKey);
console.log('Private Key:', privateKey);

加密数据

使用公钥加密数据:

js rsa 实现

function encryptWithPublicKey(publicKey, data) {
  const bufferData = Buffer.from(data, 'utf8');
  const encrypted = crypto.publicEncrypt(
    {
      key: publicKey,
      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
      oaepHash: 'sha256'
    },
    bufferData
  );
  return encrypted.toString('base64');
}

const encryptedData = encryptWithPublicKey(publicKey, 'Hello, RSA!');
console.log('Encrypted Data:', encryptedData);

解密数据

使用私钥解密数据:

function decryptWithPrivateKey(privateKey, encryptedData) {
  const bufferEncrypted = Buffer.from(encryptedData, 'base64');
  const decrypted = crypto.privateDecrypt(
    {
      key: privateKey,
      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
      oaepHash: 'sha256'
    },
    bufferEncrypted
  );
  return decrypted.toString('utf8');
}

const decryptedData = decryptWithPrivateKey(privateKey, encryptedData);
console.log('Decrypted Data:', decryptedData);

浏览器端实现

在浏览器中可以使用 SubtleCrypto API 实现 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 encoded = new TextEncoder().encode(data);
  const encrypted = await window.crypto.subtle.encrypt(
    {
      name: 'RSA-OAEP'
    },
    publicKey,
    encoded
  );
  return btoa(String.fromCharCode(...new Uint8Array(encrypted)));
}

async function decryptData(privateKey, encryptedData) {
  const buffer = Uint8Array.from(atob(encryptedData), c => c.charCodeAt(0));
  const decrypted = await window.crypto.subtle.decrypt(
    {
      name: 'RSA-OAEP'
    },
    privateKey,
    buffer
  );
  return new TextDecoder().decode(decrypted);
}

// 使用示例
(async () => {
  const keyPair = await generateKeyPair();
  const encrypted = await encryptData(keyPair.publicKey, 'Hello, RSA!');
  const decrypted = await decryptData(keyPair.privateKey, encrypted);
  console.log('Decrypted:', decrypted);
})();

注意事项

  • RSA 加密的数据长度有限制,通常建议加密短数据(如对称密钥)。
  • 在实际应用中,建议结合 AES 等对称加密算法使用 RSA 加密对称密钥。
  • 密钥管理和存储需谨慎,避免私钥泄露。

以上代码提供了 Node.js 和浏览器端的 RSA 实现方案,可根据具体需求选择适合的方式。

标签: jsrsa
分享给朋友:

相关文章

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现选题

js实现选题

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

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…