当前位置:首页 > JavaScript

js ecdh实现

2026-02-01 15:06:03JavaScript

ECDH 密钥交换实现

ECDH(Elliptic Curve Diffie-Hellman)是一种基于椭圆曲线的密钥交换算法,用于在不安全的通信信道上安全地协商共享密钥。以下是使用 JavaScript 实现 ECDH 密钥交换的步骤。

生成密钥对

使用 Web Crypto API 生成 ECDH 密钥对。需要指定椭圆曲线名称(如 P-256、P-384 或 P-521)。

async function generateKeyPair() {
  const keyPair = await window.crypto.subtle.generateKey(
    {
      name: "ECDH",
      namedCurve: "P-256",
    },
    true,
    ["deriveKey", "deriveBits"]
  );
  return keyPair;
}

导出公钥

将生成的公钥导出为可传输的格式(如 JWK 或 ArrayBuffer)。

js ecdh实现

async function exportPublicKey(publicKey) {
  const exported = await window.crypto.subtle.exportKey("jwk", publicKey);
  return exported;
}

导入公钥

将接收到的公钥导入为 CryptoKey 对象,以便用于密钥派生。

async function importPublicKey(jwkKey) {
  const publicKey = await window.crypto.subtle.importKey(
    "jwk",
    jwkKey,
    {
      name: "ECDH",
      namedCurve: "P-256",
    },
    true,
    []
  );
  return publicKey;
}

派生共享密钥

使用本地私钥和对方的公钥派生共享密钥。

js ecdh实现

async function deriveSharedSecret(privateKey, publicKey) {
  const sharedSecret = await window.crypto.subtle.deriveBits(
    {
      name: "ECDH",
      public: publicKey,
    },
    privateKey,
    256
  );
  return sharedSecret;
}

完整示例

以下是一个完整的 ECDH 密钥交换示例:

async function runECDHExchange() {
  // Alice 生成密钥对
  const aliceKeyPair = await generateKeyPair();
  const alicePublicKey = await exportPublicKey(aliceKeyPair.publicKey);

  // Bob 生成密钥对
  const bobKeyPair = await generateKeyPair();
  const bobPublicKey = await exportPublicKey(bobKeyPair.publicKey);

  // Alice 使用 Bob 的公钥派生共享密钥
  const bobPublicKeyImported = await importPublicKey(bobPublicKey);
  const aliceSharedSecret = await deriveSharedSecret(aliceKeyPair.privateKey, bobPublicKeyImported);

  // Bob 使用 Alice 的公钥派生共享密钥
  const alicePublicKeyImported = await importPublicKey(alicePublicKey);
  const bobSharedSecret = await deriveSharedSecret(bobKeyPair.privateKey, alicePublicKeyImported);

  // 验证共享密钥是否相同
  const aliceArray = new Uint8Array(aliceSharedSecret);
  const bobArray = new Uint8Array(bobSharedSecret);
  console.log("Shared secrets match:", arraysEqual(aliceArray, bobArray));
}

function arraysEqual(a, b) {
  if (a.length !== b.length) return false;
  for (let i = 0; i < a.length; i++) {
    if (a[i] !== b[i]) return false;
  }
  return true;
}

runECDHExchange();

注意事项

  • 确保使用安全的椭圆曲线(如 P-256、P-384 或 P-521)。
  • 在实际应用中,公钥需要通过安全的方式传输(如 TLS)。
  • 派生出的共享密钥可以用于对称加密(如 AES-GCM)或其他用途。

兼容性

Web Crypto API 在现代浏览器中广泛支持,但在 Node.js 中需要使用 crypto 模块或其他库(如 node-forge)。以下是在 Node.js 中的实现示例:

const crypto = require('crypto');

function generateKeyPair() {
  const alice = crypto.createECDH('secp256k1');
  alice.generateKeys();
  const bob = crypto.createECDH('secp256k1');
  bob.generateKeys();

  const aliceSecret = alice.computeSecret(bob.getPublicKey());
  const bobSecret = bob.computeSecret(alice.getPublicKey());

  console.log('Shared secrets match:', aliceSecret.equals(bobSecret));
}

generateKeyPair();

标签: jsecdh
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js轮播图实现原理

js轮播图实现原理

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

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js怎么实现异步

js怎么实现异步

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