You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript/Node.js将Hedera测试网ED25519私钥从十六进制转DER编码?

在JavaScript/Node.js中转换Hedera ED25519私钥为DER编码

核心原理

ED25519私钥的DER编码有固定的ASN.1序列结构,对应你给出的预期格式:

  • 固定前缀:302e020100300506032b657004220420
  • 后缀:你的32字节ED25519私钥的十六进制字符串

前缀的ASN.1解析:

  • 302e:SEQUENCE(序列),总长度46字节
  • 020100:版本号(INTEGER),值为0
  • 3005:算法标识序列,长度5字节
    • 06032b6570:ED25519的OID(1.3.101.112)
  • 0422:私钥数据的Octet String,长度34字节
    • 0420:内层Octet String,长度32字节(对应ED25519私钥标准长度)

原生Node.js实现(无依赖)

直接通过Buffer处理十六进制字符串拼接,简单可靠:

function hexEd25519ToDer(hexPrivateKey) {
  // 验证输入长度:ED25519私钥是32字节,对应64个十六进制字符
  if (hexPrivateKey.length !== 64) {
    throw new Error("ED25519私钥必须是64位十六进制字符串");
  }
  // 固定DER前缀
  const derPrefix = "302e020100300506032b657004220420";
  // 拼接前缀和私钥,返回最终DER十六进制字符串
  return derPrefix + hexPrivateKey.toLowerCase();
}

// 示例使用
const inputKey = "6c91776d90126ce548ac1a399cc174383483d54874297d0f8d083aaXXXXXXXX";
const derKey = hexEd25519ToDer(inputKey);
console.log(derKey);
// 输出:302e020100300506032b6570042204206c91776d90126ce548ac1a399cc174383483d54874297d0f8d083aaXXXXXXXX

第三方库实现(更严谨)

如果需要更严谨的ASN.1编码验证,推荐使用Hedera生态常用的@noble/ed25519安全库:

首先安装依赖:

npm install @noble/ed25519

然后编写代码:

import { utils } from "@noble/ed25519";

function hexEd25519ToDer(hexPrivateKey) {
  // 把十六进制转成Uint8Array
  const privateKeyBytes = utils.hexToBytes(hexPrivateKey);
  if (privateKeyBytes.length !== 32) {
    throw new Error("ED25519私钥必须是32字节");
  }
  // 按ASN.1格式拼接DER结构
  const derSequence = new Uint8Array([
    0x30, 0x2e, // SEQUENCE, length 46
    0x02, 0x01, 0x00, // INTEGER (version) 0
    0x30, 0x05, // SEQUENCE (algorithm ID) length 5
    0x06, 0x03, 0x2b, 0x65, 0x70, // OID 1.3.101.112 (ED25519)
    0x04, 0x22, // OCTET STRING length 34
    0x04, 0x20, // OCTET STRING length 32 (private key)
    ...privateKeyBytes
  ]);
  // 转成十六进制字符串
  return utils.bytesToHex(derSequence);
}

// 示例使用
const inputKey = "6c91776d90126ce548ac1a399cc174383483d54874297d0f8d083aaXXXXXXXX";
const derKey = hexEd25519ToDer(inputKey);
console.log(derKey);

注意事项

  • 输入的十六进制字符串不区分大小写,输出的DER字符串默认用小写,如需大写可调用toUpperCase()转换。
  • 确保输入的私钥是纯32字节ED25519私钥,如果带有0x前缀或额外字节,需要先去除再转换。

内容的提问来源于stack exchange,提问作者Giuseppe Bertone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:12:36