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

如何在React Native中加载Bitcoin Core生成的加密wallet.dat文件?

在React Native中加载加密的Bitcoin Core wallet.dat文件

Bitcoin Core生成的wallet.dat是Berkeley DB(BDB)4.8格式的数据库,加密状态下私钥通过AES-256-CBC加密存储,你之前的正则匹配函数只能识别未加密钱包里的明文私钥,对加密钱包完全无效,以下是可行的处理方案:

核心步骤说明

  1. 解析BDB格式的wallet.dat
    wallet.dat不是纯文本文件,而是BDB数据库,需要先读取其中的核心条目(比如存储加密密钥的encryptionkey、存储私钥的key条目)。在React Native中可以通过以下方式实现:

    • 引入buffer polyfill处理字节流
    • 使用兼容React Native的BDB解析库(如bdb,需适配Node.js模块到RN环境),或通过原生模块调用平台原生的BDB读取能力
  2. 解密流程(匹配Bitcoin Core加密逻辑)
    加密钱包的私钥解密依赖用户输入的密码,遵循以下标准流程:

    • 从BDB中读取encryptionkey条目,解析出salt、迭代次数、加密的主密钥
    • 用密码+salt+迭代次数,通过PBKDF2-HMAC-SHA512生成派生密钥
    • 用派生密钥解密主密钥
    • 用主密钥解密每个key条目里的加密私钥,最后解析ASN.1格式得到明文私钥

示例代码(简化版)

import { Buffer } from 'buffer';
import CryptoJS from 'crypto-js';
import asn1 from 'asn1.js';

// 定义Bitcoin Core encryptionkey的ASN.1结构
const EncryptionKey = asn1.define('EncryptionKey', function() {
  this.seq().obj(
    this.key('version').int(),
    this.key('salt').octstr(),
    this.key('iterations').int(),
    this.key('encryptedMasterKey').octstr()
  );
});

async function decryptEncryptedWallet(bdbData, password) {
  // 1. 从BDB数据中提取核心条目(此处需替换为实际的BDB读取逻辑)
  const encryptionKeyEntry = bdbData.get('encryptionkey');
  const encryptedPrivateKeyEntry = bdbData.get('key');

  if (!encryptionKeyEntry || !encryptedPrivateKeyEntry) {
    throw new Error('Invalid wallet.dat structure');
  }

  // 2. 解析encryptionkey的ASN.1结构
  const parsedEncKey = EncryptionKey.decode(Buffer.from(encryptionKeyEntry), 'der');
  const salt = parsedEncKey.salt;
  const iterations = parsedEncKey.iterations.toNumber();
  const encryptedMasterKey = parsedEncKey.encryptedMasterKey;

  // 3. 生成PBKDF2派生密钥
  const derivedKey = CryptoJS.PBKDF2(
    password,
    CryptoJS.lib.WordArray.create(salt),
    {
      keySize: 512 / 32,
      iterations: iterations,
      hasher: CryptoJS.algo.SHA512
    }
  );

  // 4. 解密主密钥(Bitcoin Core用AES-256-CBC,IV为encryptedMasterKey前16字节)
  const iv = encryptedMasterKey.slice(0, 16);
  const encryptedKeyData = encryptedMasterKey.slice(16);
  const masterKey = CryptoJS.AES.decrypt(
    { ciphertext: CryptoJS.lib.WordArray.create(encryptedKeyData) },
    derivedKey,
    { iv: CryptoJS.lib.WordArray.create(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
  );

  // 5. 解密私钥条目
  const privKeyIv = encryptedPrivateKeyEntry.slice(0, 16);
  const privKeyData = encryptedPrivateKeyEntry.slice(16);
  const decryptedPrivKey = CryptoJS.AES.decrypt(
    { ciphertext: CryptoJS.lib.WordArray.create(privKeyData) },
    CryptoJS.lib.WordArray.create(masterKey.words),
    { iv: CryptoJS.lib.WordArray.create(privKeyIv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
  );

  // 6. 解析ASN.1格式的私钥,提取32字节的EC私钥
  const privKeyBuffer = Buffer.from(decryptedPrivKey.toString(), 'hex');
  const privKeyMatch = privKeyBuffer.toString('hex').match(/3081d30201010420([a-f0-9]{64})/);
  
  if (privKeyMatch) {
    return { privateKey: privKeyMatch[1] };
  }
  throw new Error('Failed to extract private key from decrypted data');
}

关键注意事项

  • 环境适配:React Native中需配置metro.config.js以支持buffer、asn1.js等Node.js模块,建议使用react-native-crypto替代crypto-js获得更接近原生的加密性能
  • 性能优化:PBKDF2迭代次数默认10万次,移动端解密可能卡顿,需将解密逻辑放在后台线程执行(如使用react-native-background-fetch)
  • 安全性:密码输入需避免明文存储,解密后的私钥要在内存中及时销毁,防止泄露

内容的提问来源于stack exchange,提问作者shaikh riyazuddin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:39:42