当前位置:首页 > JavaScript

js实现ecdh

2026-03-15 02:29:15JavaScript

ECDH 密钥交换的 JavaScript 实现

ECDH(椭圆曲线 Diffie-Hellman)是一种基于椭圆曲线密码学的密钥交换协议。以下是使用 Web Crypto API 在 JavaScript 中实现 ECDH 密钥交换的方法。

生成密钥对

使用 generateKey 方法生成 ECDH 密钥对。需要指定椭圆曲线名称(如 P-256)和密钥用途。

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

导出公钥

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

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

派生共享密钥

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

const deriveSharedSecret = async (privateKey, publicKey) => {
  return await window.crypto.subtle.deriveKey(
    {
      name: "ECDH",
      public: publicKey,
    },
    privateKey,
    {
      name: "AES-GCM",
      length: 256,
    },
    true,
    ["encrypt", "decrypt"]
  );
};

完整示例流程

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

js实现ecdh

(async () => {
  // 双方生成密钥对
  const aliceKeyPair = await generateKeyPair();
  const bobKeyPair = await generateKeyPair();

  // 交换公钥
  const alicePublicKey = await exportPublicKey(aliceKeyPair.publicKey);
  const bobPublicKey = await exportPublicKey(bobKeyPair.publicKey);

  // 导入对方公钥
  const importedAlicePublicKey = await window.crypto.subtle.importKey(
    "jwk",
    alicePublicKey,
    {
      name: "ECDH",
      namedCurve: "P-256",
    },
    true,
    []
  );

  const importedBobPublicKey = await window.crypto.subtle.importKey(
    "jwk",
    bobPublicKey,
    {
      name: "ECDH",
      namedCurve: "P-256",
    },
    true,
    []
  );

  // 派生共享密钥
  const aliceSharedSecret = await deriveSharedSecret(
    aliceKeyPair.privateKey,
    importedBobPublicKey
  );
  const bobSharedSecret = await deriveSharedSecret(
    bobKeyPair.privateKey,
    importedAlicePublicKey
  );

  // 验证双方密钥是否相同
  const aliceExported = await window.crypto.subtle.exportKey("raw", aliceSharedSecret);
  const bobExported = await window.crypto.subtle.exportKey("raw", bobSharedSecret);

  console.log(
    "Shared secrets match:",
    new Uint8Array(aliceExported).toString() ===
      new Uint8Array(bobExported).toString()
  );
})();

注意事项

  • 使用安全的椭圆曲线(如 P-256、P-384 或 P-521)
  • 确保正确处理密钥的导入导出格式
  • 共享密钥可用于后续加密通信(如 AES 加密)
  • 浏览器兼容性:Web Crypto API 在现代浏览器中得到广泛支持

这种方法提供了原生、高效的 ECDH 实现,无需依赖第三方库。对于 Node.js 环境,可以使用 crypto 模块的类似功能。

标签: jsecdh
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现选题

js实现选题

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

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…