当前位置:首页 > 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实现图片轮播

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

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…