BSV密钥推导Skill key-derivation

此技能用于BSV(Bitcoin SV)区块链上的密钥推导,包括Type42、BIP32和助记词方法。它提供隐私保护、对方推导和HD钱包兼容性,支持BAP身份和加密密钥生成。关键词:BSV, 密钥推导, Type42, BIP32, 助记词, 区块链, 加密算法, BAP身份, HD钱包, 隐私保护。

加密算法 0 次安装 0 次浏览 更新于 3/15/2026

name: 密钥推导 description: 当用户询问“推导密钥”、“使用Type42”、“使用BRC-42”、“推导子密钥”、“使用BIP32”、“使用HD密钥”、“创建助记词”、“将助记词转换为密钥”、“推导BAP身份密钥”、“推导加密密钥”时,应使用此技能,或提及密钥推导、分层确定性钱包、发票编号或BSV上的子密钥生成。

BSV密钥推导

两种主要的BSV密钥推导方法,加上助记词支持。

快速参考

方法 用例
Type42 (BRC-42) @bsv/sdk 现代:隐私保护、对方推导
BIP32 (BRC-32) @bsv/sdk 传统:HD钱包、顺序路径
助记词 @bsv/sdk 种子短语到主密钥转换

1. Type42密钥推导(推荐)

使用ECDH共享秘密的现代方法。提供增强的隐私和无限密钥推导。

基本用法

import { PrivateKey, PublicKey } from "@bsv/sdk";

const masterKey = PrivateKey.fromWif("L1...");
const counterpartyPubKey = masterKey.toPublicKey(); // 或另一方的密钥

// 使用发票编号推导子密钥
const childKey = masterKey.deriveChild(counterpartyPubKey, "invoice-123");
const childAddress = childKey.toPublicKey().toAddress();

发票编号格式(BRC-43)

对于协议特定的推导,使用格式:{安全级别}-{协议}-{密钥ID}

// BAP身份签名密钥
const bapKey = masterKey.deriveChild(masterKey.toPublicKey(), "1-bap-identity");

// 加密密钥
const encKey = masterKey.deriveChild(masterKey.toPublicKey(), "2-encryption-default");

对方推导

Type42允许在不泄露私钥的情况下在各方之间推导共享密钥:

// Alice为Bob推导密钥
const aliceKey = PrivateKey.fromWif("L1...");
const bobPubKey = PublicKey.fromString("02...");
const sharedKey = aliceKey.deriveChild(bobPubKey, "payment-001");

// Bob使用他的私钥和Alice的公钥推导相同地址
const bobKey = PrivateKey.fromWif("K1...");
const alicePubKey = aliceKey.toPublicKey();
const bobDerived = bobKey.deriveChild(alicePubKey, "payment-001");
// bobDerived.toPublicKey().toAddress() === sharedKey.toPublicKey().toAddress()

关键优势

  • 隐私:ECDH共享秘密防止地址重用检测
  • 灵活性:任何字符串作为发票编号(无2^31限制)
  • 可审计性:仅向特定方揭示共享秘密
  • 无公共推导:相比BIP32增强安全性

2. BIP32 HD密钥推导(传统)

用于兼容性的传统分层确定性推导。

基本用法

import { HD } from "@bsv/sdk";

// 从扩展私钥
const hdKey = HD.fromString("xprv9s21ZrQH143K...");

// 在路径推导子密钥
const child = hdKey.derive("m/44'/0'/0'/0/0");
const address = child.pubKey.toAddress();
const privateKey = child.privKey;

路径格式

  • m = 主密钥
  • 数字 = 子索引(0到2^31-1)
  • 撇号(')= 硬化推导
// 标准钱包路径
const receiving = hdKey.derive("m/44'/236'/0'/0/0");   // BSV接收
const change = hdKey.derive("m/44'/236'/0'/1/0");     // BSV找零

// BAP身份路径
const bapRoot = hdKey.derive("m/424150'/0'/0'");      // 424150 = BAP十进制

从助记词

import { Mnemonic, HD } from "@bsv/sdk";

const mnemonic = Mnemonic.fromString("word1 word2 word3...");
const seed = mnemonic.toSeed();
const hdKey = HD.fromSeed(seed);

3. 助记词到单一主密钥

对于Type42,将助记词转换为单一主密钥(非扩展密钥):

import { Mnemonic, Hash, PrivateKey, Utils } from "@bsv/sdk";
const { toHex } = Utils;

const mnemonic = Mnemonic.fromString("dial tunnel valid cry exhaust...");
const seed = mnemonic.toSeed();

// SHA256种子产生256位私钥
const keyBytes = Hash.sha256(seed);
const masterKey = PrivateKey.fromString(toHex(keyBytes), "hex");

// 与Type42推导使用
const childKey = masterKey.deriveChild(masterKey.toPublicKey(), "bap:0");

这种方法:

  • 保持熟悉的助记词备份
  • 为Type42产生单一密钥(非HD扩展密钥)
  • 与现有BIP39助记词兼容

选择方法

场景 推荐
新钱包/身份系统 Type42
隐私保护支付 Type42
对方密钥协议 Type42
传统钱包兼容性 BIP32
顺序地址生成 BIP32
从现有HD钱包迁移 两者(见迁移)

BAP身份密钥推导

BAP使用两级推导层次:

// 级别1:从路径的成员密钥
const memberKey = masterKey.deriveChild(masterKey.toPublicKey(), "bap:0");

// 级别2:使用BAP发票编号的身份签名密钥
const signingKey = memberKey.deriveChild(memberKey.toPublicKey(), "1-bap-identity");
const signingAddress = signingKey.toPublicKey().toAddress();

对于BIP32传统:

const memberHD = hdKey.derive("m/424150'/0'/0'/0/0/0");
// 然后应用Type42用于签名密钥
const signingKey = memberHD.privKey.deriveChild(memberHD.pubKey, "1-bap-identity");

安全考虑

  1. 从不暴露主密钥:为操作推导子密钥
  2. 使用硬化路径用于BIP32当隐私重要时(撇号)
  3. Type42防止公共推导:不能仅从父公钥推导子公钥
  4. 发票编号不保密:它们可以共享

bsv-bap库

bsv-bap库使用BRC-43发票编号为BAP身份实现Type42:

import { BAP } from "bsv-bap";
import { PrivateKey } from "@bsv/sdk";

const bap = new BAP({ rootPk: PrivateKey.fromRandom().toWif() });
const identity = bap.newId("Alice");

// 使用“1-bap-identity”推导的签名密钥
const { address, signature } = identity.signMessage(messageBytes);

// 使用“2-friend-{sha256(friendBapId)}”推导的朋友加密密钥
const friendPubKey = identity.getEncryptionPublicKeyWithSeed(friendBapId);
const ciphertext = identity.encryptWithSeed("secret", friendBapId);

CLI也可用:npm install -g bsv-bap(见**create-bap-identity**技能)。

官方规范

所有BSV密钥推导标准文档位于:

https://bsv.brc.dev/key-derivation

关键规范:

  • BRC-42:Type42密钥推导方案
  • BRC-32:BIP32 HD密钥推导
  • BRC-43:安全级别、协议ID、密钥ID
  • BRC-69:揭示密钥链接
  • BRC-72:保护密钥链接信息

额外资源

参考文件

  • references/brc-42-type42.md - 完整Type42规范和高级模式
  • references/brc-32-bip32.md - BIP32传统推导细节
  • references/bap-derivation.md - BAP身份密钥推导模式和迁移

示例

  • examples/type42-derivation.ts - Type42对方密钥推导
  • examples/bip32-wallet.ts - BIP32 HD钱包与标准路径
  • examples/mnemonic-to-type42.ts - 将助记词转换为Type42主密钥